[电子书制作]Excel催化剂输出内容汇总PDF及Word版本分享

Excel催化剂在2018年开始,陆续写出了230+篇高质量原创性文章,将Excel催化剂插件的开发过程及使用方法全方位地通过文字的方式给广大网友们分享了。

电子书下载方式

同样地,为了减少大家过多繁琐的资料下载途径,电子书的下载路径和之前插件的下载路径不变,在公众号后台回复【插件下载】即可找到下载链接。

640?wx_fmt=png

电子书做了PDF版和WORD版本,在PDF版本中,阅读体验更佳,在WORD版本中编辑和查找体验更佳,大家按各自所需下载即可。

640?wx_fmt=png

授之以鱼不如授之以渔

相信广大读者们,对制作电子书的整个过程也是有兴趣的,按Excel催化剂的一贯作风,无保留所有制作技术细节给大家作一分享,希望可以带给大家更多的授之以渔的喜悦。

看过前面的推文的朋友们,应该对之前介绍的方法还有所印象吧,有兴趣的不妨回翻一下。

[技术实现]一口气整理整个专集网页为一本电子书方法 - 简书 https://www.jianshu.com/p/aa7ae413136a

但非常遗憾地是,用之前的方法套在Excel催化剂的230+篇文章的合并汇总时,总是难以实现所需的效果。

一路的技术实现挫折之旅

用selenium下载网页下来,通过wkhtmltopdf工具转成的pdf,仍然是图片显示不出来,没有图片的方案绝对不是一个最终的方案。

而下载文章从简书平台上来到微信公众号的文章,同样下载后,一样是图片问题不能显示,微信公众号网页下载后,图片文件被省略了后缀名,没法在html页面上重新渲染出来。

640?wx_fmt=png
640?wx_fmt=png

接着换了个方案,因为所有的文章都是在简书平台上写出来的,用的是markdown格式来写,前端网页看到的效果是已经渲染过的。所以就考虑了直接下载简书上的markdown格式原文下来。

为了防止文件名有不合法字符,用了序号的方式命名,再用映射表来配对。

640?wx_fmt=png

640?wx_fmt=png

网络上大量介绍markdown转html或pdf的文章,尝试着去学习了一翻,知道了pandoc这个文档转换神器。

在网络上的教程中,大量的方法是mac和linux系统下的方法,这真难为了普通用户,注定这些方法很难让我们一般人去接触和使用。

最为糟糕地是我们的中文问题,许多教程都指向了需要下载其他组件来应对中文显示不出的问题,而这些文章都只是类同性地出处一致,指向mac和linux系统的实现方式。

最后偶然间看到一篇文章提到,大家所说的pandoc中文问题需要xelatex引擎的事情,只是极个别markdown里带有复杂的公式才需要,若普通的文档,用之前的wkhtmltopdf引擎即可。

就这样,选择比努力重要,方向对了,就没再受中文问题困扰,用wkhtmltopdf引擎少量测试的确成功了。

pandoc "224.md","225.md","226.md","227.md","228.md" --pdf-engine wkhtmltopdf --css test.css  -o test.pdf 

很不幸的是,在整理好所需转换的文件集后,例如Excel催化剂功能介绍写了100+篇,把所有文件都输出到一个PDF或WORD文件中时,最后的结果是只能转换100多页的数据,20多篇的文章,剩下的就不显示了。

这样的结果,显然不是想要的,一个合集还要分在多个PDF或WORD里,对搜索的体验太差了。

柳暗花明之使用Typora软件实现markdown转PDF或WORD格式

Typora是一款现成的软件,用于markdown方书写和浏览功能,之前有听朋友介绍过,没有认真去研究过它的所有能力。

同时它也是免费的软件,不必心里老过意不去用盗版软件。

一开始看到有人提到过它可以将markdown格式导出PDF格式,没当回事,毕竟我的场景是多个markdown格式的文件来转。

后来想想,markdown格式就是文本格式文件,文本文件的合并也是很容易的事,在自己作文本清洗的过程中,顺带合并一下很轻松,合并后一试,出人意外的惊喜,完成没卡死,完全显示正常,格式和图片都正常。

转换好的PDF文件,含书签,600多页也非常快就转换完成。

640?wx_fmt=png
640?wx_fmt=png

markdown的文本格式文件,比起其他文件来说,处理起来非常流畅,使用了几轮正则替换功能,将之前文章写得不规范和有结尾冗余的自我介绍内容一并清除掉,留下非常清爽的内容。

清理代码如下:

        private static void 清洗简书markdown(){foreach (var item in Directory.EnumerateFiles(@"E:\简书文章", "*.md")){string content = File.ReadAllText(item);RegexOptions optionsMultiline = RegexOptions.Multiline;string result = Regex.Replace(content, @"^#{1,6}(?=[\w])", new MatchEvaluator(s => "\r\n" + s.Value + " "), optionsMultiline);//早期的#写的不规范,没有空一个格子result = Regex.Replace(result, @"(\r\n){3}", "\r\n\r\n");//多行空白转一行result = Regex.Replace(result, @"^#{1,6} 系列文章[\s\S]+?(?=^#)", "", optionsMultiline);//早期插入的系列文章result = Regex.Replace(result, @"### 系列文章[\s\S]+", "");//后期插入的系列文章,删除系列文章以后的内容result = Regex.Replace(result, @"#{1,6} 关于Excel催化剂[\s\S]+", "");//删除关于Excel催化剂以后的内容result = Regex.Replace(result, @"#{1,6} 技术交流QQ群[\s\S]+", "");//删除技术交流QQ群以后的内容File.WriteAllText(Path.Combine(@"E:\简书文章-已处理", Path.GetFileName(item)), result);}}

使用Typora唯一的小遗憾是图片中的图注信息,怎么弄都弄不回来,这个只能在自己日后写markdown文章时,尽量少在图片上写备注图注信息来避免了。

 结语

技术的路上,坑很多,很幸运,在自己想做的事情上,最终还是完成了,在网络上教程不全和有不足的方案中,经过自己的组合,最终实现了没有太复杂、高深的技术,也能达成自己想要的最终效果,是一件非常愉悦的事情。

希望Excel催化剂所输出的这一系列内容,也能带给读者们一些些的小收获,避开一些坑,同时收获一些自己将想要的东西实现出来的喜悦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll文件

原文链接: Deep-dive into .NET Core primitives: deps.json, runtimeconfig.json, and dlls作者: Nate McMasterC#编译器(The C# Compiler)C#的编译器可以将cs文件转换为dll文件, 即程序集文件。程序集文件是一个便携的可执行格式文件, 借助.NET Core,它…

C# 8.0 的默认接口方法

例子直接看例子有这样一个接口: 然后有三个它的实现类: 然后在main方法里面调用: 截至目前,程序都可以成功的编译和运行。 IPerson接口变更 突然,我想对所有的人类添加一个新的特性,例如,添加一…

convolutional layer 源代码

http://blog.csdn.net/xizero00/article/details/51049858 一、 卷积层的作用简介 卷积层是深度神经网络中的一个重要的层,该层实现了局部感受野,通过这种局部感受野,可以有效地降低参数的数目。我们将结合caffe来讲解具体是如何实现卷积层的…

在.net core3.0中使用SignalR实现实时通信

最近用.net core3.0重构网站,老大想做个站内信功能,就是有些耗时的后台任务的结果需要推送给用户。一开始我想简单点,客户端每隔1分钟调用一下我的接口,看看是不是有新消息,有的话就告诉用户有新推送,但老大…

活动最后72小时:购书优惠劵,折后再折,赶紧来抢啊

1024程序员节当当网计算机图书每满100减50!满200减100!满300-150!机械工业出版社华章公司联合当当网特意为【DotNET技术圈】用户申请了一批可与满减叠加使用的“满200减30”的图书优惠码,优惠码使用后相当于:400减230 …

C# 8 新特性 - using 声明

using语句块 尽管.NET Core运行时有垃圾收集器(GC)来负责内存清理工作,但是我们还是要自己确保当非托管资源不再使用的时候应该被清理掉。以前针对实现了IDisposable接口的对象,我们经常会使用using 语句块来这样做: 这…

.Net Core3.0依赖注入DI

构建ASP.NET Core应用程序的时候,依赖注入已成为了.NET Core的核心,这篇文章,我们理一理依赖注入的使用方法。不使用依赖注入首先,我们创建一个ASP.NET Core Mvc项目,定义个表达的爱服务接口,中国小伙类实现…

.Net轻量状态机Stateless

很多业务系统开发中,不可避免的会出现状态变化,通常采用的情形可能是使用工作流去完成,但是对于简单场景下,用工作流有点大财小用感觉,比如订单业务中,订单状态的变更,涉及到的状态量不是很多&a…

Asp.net Core全局异常监控和记录日志

前言系统异常监控可以说是重中之重,系统不可能一直运行良好,开发和运维也不可能24小时盯着系统,系统抛异常后我们应当在第一时间收到异常信息。在Asp.net Core里我使用拦截器和中间件两种方式来监控异常。全局异常监控的数据最好还是写入数据…

SiteServer CMS 新版本 V6.13(2019年11月1日发布)

欢迎来到 SiteServer CMS V6.13 版本,经过两个月的连续迭代开发,V6.13版本新增了几项重要功能,我们希望你会喜欢,一些关键的亮点包括:。新增功能及BUG 修复经过两个月的连续迭代开发,V6.13 版本新增了部分功…

CUDA的global内存访问的问题

http://blog.csdn.net/OpenHero/article/details/3520578 关于CUDA的global内存访问的问题,怎么是访问的冲突,怎样才能更好的访问内存,达到更高的速度。下面先看几张图,这些图都是CUDA编程手册上的图,然后分别对这些…

C# 8 新特性 - 异步流 Asynchronous Streams

异步流 Asynchronous Streams例子 这是一个很简单的控制台程序。它有一个NumberFactory&#xff0c;它可以根据传递的参数来产生一串数字&#xff08;IEnumerable<int>&#xff09;。然后在这个程序中把每个数字都打印出来&#xff0c;同时在前边显示出当前的线程ID。 这…

__syncthreads()

http://www.cnblogs.com/dwdxdy/p/3215136.html __syncthreads()是cuda的内建函数&#xff0c;用于块内线程通信. __syncthreads() is you garden variety thread barrier. Any thread reaching the barrier waits until all of the other threads in that block also reach i…

互联网50周年!这有它的一张“出生证明”

2019 年 10 月 29 日是互联网的 50 周年&#xff0c;50 年前(1969 年 10 月 29 日)&#xff0c;加州大学洛杉矶分校的计算机将一个只有两个字母(LO)的数据包发送到斯坦福研究所的计算机上&#xff0c;这是互联网史上的第一个数据包&#xff0c;从此开启互联网时代的第一步。 当…

Eltwise_layer简介

http://www.voidcn.com/blog/thy_2014/article/p-6117416.html common_layer&#xff1a; ArgMaxLayer类&#xff1b; ConcatLayer类&#xff1a; EltwiseLayer类&#xff1b; FlattenLayer类&#xff1b; InnerProductLayer类&#xff1b; MVNLayer类&#xff1b; SilenceLaye…

PowerBI 秒级实时大屏展示方案 全面助力双十一

双十一来了&#xff0c;你准备好了吗&#xff1f;不管你是否准备完毕&#xff0c;我们带来了全网首发的 PowerBI 秒级实时大屏展示方案&#xff0c;你可以直接用来展示双十一的实时状况。我们一步步来说明这个套件模板教程。真实效果功能如下&#xff1a;全实时展示 双十一 当天…

优化 .net core 应用的 dockerfile

优化 .net core 应用的 dockerfileIntro在给 .net core 应用的写 dockerfile 的时候一直有个苦恼&#xff0c;就是如果有很多个项目&#xff0c;在 dockerfile 里写起来就会很繁琐&#xff0c;有很多项目文件要 copy&#xff0c;dockerfile 还不支持直接批量复制项目文件&#…

C# 8 新特性 - 静态本地方法

从C# 8 开始&#xff0c;本地方法就可以是静态的了。 与其他的本地方法不同&#xff0c;静态的本地方法无法捕获任何本地状态量。 直接看例子&#xff1a; 这段代码里有两个本地方法&#xff0c;他们分别对实例的一个字段和方法里的一个本地变量进行了修改操作&#xff0c;也就…

​.NET手撸2048小游戏

前言2048是一款益智小游戏&#xff0c;得益于其规则简单&#xff0c;又和 2的倍数有关&#xff0c;因此广为人知&#xff0c;特别是广受程序员的喜爱。本文将再次使用我自制的“准游戏引擎” FlysEngine&#xff0c;从空白窗口开始&#xff0c;演示如何“手撸” 2048小游戏&…

自行实现高性能MVC

wcf虽然功能多、扩展性强但是也面临配置忒多&#xff0c;而且restful的功能相当怪异&#xff0c;并且目前没法移植。asp.net core虽然支持webapi&#xff0c;但是功能也相对繁多、配置复杂。就没有一个能让码农们安安心心的写webapi&#xff0c;无需考虑性能、配置、甚至根据问…