一、前言
在AI盛行的当下,基于文档的本地知识库智能问答系统已经成为当下最受AI从业者欢迎的落地方式。本文旨在收集整理当下AI应用中使用较多的处理pdf的库和开源项目,喜欢的请点赞、收藏。
附上几篇之前整理过的pdf相关的AI应用:
如何打造本地知识库——那些与Chat Pdf相关的几款开源热门跑车级应用
pdfGPT——通过AI与上传的PDF文件进行聊天
localGPT——一款100%本地布署且支持LangChain的应用
Quivr - 你的第二个大脑,由AIGC赋能
privatGPT——私有化GPT模型的全新应用
二、常用pdf工具
对于可编辑PDF而言,可以使用pdfminer、tabula(可用于表格提取)、pdfplumber等组件,对于图片型的,我们可以先获取文件里面的图片,然后使用ppstructure进行图片处理。
1. PDFminer
PDFMiner内置pdf2txt.py和dumppdf.py。但是pdf2txt.py从PDF文件中提取所有文本内容。但不能识别画成图片的文本,这需要对图片特征进行识别。对于加密的PDF你需要提供一个密码才能解析,对于没有提取权限的PDF文档你得不到任何文本。
地址:https://pdfminersix.readthedocs.io
2. pdfplumber
pdfplumber库既可以按页处理 pdf ,也可以获取页面文字以及进行提取表格等操作。
地址:https://github.com/jsvine/pdfplumber
3. pypdf2
PyPDF2是一个纯Python PDF库,可以读取文档信息(标题,作者等)、写入、分割、合并PDF文档,它还可以对pdf文档进行添加水印、加密解密等。
地址:https://pythonhosted.org/PyPDF2
4. xpdf
这个文本介绍了Xpdf,一个免费的PDF浏览器和工具包。它包括文本提取器、图片转换器、HTML转换器等工具,大部分工具都是开源的。
地址:http://www.xpdfreader.com/
5. mupdf
一个轻量级的 PDF、XPS 和电子书阅读器。MuPDF 包括一个软件库、命令行工具和各种平台的查看器。MuPDF 中的渲染器专为高质量抗锯齿图形而设计。它通过度量和间距准确地呈现文本,以在屏幕上再现印刷页面的外观。查看器小巧、快速,支持众多文档格式,如 PDF、XPS、OpenXPS、CBZ、EPUB 和 FictionBook 2。您可以使用移动查看器注释 PDF 文档和填写表格(此功能即将在桌面查看器上推出)。命令行工具允许您注释、编辑和将文档转换为其他格式,如 HTML、SVG、PDF 和 CBZ。您还可以编写使用 JavaScript 操作文档的脚本。该库采用可移植的 C 模块化编写,因此集成商可以根据需要添加和删除功能。此外,还有一个使用 JNI 的 Java 库,可在 Oracle 的 Java 和 Android 上运行。
地址:https://mupdf.com/
6. pymupdf
PyMuPDF是支持MuPDF的Python绑定。使用PyMuPDF,可以访问扩展名为“.pdf”、“.xps”、“.oxps”、“.cbz”、“.fb2”或“.epub”。对“.png”,“.jpg”,“.bmp”,“.tiff”等大约10种流行的图像格式也可以像文档一样处理。
地址:https://pypi.org/project/PyMuPDF/
7. ppstructure
PP-Structure是百度飞桨系列之PaddleOCR团队自研的智能文档分析系统,旨在帮助开发者更好的完成版面分析、表格识别等文档理解相关任务。
PP-StructureV2的主要特性如下:
•支持对图片/pdf形式的文档进行版面分析,可以划分文字、标题、表格、图片、公式等区域;•支持通用的中英文表格检测任务;•支持表格区域进行结构化识别,最终结果输出Excel文件;•支持基于多模态的关键信息抽取(Key Information Extraction,KIE)任务-语义实体识别(Semantic Entity Recognition,SER)和关系抽取(Relation Extraction,RE);•支持版面复原,即恢复为与原始图像布局一致的word或者pdf格式的文件;•支持自定义训练及python whl包调用等多种推理部署方式,简单易用;•与半自动数据标注工具PPOCRLabel打通,支持版面分析、表格识别、SER三种任务的标注。
地址:https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/ppstructure
PDF2Word
其中PDF2Word是PaddleOCR社区开发者 whjdark[1] 基于PP-StructureV2版面分析与恢复模型实现的PDF转换Word应用程序。
地址:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/ppstructure/pdf2word/README.md
8. iText PDF :
它是一个SDK(Software Development Kit)工具,为开发者提供了更好的文档引擎、高低级编程能力和创建、编辑和增强PDF文档的能力。PDF(Portable Document Format)是一种可移植的文档格式,可以在各种设备和操作系统上查看和打印。iText for Java可以提高工作流程的效率。其中使用的技术术语包括SDK、PDF、文档引擎和编程能力。
iText 5官网[2],已停止维护。iText5仓库地址[3] iText 7官网[4] 。iText7仓库地址[5] iText 7 与iText 5是两个不同的体系。iText 5已经暂停维护, iText 5与iText 7都分为商业版和社区版 itxt7和itext5对比[6] 开发文档[7]
地址:https://github.com/itext/itext7,商用时注意看一下开源协议。
9. Apache PDFBox
Apache PDFBox库是用于处理PDF文档的开源Java工具。该项目允许创建新的PDF文档,操纵现有文档以及从文档中提取内容的功能。Apache PDFBox还提供了几个命令行实用程序。
•地址:https://pdfbox.apache.org/•github地址:GitHub - apache/pdfbox: Mirror of Apache PDFBox[8]•中文文档:PDFBox阅读文本[9]•示例:java解析pdf获取pdf中内容信息 - 掘金[10]
10. OpenPDF
OpenPDF[11]
OpenPDF是一个Java库,使用LGPL和MPL开源许可证。可以拥有创建和编辑PDF文件。 OpenPDF是iText的LGPL/MPL开源后继产品,它基于iText 4 svn标签的一个分支。
地址:https://github.com/LibrePDF/OpenPDF
11. x-easypdf
x-easypdf[12]
x-easypdf基于pdfbox构建而来,极大降低使用门槛,以组件化的形式进行pdf的构建。 简单易用,仅需一行代码,便可完成pdf的操作。是国人开源的一个基于Apache PDFBox的JAR包。
地址:https://gitee.com/xsxgit/x-easypdf
12. pdffigures2
它是一个基于Scala语言构建的工具,用于从学术文档中提取图形、标题、表格和章节标题,尤其专注于计算机科学领域的文档。
地址:https://github.com/allenai/pdffigures2
13. 其他
1.Jasper Report :是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成 PDF2.Openoffice :openoffice是开源软件且能在windows和linux平台下运行,可以灵活的将word或者Excel转化为PDF文档。3.freemarker[13]:FreeMarker是一款模板引擎,可根据模板渲染内容生成pdf。
三、 Word转换为Pdf的几种方式
利用各种Office应用进行转换
•JobConverter[14] OpenOffice[15] ,支持跨平台,免费 (一般格式实现效果还行,复杂格式容易有错位)•SaveAsPDFandXPS[16] msOfficeWord jacob[17] ,仅支持Windows,免费 (完美保持原doc格式,效率最慢)
利用jar进行转换
•poi读取doc Jsoup格式化Html itext生成pdf (实现最方便,效果最差,跨平台)•jdoctopdf - Dead as of 2016-02-11 Uses Apache POI to read the Word document and iText to write the PDF•Docx4j[18] 一个基于JAXB技术的Java库,用于处理Word docx、Powerpoint pptx和Excel xlsx文件。JAXB是Java架构用于XML绑定的技术,它允许Java对象与XML数据之间进行转换。docx、pptx和xlsx是Microsoft Office套件中的文件格式,用于分别存储Word文档、Powerpoint演示文稿和Excel电子表格。该库可以帮助开发人员读取、修改和创建这些类型的文件。•docx4j-export-FO[19] ,需要依赖 plutext[20] ,已经停止对外服务。•Spire.Doc for Java[21] ,收费(免费的有限制)•itext-7-pdfoffice[22] ,收费•Aspose.Words[23] ,收费(免费的有限制)
命令行及图形工具
•OfficeToPDF[24] 这个文本是在描述一个命令行工具,可以将Microsoft Office文档转换为PDF格式。命令行工具是一种在计算机上通过命令行界面执行操作的工具。•docx2pdf[25] 这段文本介绍了如何使用Microsoft Word直接在Windows或macOS上将docx文件转换为pdf格式。在Windows上,这是通过win32com实现的,而在macOS上,则是通过JXA(JavaScript for Automation,即JS中的AppleScript)实现的。声明:上面部分内容整理自:https://mp.weixin.qq.com/s/e36JQiwKK5UaJpxgt_tajA和https://www.cnblogs.com/imzdong/p/15765737.html
References
[1]
whjdark: https://github.com/whjdark
[2]
iText 5官网: https://kb.itextpdf.com/home/it5kb
[3]
iText5仓库地址: https://github.com/itext/itextpdf
[4]
iText 7官网: https://kb.itextpdf.com/home/it7kb
[5]
iText7仓库地址: https://github.com/itext/itext7
[6]
itxt7和itext5对比: https://itextpdf.com/en/products/features
[7]
开发文档: https://itextpdf.com/en/resources/api-documentation
[8]
GitHub - apache/pdfbox: Mirror of Apache PDFBox: https://github.com/apache/pdfbox
[9]
PDFBox阅读文本: http://www.vue5.com/pdfbox/pdfbox_reading_text.html
[10]
java解析pdf获取pdf中内容信息 - 掘金: https://juejin.cn/post/7231795067072954429
[11]
OpenPDF: https://github.com/LibrePDF/OpenPDF
[12]
x-easypdf: https://gitee.com/xsxgit/x-easypdf
[13]
freemarker: http://freemarker.foofun.cn/
[14]
JobConverter: https://sourceforge.net/projects/jodconverter/
[15]
OpenOffice: https://www.openoffice.org/download/
[16]
SaveAsPDFandXPS: https://www.microsoft.com/en-us/download
[17]
jacob: https://sourceforge.net/projects/jacob-project/
[18]
Docx4j: https://github.com/plutext/docx4j
[19]
docx4j-export-FO: https://github.com/plutext/docx4j-export-FO
[20]
plutext: https://converter-eval.plutext.com/
[21]
Spire.Doc for Java: https://www.e-iceblue.cn/spiredocforjavaconversion/java-convert-word-to-pdf.html
[22]
itext-7-pdfoffice: https://kb.itextpdf.com/home/it7kb/installation-guidelines/installing-itext-7-pdfoffice-for-java-developers
[23]
Aspose.Words: https://www.aspose.com/
[24]
OfficeToPDF: https://github.com/cognidox/OfficeToPDF
[25]
docx2pdf: https://github.com/AlJohri/docx2pdf
[26] https://www.cnblogs.com/imzdong/p/15765737.html