赞
踩
相关教程:
https://blog.csdn.net/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有任何疑问,请在 用户邮件列表。 这会让你得到整个社区的帮助。
源代码中的PDFBox示例和测试代码也将提供附加信息。
网站上还有额外的资源,例如 堆栈溢出。
如果您确定您发现了bug请在我们的 问题跟踪器。
请参阅问题跟踪器以获取 已知问题和请求功能的完整列表。更多的 常见问题有:
java.io.IOException: Can't handle font width
这可能是因为你没有 org/apache/pdfbox/资源目录在类路径中 解决方案是将apache-pdfbox-x. x.x.jar包含在类路径中。集体作品:版权所有2015 Apache软件基金会。
根据一项或多项贡献者许可协议授权给Apache软件基金会(ASF)。有关版权所有权的更多信息,请参阅随本作品分发的通知文件。ASF根据Apache许可证2.0版(“许可证”)将此文件授权给您;除非符合许可证,否则您不得使用此文件。您可以在 https://www.apache.org/licenses/LICENSE-2.0 获取许可证副本:
除非适用法律要求或书面同意,根据许可证分发的软件按“原样”分发,没有任何明示或暗示的保证或条件。有关许可证下管理权限和限制的特定语言,请参阅许可证。
此发行版包括加密软件。其中的国家 您目前居住的可能对进口、拥有、使用、 和/或再出口到另一个国家的加密软件。在使用之前 任何加密软件,请查看您所在国家/地区的法律、法规和 关于进口、拥有、使用和再出口的政策 加密软件,看看是否允许。看 https://www.wassenaar.org更多信息。
美国政府商务部工业和安全局(BIS)将该软件归类为出口商品管制号(ECCN)5D002. C.1,其中包括使用或执行具有非对称算法的加密功能的信息安全软件。此Apache软件基金会发行版的形式和方式使其有资格根据许可例外ENC技术软件无限制(TSU)例外(见BIS出口管理条例,第740.13节)对目标代码和源代码进行出口。
以下提供了有关随附加密软件的更多详细信息:
Apache PDFBox使用Java密码体系结构(JCA)和充气城堡库来处理PDF文档中的加密。
本文翻译整理自:https://pdfbox.apache.org/3.0/dependencies.html
在运行时、开发和测试期间需要这些组件,具体取决于以下详细信息。
这三个PDFBox组件分别命名为pdfbox
、fontbox
和xmpbox
。
PDFBox具有以下基本依赖项:
Commons Logging 是不同日志框架的通用包装器,因此您还需要使用日志库,如log4j 或者让公共日志回退到标准的java. util.log API 纳入Java平台。
对于PDFBox预检测试只需要 Comms-io 2.4。
字体处理需要 fontbox 组件。
为了支持XMP元数据,需要 xmpbox 组件。
要将pdfbox、fontbox、xmpbox和公共日志记录jar添加到您的应用程序中,最简单的方法是声明如下所示的Maven依赖项。这将直接为您提供主pdfbox库,并将其他所需的jar作为传递依赖项。
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>...</version>
</dependency>
将version字段设置为最新的稳定PDFBox版本。
PDFBox 并未启用所有功能。第三方组件是获得对某些功能的完全支持所必需的。
PDF支持嵌入式图像文件,但是对某些格式的支持需要根据与Apache 2.0许可不兼容的条款分发的第三方库:
这些库是可选的,如果类路径上存在,将加载这些库,否则将禁用对这些图像格式的支持,并在遇到不受支持的图像时记录警告。
这些组件的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
要使用最新版本,您需要添加以下依赖项:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.2</version>
</dependency>
自 PDFBox2.0.4
PDFBox 2.0.4 引入了新的命令行设置
-Dorg.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true
这可能会提高在某些系统上渲染PDF的性能,尤其是当页面上有很多图像时。
PDFBox 带有一系列命令行实用程序。它们可作为标准Java应用程序使用。
有关如何设置类路径以便运行的说明,请参阅依赖项页面 PDFBox工具作为Java应用程序。
此应用程序将解密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 | 打印版本信息并退出。 |
此应用程序将加密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 | 打印版本信息并退出。 |
此应用程序将从给定的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 | 打印版本信息并退出。 |
此应用程序将从给定的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 | 打印版本信息并退出。 |
此应用程序将用另一个文档的内容覆盖一个文档
用法: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
此应用程序将采用现有的PDF文档,并允许分析和检查内部结构。它被用作2.0.0中删除的PDFReader的替代品。
用法:java -jar pdfbox-app-3.y.z.jar debug [inputfile]
命令行参数 | 描述 |
---|---|
输入文件 | 要打开的可选PDF文件的名称。 |
-h,–help | 显示帮助消息并退出。 |
-password=[<password>] | 密码以删除PDF。 |
-viewstructure | 在启动时激活“视图结构”视图。 |
此应用程序将获取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 | 打印版本信息并退出。 |
此应用程序将获取现有的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个页面此应用程序将为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 | 打印版本信息并退出。 |
此应用程序将向打印机发送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 | 打印版本信息并退出 |
此应用程序将从文本文件创建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
:
解压缩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 | 打印版本信息并退出。 |
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>
不!一次只能有一个线程访问单个文档。您可以有多个线程,每个线程都访问它们自己的PDDocument对象。
您需要在最终块中的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()
,后者只返回根级别的字段。
java.lang.IllegalArgumentException: ... is not available in this font's encoding: WinAnsiEncoding
通过查看 PDF Specification 附录D 来检查字符是否在WinAnsiEncoding中可用。
如果没有,但如果此字体可用(在windows中,使用charmap.exe查看),则使用 PDType0Font.load()
加载字体,另请参阅源代码下载中的 EmbeddedFonts.java示例。
感谢捐款,我们支持孟加拉语和拉丁语自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回答如何解决此问题。
我想使用PDFBox创建一个包含多个段落、表格、图像等的复杂布局。PDFBox适合这个目的吗?
PDFBox是一个低级的PDF库,提供了创建页面内容(如文本、图像等)的API。但是在这个时候,它没有提供更高级别的API来进行页面布局、段落处理、自动换行或创建表格等。
但是PDFBox是一些项目的基础,在这种情况下可能会有所帮助。这包括以下项目
您可能还需要考虑使用Apache FOP,它允许从XML数据和模板创建复杂的文档-
确保在保存之前关闭了内容流。
默认情况下,文本提取的顺序与PDF页面内容流中的文本相同。 PDF是一种图形格式,而不是文本格式,与超文本标记语言不同,它不要求页面上的文本 以一定的顺序呈现。顺序是由创建PDF的软件确定的。 要将文本从左到右,从上到下排序,请使用setSortByPosition(true)
。
从pdf文档中提取文本是一项复杂的任务,涉及许多因素会影响文本提取的可能性和准确性。如果您可以尝试几件事,这将对PDFBox团队有所帮助。
这是因为PDF文档中的字符可以使用自定义编码而不是unicode或ASCII。当您看到乱码文本时,可能意味着正在使用无意义的内部编码。访问文本的唯一方法是使用OCR。这可能是未来的增强功能。
这可能意味着“资源”目录不在您的类路径中。Resources目录包含在PDFBox jar中,因此只有在您自己构建PDFBox而不使用二进制文件时才会出现问题。
PDF文档具有可以应用于它们的某些安全权限以及与之关联的两个密码,一个用户密码和一个所有者密码。如果设置了“无法提取文本”权限位,那么您需要使用所有者密码解密文档才能提取文本。
不完全是,有几个原因。
内存占用取决于PDF本身以及您用于渲染的分辨率。一些可能的选项:
-Xmx
值Loader.loadPDF(file, IOUtils.createTempFileOnlyStreamCache())
setSubsamplingAllowed(true)
在您的PDFRenderer
对象激活子采样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.net/browse/JDK-4212743,正因为如此,边缘看起来不光滑。 软剪辑可以通过一些额外步骤来实现, 但是这些会花费额外的时间和内存空间。您可以通过以更高的dpi渲染然后缩小图像来获得更高的质量。
遗憾的是,这是Java影像中已知的bug。使用依赖项页面中描述的十二个密钥库。
这是原始java JPEG2000解码器中的bug,您可以在PDFBOX-1752和相关问题中看到此类图像的示例。 使用较新的(1.4.0或更高)jai-imageio-jpeg2000
和jai-imageio-core
解码器,如依赖项页面中所述。
如果显示渲染在适当的时间内发生,但没有打印, 那么原因可能是透明元素。Java在打印时渲染这些要慢得多, 看这里有一个 解释,和PDFBOX-3046 以及示例文件的相关问题。
一种解决方法是为PDFPageable
和PDFPrintable
的构造函数使用特定的dpi, 然后PDFBox将渲染成图像 并打印那个。您应该尝试300、600和1200 dpi 命令行应用程序。
2024-08-24(六)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。