admin 管理员组文章数量: 887021
文章目录
- 一、关于 Apache PDFBox
- 二进制下载
- 构建
- 贡献
- 支持
- 已知限制和问题
- 许可证(另见[LICENSE. txt](https://github/apache/pdfbox/blob/trunk/LICENSE.txt))
- 出口管制
- 二、依赖
- 1、核心组件
- 最低要求
- 字体处理
- XMP元数据
- 使用Maven包含依赖项
- 2、可选组件
- JAI Image I/O
- 公钥加密和签名
- 激活和绑定
- 从命令行使用其他库
- 三、入门
- 1、Maven
- 2、渲染性能
- 四、命令行工具
- 1、解密
- 2、加密
- 3、提取图像
- 4、提取文本
- 5、OverlayPDF
- 6、PDFDebugger
- 7、PDFMerger
- 8、PDFSplit
- 9、PDFToImage
- 10、PrintPDF
- 11、TextToPDF
- 12、WriteDecodedDoc
- 五、常见问题
- 1、一般问题
- 我收到以下Log4J警告消息,如何删除它?
- PDFBox线程安全吗?
- 为什么我会收到“警告:您没有关闭PDF文档”?
- 为什么迭代时没有得到所有字段?
- 2、Font Handling
- 我得到 `java.lang.IllegalArgumentException: ... is not available in this font's encoding: WinAnsiEncoding`
- PDFBox是否支持复杂的脚本?
- 我的系统需要什么字体?
- 为什么外部字体在作为资源加载时似乎损坏了?
- 3、PDF Creation
- 我可以使用PDFBox创建复杂的布局吗?
- 我正在创建一个PDF,但我的页面是空的。为什么?
- 4、文本提取
- 为什么提取的文本会以错误的顺序出现?
- 为什么我没有从PDF文档中收到任何文本?
- 为什么我在提取文本时得到胡言乱语(G38G43G36G51G5)?
- "java.io. IOException:不能处理字体宽度"是什么意思?
- 为什么我在某些文档上得到“您没有提取文本的权限”?
- 我们不能只提取文本而不解析整个文档或在解析时提取文本吗?
- 5、PDF渲染
- 我得到一个OutOfMemoryError。我能做什么?
- 为什么有些文本质量差,没有抗锯齿?
- 如何处理IllegalArgumentException“源光栅带和源颜色空间组件的数量不匹配”?
- 为什么渲染时会出现黑色墨迹、黑色污渍、黑云或黑点?
- 为什么某些PDF的打印速度如此之慢?
一、关于 Apache PDFBox
- github : https://github/apache/pdfbox
- 官网:https://pdfbox.apache/
- Java API : https://javadoc.io/doc/org.apache.pdfbox/pdfbox/latest/index.html
相关教程:
https://blog.csdn/qinwenjng120/article/details/105395179
这个Apache PDFBox库是一个用于处理PDF的开源Java工具 文件。该项目允许创建新的PDF文档、操作 现有文档和从文档中提取内容的能力。 PDFBox还包括几个命令行实用程序。PDFBox已发布 在Apache许可证2.0版下。
PDFBox 是Apache软件基金会的一个项目。
二进制下载
您可以下载当前正在开发或更早版本的二进制版本 从我们的下载页面发布。
构建
您需要Java11(或更高)和Maven 3来 构建PDFBox。推荐的构建命令是:
mvn clean install
默认构建将编译Java源代码并将二进制类打包到jar包中。有关所有其他可用的构建选项,请参阅Maven留档。
贡献
有多种方法可以帮助我们改进PDFBox。
- 查看问题跟踪器以帮助我们修复错误。
- 在我们的用户邮件列表中回答问题。
- 帮助我们增强示例
- 帮助我们增强PDFBox文档 或者在GitHub上。
支持
请遵循我们支持页面上的指南。
如果您对如何使用PDFBox有任何疑问,请在 用户邮件列表。 这会让你得到整个社区的帮助。
源代码中的PDFBox示例和测试代码也将提供附加信息。
网站上还有额外的资源,例如 堆栈溢出。
如果您确定您发现了bug请在我们的 问题跟踪器。
已知限制和问题
请参阅问题跟踪器以获取 已知问题和请求功能的完整列表。更多的 常见问题有:
- 您会得到像“G38G43G36G51G5”这样的文本,而不是您在提取文本时所期望的。这是因为字符是一种无意义的内部编码,指向嵌入在PDF文档中的字形。访问文本的唯一方法是使用OCR。这可能是未来的增强功能。
- 您会收到如下错误消息
java.io.IOException: Can't handle font width
这可能是因为你没有 org/apache/pdfbox/资源目录在类路径中 解决方案是将apache-pdfbox-x. x.x.jar包含在类路径中。 - 您得到的文本具有正确的字符,但顺序错误。这可能是因为您没有启用排序。PDF文件中的文本以块的形式存储,这些块不需要按照它们在页面上显示的顺序存储。默认情况下,PDFBox不会对文本进行排序。
许可证(另见LICENSE. txt)
集体作品:版权所有2015 Apache软件基金会。
根据一项或多项贡献者许可协议授权给Apache软件基金会(ASF)。有关版权所有权的更多信息,请参阅随本作品分发的通知文件。ASF根据Apache许可证2.0版(“许可证”)将此文件授权给您;除非符合许可证,否则您不得使用此文件。您可以在 https://www.apache/licenses/LICENSE-2.0 获取许可证副本:
除非适用法律要求或书面同意,根据许可证分发的软件按“原样”分发,没有任何明示或暗示的保证或条件。有关许可证下管理权限和限制的特定语言,请参阅许可证。
出口管制
此发行版包括加密软件。其中的国家 您目前居住的可能对进口、拥有、使用、 和/或再出口到另一个国家的加密软件。在使用之前 任何加密软件,请查看您所在国家/地区的法律、法规和 关于进口、拥有、使用和再出口的政策 加密软件,看看是否允许。看 https://www.wassenaar更多信息。
美国政府商务部工业和安全局(BIS)将该软件归类为出口商品管制号(ECCN)5D002. C.1,其中包括使用或执行具有非对称算法的加密功能的信息安全软件。此Apache软件基金会发行版的形式和方式使其有资格根据许可例外ENC技术软件无限制(TSU)例外(见BIS出口管理条例,第740.13节)对目标代码和源代码进行出口。
以下提供了有关随附加密软件的更多详细信息:
Apache PDFBox使用Java密码体系结构(JCA)和充气城堡库来处理PDF文档中的加密。
二、依赖
本文翻译整理自:https://pdfbox.apache/3.0/dependencies.html
1、核心组件
在运行时、开发和测试期间需要这些组件,具体取决于以下详细信息。
这三个PDFBox组件分别命名为pdfbox
、fontbox
和xmpbox
。
最低要求
PDFBox具有以下基本依赖项:
- Java8
- commons-logging
Commons Logging 是不同日志框架的通用包装器,因此您还需要使用日志库,如log4j 或者让公共日志回退到标准的java. util.log API 纳入Java平台。
对于PDFBox预检测试只需要 Comms-io 2.4。
字体处理
字体处理需要 fontbox 组件。
XMP元数据
为了支持XMP元数据,需要 xmpbox 组件。
使用Maven包含依赖项
要将pdfbox、fontbox、xmpbox和公共日志记录jar添加到您的应用程序中,最简单的方法是声明如下所示的Maven依赖项。这将直接为您提供主pdfbox库,并将其他所需的jar作为传递依赖项。
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>...</version>
</dependency>
将version字段设置为最新的稳定PDFBox版本。
2、可选组件
PDFBox 并未启用所有功能。第三方组件是获得对某些功能的完全支持所必需的。
JAI Image I/O
PDF支持嵌入式图像文件,但是对某些格式的支持需要根据与Apache 2.0许可不兼容的条款分发的第三方库:
- 读取JBIG2图像:JBIG2 ImageIO
- 读取**JPEG 2000(JPX)**图像:JAI Image I/O工具
- 编写TIFF图像还需要JAI Image I/O Tools Core。
这些库是可选的,如果类路径上存在,将加载这些库,否则将禁用对这些图像格式的支持,并在遇到不受支持的图像时记录警告。
这些组件的Maven依赖项可以在父/pom. xml中找到。如果需要,请更改组件的范围。请确保任何第三方许可证都适合您的项目。
要包含JBIG2库,可以将以下部分包含在您的项目pom. xml中:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>jbig2-imageio</artifactId>
<version>...</version>
</dependency>
要包含JAI功能,可以将以下部分包含在您的项目pom. xml中:
<dependency>
<groupId>com.github.jai-imageio</groupId>
<artifactId>jai-imageio-core</artifactId>
<version>...</version>
</dependency>
<dependency>
<groupId>com.github.jai-imageio</groupId>
<artifactId>jai-imageio-jpeg2000</artifactId>
<version>...</version>
</dependency>
为了获得更可靠的JPEG解码,TwelveMonkey库中的以下部分可以包含在您的项目pom. xml中:
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>...</version>
</dependency>
公钥加密和签名
公钥加密和签署PDF需要来自充气城堡军团的bcprov、bcmail和bcpkix库。这些可以使用以下依赖项包含在您的Maven项目中:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.78.1</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcmail-jdk18on</artifactId>
<version>1.78.1</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk18on</artifactId>
<version>1.78.1</version>
</dependency>
检查更新版本的充气城堡库总是一个好主意。如果您使用的是更新的java版本,您也可以调整artifactId。
激活和绑定
从jdk9开始,激活和绑定库已从jdk中删除。预检和一些示例需要它们。
这些可以使用以下依赖项包含在您的Maven项目中:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
检查较新版本的库总是一个好主意。如果您使用的是更新的java版本,您也可以调整artifactId。
从命令行使用其他库
使用其中一个命令行应用程序时,将jar文件复制到“lib”子目录并像这样运行应用程序(在Windows上使用“;”而不是“:”):
java -cp "pdfbox-app-3.0.2.jar:./lib/*" org.apache.pdfbox.tools.PDFBox args
或者
java -cp "preflight-app-3.0.2.jar:./lib/*" org.apache.pdfbox.preflight.Validator_A1b args
三、入门
1、Maven
要使用最新版本,您需要添加以下依赖项:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.2</version>
</dependency>
2、渲染性能
自 PDFBox2.0.4
PDFBox 2.0.4 引入了新的命令行设置
-Dorg.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true
这可能会提高在某些系统上渲染PDF的性能,尤其是当页面上有很多图像时。
四、命令行工具
PDFBox 带有一系列命令行实用程序。它们可作为标准Java应用程序使用。
有关如何设置类路径以便运行的说明,请参阅依赖项页面 PDFBox工具作为Java应用程序。
1、解密
此应用程序将解密PDF文档。
注意:您必须拥有所有者密码才能解密文档!
用法:java -jar pdfbox-app-3.y.z.jar decrypt [OPTIONS] -i=<infile>
命令行参数 | 描述 |
---|---|
-alias= | 密钥库中证书的别名。 |
-h,–help | 显示帮助消息并退出。 |
-i,–enter= | 要解密的PDF文件。 |
-keyStore=<keyStore> | 持有证书以解密文档的密钥库的路径。仅当文档使用证书加密时才需要此路径,否则只需要密码。 |
-o,--out=<outfile> | 要保存解密文档的文件。如果留空,则它将与输入文件相同。 |
-password=[<password>] | 密钥库中PDF或证书的密码。 |
-V,–version | 打印版本信息并退出。 |
2、加密
此应用程序将加密PDF文档。
用法:java -jar pdfbox-app-3.y.z.jar encrypt [OPTIONS] -i=<infile>
命令行参数 | 默认 | 描述 |
---|---|---|
-canAssemble | true | 设置汇编权限。 |
-canExtractContent | true | 设置提取权限。 |
-canExtractForAccessibility | true | 设置提取权限。 |
-canFillInForm | true | 设置填写表单权限。 |
-canModify | true | 设置修改权限。 |
-canModifyAnnotations | true | 设置修改注释权限。 |
-canPrint | true | 设置打印权限。 |
-canPrintFaiity | true | 设置打印忠实权限。 |
-certFile=<certFile> | X.509证书文件的路径。 | |
-h,–help | 显示帮助消息并退出。 | |
-i,--enter=<infile> | 要加密的PDF文件。 | |
-keyLlong | 256 | 密钥长度(以位为单位)(有效值:40、128或256) |
-o,--out=<outfile> | 加密的PDF文件 | |
-O=[<ownerPassword>] | 设置所有者密码(如果设置了certFile则忽略) | |
-U=[<userPassword>] | 设置用户密码(如果设置了certFile则忽略) | |
-V,–version | 打印版本信息并退出。 |
3、提取图像
此应用程序将从给定的PDF文档中提取所有图像。
用法:java -jar pdfbox-app-3.y.z.jar export:images [OPTIONS] -i=<infile>
命令行参数 | 描述 |
---|---|
-h,–help | 显示帮助消息并退出。 |
-i,--enter=<infile> | 要解密的PDF文件。 |
-noColorConvert | 如果可能,图像将使用其原始颜色空间提取。 |
-password=[<password>] | 密钥库中PDF或证书的密码。 |
-prefix=<prefix> | 图像前缀(默认为pdf名称)。 |
-useDirectJPEG | 强制直接提取JPEG/JPX图像,无论颜色空间或掩码如何。 |
-V,–version | 打印版本信息并退出。 |
4、提取文本
此应用程序将从给定的PDF文档中提取所有文本。
用法:java -jar pdfbox-app-3.y.z.jar export:text [OPTIONS] -i=<infile>
命令行参数 | 默认 | 描述 |
---|---|---|
-alwaysNext | false | 进程下一页(如果适用)尽管有IOException(-html时忽略) |
-console | false | 发送文本到控制台而不是文件。 |
-debug | false | 启用关于每个阶段的时间消耗的调试输出。 |
-编码=<编码> | UTF-8 | 文本文件的编码类型,例如。UTF-8或ISO-8859-1、UTF-16BE、UTF-16LE等 |
-encoding=<encoding> | 整数。MAX_INT | 要提取的最后一页(基于1,含1) |
-h,–help | 显示帮助消息并退出。 | |
-html | false | 以超文本标记语言格式输出,而不是原始文本。 |
-i,--enter=<infile> | 要加密的PDF文件。 | |
-ignoreBeads | false | 禁用 beads 分隔。 |
-o,--out=<outfile> | 导出的文本文件。 | |
-password=[<password>] | 密钥库中PDF或证书的密码。 | |
-rotationMagic | false | 分析每个页面的旋转/倾斜文本,旋转到0°并单独提取(较慢,并在-html时忽略) |
-sort | false | 在写入之前对文本进行排序。 |
-startPage=<startPage> | 1 | 开始提取的第一页 |
-V,–version | 打印版本信息并退出。 |
5、OverlayPDF
此应用程序将用另一个文档的内容覆盖一个文档
用法:java -jar pdfbox-app-3.y.z.jar overlay [OPTIONS] -i=<infile> -o=<outfile>
命令行参数 | 默认 | 说明 |
---|---|---|
-default=<defaultOverlay> | 默认的覆盖文件。 | |
-even=<evenPageOverlay> | 用于偶数页的覆盖文件。 | |
-first=<firstPageOverlay | 用于第一页的覆盖文件。 | |
-h,–help | 显示帮助信息并退出。 | |
-i,--put=<infile> | 要覆盖的PDF文件。 | |
-last=<lastPageOverlay> | 用于最后一页的覆盖文件。 | |
-o,--out=<outfile> | 生成的PDF文件。 | |
-oud=<oddPageOverlay> | 用于奇数页的覆盖文件。 | |
-page=<Integer=specificPageOverlay> | 用于给定页码的覆盖文件,可能会出现不止一次。 | |
-position=<position> | 背景 | 在哪里放覆盖,前景或背景。-useAll |
-useAllPages=<useAllPagesOverlay | 用于叠加的叠加文件,只需重复即可使用所有页面 | |
-v,–version | 打印版本信息并退出。 |
例子:
overlayPDF -i=input.pdf -default=overlay.pdf -o=output.pdf
overlayPDF -i=input.pdf -default=defaultOverlay.pdf -page="10=overlayForPage10.pdf" -position=FOREGROUND -o=output.pdf
overlayPDF -i=input.pdf -odd=oddOverlay.pdf -even=evenOverlay.pdf -o=output.pdf
6、PDFDebugger
此应用程序将采用现有的PDF文档,并允许分析和检查内部结构。它被用作2.0.0中删除的PDFReader的替代品。
用法:java -jar pdfbox-app-3.y.z.jar debug [inputfile]
命令行参数 | 描述 |
---|---|
输入文件 | 要打开的可选PDF文件的名称。 |
-h,–help | 显示帮助消息并退出。 |
-password=[<password>] | 密码以删除PDF。 |
-viewstructure | 在启动时激活“视图结构”视图。 |
7、PDFMerger
此应用程序将获取pdf文档列表并合并它们,将结果保存在新文档中。
用法:java -jar pdfbox-app-3.y.z.jar merge [-hV] -o=outfile -i=<infile> [-i=<infile>]
命令行参数 | 说明 |
---|---|
-h,–help | 显示帮助信息并退出。 |
-i,–put= | 要合并的PDF文件 |
-o,–out= | 合并的PDF文件。 |
-V,–version | 打印版本信息并退出。 |
8、PDFSplit
此应用程序将获取现有的PDF文档并将其拆分为多个新文档。
默认情况下,生成的文件将以原始文件名命名,后缀前附加-<nr>
。 要覆盖文件名,请使用outputPrefix
选项。
用法:java -jar pdfbox-app-3.y.z.jar split [OPTIONS] -i=<infile>
命令行参数 | 描述 |
---|---|
-endPage= | 结束页面。 |
-h,–help | 显示帮助消息并退出。 |
-i,–enter= | 要拆分的PDF文件 |
–outputPrefix= | 拆分文件的文件名前缀。 |
-password=[] | PDF的密码。 |
-spl= | 在这么多页之后拆分(默认为1,如果startPage和endPage未设置)。 |
-startPage= | 起始页。 |
-endPage | 要停止的页面。 |
-V,–version | 打印版本信息并退出。 |
例子:
PDFSplit -split=2 -i=sample_with_13_pages.pdf
将pdf分为两页,最后一页只包含一页。PDFSplit -startPage=5 -i=sample_with_13_pages.pdf
将提供一份pdf,其中包含从第5页开始的源pdf的所有页面PDFSplit -startPage=5 -endPage=10 -i=sample_with_13_pages.pdf
将提供一份pdf,其中包含源pdf的5到10页PDFSplit -split=2 -startPage=5 -endPage=10 -isample_with_13_pages.pdf
将提供3个pdf,其中包含源pdf的5到10个页面,每个页面2个页面
9、PDFToImage
此应用程序将为PDF文档中的每个页面创建一个图像。
用法:java -jar pdfbox-app-3.y.z.jar render [OPTIONS] -i=<infile>
命令行参数 | 默认 | 描述 |
---|---|---|
-color= | rgb | 颜色深度(有效:BINARY、GRAY、RGB、ARGB、BGR) |
-cropbox= | 要导出的页面区域。 | |
-dpi, -resolution= | 从屏幕中检测到(如果无头,则为96) | 输出图像的DPI |
-endPage= | 整数。MAX_INT | 要转换的最后一页,(基于一个,包括一个)。 |
-format= | jpg | 图像文件格式。 |
-h,–help | 显示帮助消息并退出。 | |
-i,–enter= | 要转换的PDF文件。 | |
-page= | 要提取的唯一页面(基于1)。 | |
-password=[] | PDF的密码。 | |
-prefix, -outputPrefix= | PDF文档名称 | 图像文件的文件名前缀 |
-quality= | 0为PNG和1为其他格式 | 压缩图像时使用的质量(0<=质量<=1)。 |
-startPage= | 1 | 开始提取的第一页(基于一个) |
-subSample | 激活子采样(对于具有巨大图像的PDF) | |
-time | 打印定时信息到标准输出。 | |
-V,–version | 打印版本信息并退出。 |
10、PrintPDF
此应用程序将向打印机发送pdf文档。
您必须具有正确的权限才能打印文档!
用法:java -jar pdfbox-app-3.y.z.jar print [OPTIONS] -i=<infile>
命令行参数 | 默认 | 描述 |
---|---|---|
-边框 | 使用边框打印。 | |
-dpi= | 用特定的dpi渲染成中间图像,然后打印 | |
-duplex= | 文档 | 使用双工打印(SIMPLEX、DUPLEX、TUMBLE、DOCUMENT)。 |
-h、–help | 显示帮助消息并退出。 | |
-i、–enter= | 要打印的PDF文件。 | |
-mediaSize= | 使用介质大小名称打印。 | |
-noColorOpt | 禁用颜色优化(打印条形码时很有用)。 | |
-orientation | 自动 | 打印使用方向(AUTO、LANDSCAPE、PORTRAIT)。 |
-password=[] | PDF的密码。 | |
-printerName= | 打印到指定的打印机。 | |
-silentPrint | 打印没有打印机对话框。 | |
-tray= | 使用 tray 打印 | |
-V, --version | 打印版本信息并退出 |
11、TextToPDF
此应用程序将从文本文件创建PDF文档。
用法:java -jar pdfbox-app-3.y.z.jar fromText [OPTIONS] -i=<infile> -o=<outfile>
命令行参数 | 默认 | 描述 |
---|---|---|
-charset= | UTF-8 | 要使用的字符集。 |
-fontSize= | 10 | 要使用的字体的大小。 |
-h,–help | 显示帮助消息并退出。 | |
-i,–enter= | 要转换的文本文件。 | |
-横向 | 将方向设置为横向。 | |
-o,–out= | 生成的PDF文件。 | |
-pageSize= | LETTER | 要使用的页面大小(LETTER, LEGAL,A0,A1,A2,A3,A4,A5,A6)。 |
-标准字体=<标准字体> | Helvetica | 用于文本的字体。应该指定this或-ttf,但不能同时指定两者。 |
-ttf= | 用于文本的TTF字体。应该指定this或-标准字体,但不能同时指定两者。 | |
-V,–version | 打印版本信息并退出。 |
以下字体名称可用于参数standardFont
:
- Courier
- Courier-Bold
- Courier-Oblique
- Courier-BoldOblique
- Helvetica
- Helvetica-Bold
- Helvetica-Oblique
- Helvetica-BoldOblique
- Symbol
- Times-Bold
- Times-Roman
- Times-Italic
- Times-BoldItalic
- ZapfDingbats
12、WriteDecodedDoc
解压缩PDF文档的应用程序。
用法:java -jar pdfbox-app-3.y.z.jar decode [OPTIONS] <input-file> <output-file>
命令行参数 | 描述 |
---|---|
input-file | 的PDF文档解压 |
output-file | 的PDF文件顶部保存到 |
-h,–help | 显示帮助消息和退出。 |
-password=[] | PDF的密码。 |
-skipImages | 不解压缩图像 |
-V,–version | 打印版本信息并退出。 |
五、常见问题
1、一般问题
我收到以下Log4J警告消息,如何删除它?
log4j:WARN No appenders could be found for logger (org.apache.pdfbox.util.ResourceLoader).
log4j:WARN Please initialize the log4j system properly.
此消息意味着您需要配置log4j日志记录系统。 有关详细信息,请参阅log4j留档。
PDFBox附带一个示例log4j配置文件。要使用它,您可以像这样设置一个系统属性
java -Dlog4j.configuration=log4j.xml org.apache.pdfbox.ExtractText <PDF-file> <output-text-file>
如果这对您不起作用,那么您可能必须使用URL路径指定log4j配置文件,如下所示:
log4j.configuration=file:///<path to config file>
PDFBox线程安全吗?
不!一次只能有一个线程访问单个文档。您可以有多个线程,每个线程都访问它们自己的PDDocument对象。
为什么我会收到“警告:您没有关闭PDF文档”?
您需要在最终块中的PDDocument上调用off(),如果不这样做,文档将无法正确关闭。此外,您必须关闭所有创建的PDDocument对象。以下代码创建两个PDDocument对象;一个来自“new PDDocument()”,另一个来自load方法。
PDDocument doc = new PDDocument();
try
{
doc = PDDocument.loadPDF( "my.pdf" );
}
finally
{
if( doc != null )
{
doc.close();
}
}
为什么迭代时没有得到所有字段?
调用 getFieldTree()
,而非 getFields()
,后者只返回根级别的字段。
2、Font Handling
我得到 java.lang.IllegalArgumentException: ... is not available in this font's encoding: WinAnsiEncoding
通过查看 PDF Specification 附录D 来检查字符是否在WinAnsiEncoding中可用。
如果没有,但如果此字体可用(在windows中,使用charmap.exe查看),则使用 PDType0Font.load()
加载字体,另请参阅源代码下载中的 EmbeddedFonts.java示例。
PDFBox是否支持复杂的脚本?
感谢捐款,我们支持孟加拉语和拉丁语自3.0.0。 从版本开始3.0.2我们还支持Devanagari和Gujarati。 但是有一些警告:PDFBox将仅支持特定字体中的一种语言,因此它是 最好使用足够具体的字体,例如洛希特字体。 例如,Mangal字体应该是Devangari字体,但PDFBox会选择孟加拉语 因为那个也声称支持,先检查。 无法在3.0.2中停用该功能,但会在3.0.3。 这些功能可能不完整,因为我们还不支持所有GSUB表格式, 而且我们根本不支持GPOS。
我的系统需要什么字体?
Windows或Mac通常具有所需的最少字体。如果这些字体不在“标准14字体”集中,您确实需要未嵌入到PDF中的字体,以及创建PDF时所需的任何特定字体。
对于渲染和文本提取,您需要 PDF规范:Times-Roman、Helvetica、Courier、Symbol、Times-Bold、Helvetica-Bold、Courier-Bold、 符号、ZapfDingbats、Times-Italic、Helvetica-Oblique、Courier-Oblique、Times-BoldItalic、 Helvetica-BoldOblique,Courier-BoldOblique。您可以通过运行在linux上获得大多数这些字体 sudo apt-get install ttf-mscorefonts-installer
. Arial和Helvetica一样好。 可以使用MS-Gothic代替ZapfDingbats。 另请参阅此stackoverflow答案关于获取ZapfDingbats 从代笔字体。泰晤士报/快递/Helvetica字体也可以替换为适当的 解放或Nimbus字体。PDFBox使用的确切替换逻辑可以在文件中读取 FontMapperImpl.java
从源代码下载。
要仅创建具有“标准14字体”的PDF,不需要额外的字体文件(版本2.0.5或更高版本),因为这些文件没有嵌入,并且PDFBox具有所有指标,不再需要访问实际字体。
为什么外部字体在作为资源加载时似乎损坏了?
如果您的程序在从文件加载字体但从文件加载字体时运行正常 资源,检查是否 资源过滤 在maven构建脚本的maven-resources-plugin中激活,并为字体文件禁用它。 请参阅此stackoverflow回答如何解决此问题。
3、PDF Creation
我可以使用PDFBox创建复杂的布局吗?
我想使用PDFBox创建一个包含多个段落、表格、图像等的复杂布局。PDFBox适合这个目的吗?
PDFBox是一个低级的PDF库,提供了创建页面内容(如文本、图像等)的API。但是在这个时候,它没有提供更高级别的API来进行页面布局、段落处理、自动换行或创建表格等。
但是PDFBox是一些项目的基础,在这种情况下可能会有所帮助。这包括以下项目
- 盒装的
- 盒子桌
- 易用的
- pdfbox布局
- PdfLayoutManager
- pdf格式
您可能还需要考虑使用Apache FOP,它允许从XML数据和模板创建复杂的文档-
我正在创建一个PDF,但我的页面是空的。为什么?
确保在保存之前关闭了内容流。
4、文本提取
为什么提取的文本会以错误的顺序出现?
默认情况下,文本提取的顺序与PDF页面内容流中的文本相同。 PDF是一种图形格式,而不是文本格式,与超文本标记语言不同,它不要求页面上的文本 以一定的顺序呈现。顺序是由创建PDF的软件确定的。 要将文本从左到右,从上到下排序,请使用setSortByPosition(true)
。
为什么我没有从PDF文档中收到任何文本?
从pdf文档中提取文本是一项复杂的任务,涉及许多因素会影响文本提取的可能性和准确性。如果您可以尝试几件事,这将对PDFBox团队有所帮助。
- 在Acrobat中打开PDF并尝试从中提取文本。如果Acrobat可以提取文本,那么PDFBox也应该可以,如果不能,那就是bug。如果Acrobat不能提取文本,那么PDFBox“可能”也不能。
- 它可能真的是图像而不是文本。一些PDF文档只是扫描过的图像。您可以通过使用Acrobat中的选择工具来判断,如果您无法选择任何文本,那么它可能是图像。
为什么我在提取文本时得到胡言乱语(G38G43G36G51G5)?
这是因为PDF文档中的字符可以使用自定义编码而不是unicode或ASCII。当您看到乱码文本时,可能意味着正在使用无意义的内部编码。访问文本的唯一方法是使用OCR。这可能是未来的增强功能。
"java.io. IOException:不能处理字体宽度"是什么意思?
这可能意味着“资源”目录不在您的类路径中。Resources目录包含在PDFBox jar中,因此只有在您自己构建PDFBox而不使用二进制文件时才会出现问题。
为什么我在某些文档上得到“您没有提取文本的权限”?
PDF文档具有可以应用于它们的某些安全权限以及与之关联的两个密码,一个用户密码和一个所有者密码。如果设置了“无法提取文本”权限位,那么您需要使用所有者密码解密文档才能提取文本。
我们不能只提取文本而不解析整个文档或在解析时提取文本吗?
不完全是,有几个原因。
- 如果文档是加密的,那么您至少需要解析到加密字典才能解密。
- 有时,PDFont包含文本提取所需的重要信息。
- 页面上的文本不必按阅读顺序绘制。例如:如果页面显示“Hello World”,则可以将pdf编写为绘制“World”,然后光标向左移动并绘制单词“Hello”。
5、PDF渲染
我得到一个OutOfMemoryError。我能做什么?
内存占用取决于PDF本身以及您用于渲染的分辨率。一些可能的选项:
- 启动java时增加
-Xmx
值 - 通过使用此代码加载文件来使用临时文件
Loader.loadPDF(file, IOUtils.createTempFileOnlyStreamCache())
- 通过调用
setSubsamplingAllowed(true)
在您的PDFRenderer
对象激活子采样 - 注意渲染后不要保留图像,例如避免将PDF的所有图像放入
List
- 不要忘记关闭
PDDocument
对象 - 在调用
PDFRenderer.renderImage()
时减小比例,或者在调用PDFRender.renderImageWitDPI()时减小PDFRenderer.renderImageWithDPI()
- 通过调用
PDDocument.setResourceCache()
来禁用PDImageXObject
对象的缓存,该缓存对象派生自DefaultResourceCache
,其调用public void put(COSObject indirect, PDXObject xobject)
不执行任何操作。请注意,这会减慢在几页中具有相同图像(例如公司徽标或背景)的PDF文件的渲染速度。更多关于此的信息可以在PDFBOX-3700中阅读。
为什么有些文本质量差,没有抗锯齿?
这是因为在某些PDF中(例如PDFBOX-2814中的),文本不是 直接渲染,但作为背景的形状裁剪。Java图形不支持“软裁剪” https://bugs.openjdk.java/browse/JDK-4212743,正因为如此,边缘看起来不光滑。 软剪辑可以通过一些额外步骤来实现, 但是这些会花费额外的时间和内存空间。您可以通过以更高的dpi渲染然后缩小图像来获得更高的质量。
如何处理IllegalArgumentException“源光栅带和源颜色空间组件的数量不匹配”?
遗憾的是,这是Java影像中已知的bug。使用依赖项页面中描述的十二个密钥库。
为什么渲染时会出现黑色墨迹、黑色污渍、黑云或黑点?
这是原始java JPEG2000解码器中的bug,您可以在PDFBOX-1752和相关问题中看到此类图像的示例。 使用较新的(1.4.0或更高)jai-imageio-jpeg2000
和jai-imageio-core
解码器,如依赖项页面中所述。
为什么某些PDF的打印速度如此之慢?
如果显示渲染在适当的时间内发生,但没有打印, 那么原因可能是透明元素。Java在打印时渲染这些要慢得多, 看这里有一个 解释,和PDFBOX-3046 以及示例文件的相关问题。
一种解决方法是为PDFPageable
和PDFPrintable
的构造函数使用特定的dpi, 然后PDFBox将渲染成图像 并打印那个。您应该尝试300、600和1200 dpi 命令行应用程序。
2024-08-24(六)
版权声明:本文标题:Apache PDFBox 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726434390h959936.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论