PDF库的使用痛点以及一个基于这些痛点的开源想法

426 阅读7分钟

今年很长一段时间以来,我都是在和文档处理工具打交道,尤其是PDF最多。这些文档处理工具涵盖了前端、后端的各个部分。有PDF.js这种负责显示的,也有iText、PDFBox这种要对PDF进行处理的工具。这些工具虽然已经提供了不少核心的功能,但是想要让开发者真正的用起来,还有很长的一段路要走。而且,这一段路非常不好走。

PDF文档处理相关的工具的使用痛点

首先是这些工具一般各玩各的,而且文档都比较少,有时候还存在兼容性问题。拿我的某个用户来说,他为了能够处理好自己的PDF和Web端的excel展示,使用了各式各样的工具。PDF显示这一块是我帮他开发的。PDF加盖水印和解析等一系列的操作,他们用的是国外的厂商提供的一款工具。PDF的生成则又用得是另一款工具。不同的平台使用不同厂商提供的工具,结果就是产生了两个麻烦的问题,第一个是兼容性问题。后端生成的PDF在前端不能正确展示,或者使用专业的工具打开会提示文档存在问题。第二个则是出了问题也不知道怎么定位,甚至很多时候可以说是无法定位。

其次,PDF的开源工具其实是众多的,但是每个工具往往又只能处理一小部分内容。比如有的工具能够提供PDF和word互转的功能,有的能够提供签章的功能,有的则能够提供PDF创建的功能。在开源的部分里,我并没有找到一款能够提供比较全面工具。

再其次,即使提供了开源的工具,开发者事实上也难以将开源的工具集成到自己的系统里面去。以PDF.js为例,这一款工具提供了一个比较高质量PDF阅读器展示功能。但仅仅也就是一个展示功能而已。开发者想要把这个工具集成到自己的系统里面去,还是有一定难度的。因为PDF.js的文档相对来说比较少。再其次,哪怕有了文档,开发者也无法把这款优秀的工具集成到自己的系统里面去。因为它的定位就不是一个适合集成到企业系统中的工具。因此,它没有设计各种接口和后端互相沟通,也没有提供各种API供开发者去操作整个阅读器。更多的时候,开发者能做的不过就是,让整个阅读器从服务器中读取一个文档,然后让用户孤立的使用这个工具。那这个就和使用一些桌面版PDF工具没有太大区别了。当然,PDF.js提供了优秀的基础代码,想要让整个PDF阅读器,完美的集成到自己的系统里面去,必须要对它进行二次开发才行。

再其次,跟PDF处理相关的中文文档真是少之又少,且大部分并不能触及问题的核心。何所谓问题的核心?我想有两点,一点是PDF本身的数据结构。另一点则是开源工具本身的实现原理。简单的来说,就是“PDF的数据结构+PDF的处理算法”。所有的文档,在计算机看来,不过都是一串二进制字符。可以是文本的二进制流,也可以是字节的二进制流。PDF是这样,word、excel也是这样。只不过,他们的底层数据结构并不相同。《UNIX编程艺术》中有一句话,我觉得说得很好——“编程的核心是数据结构,而不是算法”。任何一个PDF工具,无非就是读和写PDF。PDF的读取工具不过就是按照PDF本身的数据结构,将其解析出来,提出数据给用户或者直接展示给用户看。PDF的写入工具无非就是将图片、文字等各种资源,按照PDF本身的数据结构组织好写入到一个文件中,最后得到一个二进制文件。不过大部分的文档,并不能触及这两个核心。不能够触及这两个核心,很多时候问题就不好解决。功能就无法组织的强大。以我遇到的问题为例,用户用某个工具生成了一个PDF,并在PDF上加了签章,后来又用某些工具去处理了这个PDF,最后签章失效了。在专业的工具上打开,会直接显示一个大红叉。客户弄了半天也搞不定这个问题,后来我去查阅了国外的资料,资料显示,签章失效是因为签完章又对PDF进行了一些操作。实际上这个操作是不被允许的,并因此导致了签章的失效。还有一次,用户的某些PDF文档可以分页加载,有些PDF文档又不能够分页加载。经过分析,发现是客户使用的PDF生成工具使用不当导致的问题。客户的工具生成的PDF只能说展示正常,但是里面对象的索引可以说是非常的乱。因为对象索引乱七八糟,PDF工具无法根据索引找到正确的页面和对象,因此无法进行分页加载。诸如此类的问题还有很多,总而言之,都是因为没有触及PDF的核心,从而导致没有办法真正用好相关的PDF工具。

最后,国内的这些工具相对来说还是比较少的,不少开发者都是用的是国外的产品。但是国外的产品,一来本土化做得不够,二来售价昂贵,三来售后其实做得也不好。因此国内的开发者用起来其实也并不顺畅。我的客户在用国外的产品的时候,出了问题找厂家,厂家就给个论坛和一些FAQ,剩下的就让用户自己处理了。再问,客服也不会给更多的反馈了,所以很多问题都一直摆在那里,功能也是将就着用,直到我过去才帮他们处理了一些。

做一个开源的想法

有着这么多的问题在,国内想做一款好的PDF工具,几乎是非常困难的。市面上各式各样的PDF相关的产品,无论是PDF的阅读器,还是PDF的处理工具。其最根本的核心仍然在于一个优秀的PDF库,这个优秀的PDF库能够很好的操作PDF的数据结构。有了这个优秀的库,然后就能有优秀的PDF桌面处理工具,优秀的面向企业的PDF处理工具。PDF的数据结构已经是公开的了。且也有着大量的开源工具的源码可以供我们学习和阅读。因此,能否利用这些资料和代码,做出一个优秀且全面的PDF处理库?然后再用这个库,去实现PDF阅读器、PDF处理系统、PDF处理网站。当然,这个肯定是要有很长时间的路要去走的,不过我打算沿着这条路试一试了。

我所想试的第一步便是,基于PDF.js做一个较大程度的二次开发,并且是以开源的模式。当下的PDF.js还不能够被国内的开发者很好的使用,他们提出的需求在PDF.js的阅读器上直接使用还是较为困难的。且存在文档和案例缺少、只有默认的样式、无法和后台交互、缺乏一些关键性功能、没有供用户操纵的各种API等一系列问题。我想做的这个开源工具,希望能够把这些问题通通解决掉。给开发者一个高质量的、易于使用的PDF展示、批注工具。