文章目录


一、关于 Apache PDFBox


相关教程:

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请在我们的 问题跟踪器


已知限制和问题

请参阅问题跟踪器以获取 已知问题和请求功能的完整列表。更多的 常见问题有:

  1. 您会得到像“G38G43G36G51G5”这样的文本,而不是您在提取文本时所期望的。这是因为字符是一种无意义的内部编码,指向嵌入在PDF文档中的字形。访问文本的唯一方法是使用OCR。这可能是未来的增强功能。
  2. 您会收到如下错误消息java.io.IOException: Can't handle font width 这可能是因为你没有 org/apache/pdfbox/资源目录在类路径中 解决方案是将apache-pdfbox-x. x.x.jar包含在类路径中。
  3. 您得到的文本具有正确的字符,但顺序错误。这可能是因为您没有启用排序。PDF文件中的文本以块的形式存储,这些块不需要按照它们在页面上显示的顺序存储。默认情况下,PDFBox不会对文本进行排序。

LICENSE. txt

集体作品:版权所有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


1、核心组件

在运行时、开发和测试期间需要这些组件,具体取决于以下详细信息。

这三个PDFBox组件分别命名为pdfboxfontboxxmpbox


最低要求

PDFBox具有以下基本依赖项:

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许可不兼容的条款分发的第三方库:


这些库是可选的,如果类路径上存在,将加载这些库,否则将禁用对这些图像格式的支持,并在遇到不受支持的图像时记录警告。

这些组件的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需要来自充气城堡军团的bcprovbcmailbcpkix库。这些可以使用以下依赖项包含在您的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>

命令行参数默认描述
-canAssembletrue设置汇编权限。
-canExtractContenttrue设置提取权限。
-canExtractForAccessibilitytrue设置提取权限。
-canFillInFormtrue设置填写表单权限。
-canModifytrue设置修改权限。
-canModifyAnnotationstrue设置修改注释权限。
-canPrinttrue设置打印权限。
-canPrintFaiitytrue设置打印忠实权限。
-certFile=<certFile>X.509证书文件的路径。
-h,–help显示帮助消息并退出。
-i,--enter=<infile>要加密的PDF文件。
-keyLlong256密钥长度(以位为单位)(有效值: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>

命令行参数默认描述
-alwaysNextfalse进程下一页(如果适用)尽管有IOException(-html时忽略)
-consolefalse发送文本到控制台而不是文件。
-debugfalse启用关于每个阶段的时间消耗的调试输出。
-编码=<编码>UTF-8文本文件的编码类型,例如。UTF-8或ISO-8859-1、UTF-16BE、UTF-16LE等
-encoding=<encoding>整数。MAX_INT要提取的最后一页(基于1,含1)
-h,–help显示帮助消息并退出。
-htmlfalse以超文本标记语言格式输出,而不是原始文本。
-i,--enter=<infile>要加密的PDF文件。
-ignoreBeadsfalse禁用 beads 分隔。
-o,--out=<outfile>导出的文本文件。
-password=[<password>]密钥库中PDF或证书的密码。
-rotationMagicfalse分析每个页面的旋转/倾斜文本,旋转到0°并单独提取(较慢,并在-html时忽略)
-sortfalse在写入之前对文本进行排序。
-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是一些项目的基础,在这种情况下可能会有所帮助。这包括以下项目

您可能还需要考虑使用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.net/browse/JDK-4212743,正因为如此,边缘看起来不光滑。 软剪辑可以通过一些额外步骤来实现, 但是这些会花费额外的时间和内存空间。您可以通过以更高的dpi渲染然后缩小图像来获得更高的质量。


如何处理IllegalArgumentException“源光栅带和源颜色空间组件的数量不匹配”?

遗憾的是,这是Java影像中已知的bug。使用依赖项页面中描述的十二个密钥库。


为什么渲染时会出现黑色墨迹、黑色污渍、黑云或黑点?

这是原始java JPEG2000解码器中的bug,您可以在PDFBOX-1752和相关问题中看到此类图像的示例。 使用较新的(1.4.0或更高)jai-imageio-jpeg2000jai-imageio-core解码器,如依赖项页面中所述。


为什么某些PDF的打印速度如此之慢?

如果显示渲染在适当的时间内发生,但没有打印, 那么原因可能是透明元素。Java在打印时渲染这些要慢得多, 看这里有一个 解释,和PDFBOX-3046 以及示例文件的相关问题。

一种解决方法是为PDFPageablePDFPrintable的构造函数使用特定的dpi, 然后PDFBox将渲染成图像 并打印那个。您应该尝试300、600和1200 dpi 命令行应用程序。


2024-08-24(六)

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部