Apache PDFBox

文章目录

    • 一、关于 Apache PDFBox
      • 二进制下载
      • 构建
      • 贡献
      • 支持
      • 已知限制和问题
      • 许可证(另见[LICENSE. txt](https://github.com/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.com/apache/pdfbox
  • 官网:https://pdfbox.apache.org/
  • Java API : https://javadoc.io/doc/org.apache.pdfbox/pdfbox/latest/index.html

相关教程:

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文档 或者在GitHub上。

支持

请遵循我们支持页面上的指南。

如果您对如何使用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具有以下基本依赖项:

  • 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需要来自充气城堡军团的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是一些项目的基础,在这种情况下可能会有所帮助。这包括以下项目

  • 盒装的
  • 盒子桌
  • 易用的
  • 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.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(六)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

密码生成器(HTML+CSS+JavaScript)

&#x1f30f;个人博客主页&#xff1a;心.c ​ 前言&#xff1a;前两天写了密码生成器&#xff0c;现在跟大家分享一下&#xff0c;大家如果想使用随便拿&#xff0c;如果哪里有问题还请大佬们给我指出&#xff0c;感谢支持 &#x1f525;&#x1f525;&#x1f525;专题文章&…

MySQL 的半同步模式

目录 1 半同步简介: 解决主从数据一致性问题 2 实现半同步模式实践操作 2.1 MASTER 2.2 SLAVE 1 2.3 SLAVE 2 2.4 查看client链接状态 2.5 SLAVE 服务器故障模拟 2.5.1 停止 SLAVE 的 IO_THREAD 2.5.2 查看SLAVE 的IO线程是否关闭 2.5.3 查看 MASTER 上 client 的连接状态…

在树莓派5上使用pytroch进行模型训练—全流程笔记

在树莓派上运行pytroch模型&#x1f680; 在完成了树莓派的一系列基础配置学习之后&#xff0c;按照规划&#xff0c;下一步要做的就是在树莓派上安装一个pytorch&#xff0c;尝试运行一下深度学习的模型&#xff0c;如果可以实现且准速度有一定保证的话&#xff0c;就可以作为…

使用Qt+Visual Stuidio写一个简单的音乐播放器(1)

1.使用QMediaPlayer播放音乐 第三步:在代码头部加上: #include <QtMultimedia/QMediaPlayer> // VS向.pro文件添加代码的方式 #pragma execution_character_set("utf-8") // qt支持显示中文 QMediaPlayer类是一个高级媒体播放类。它可以用来播放歌曲、电…

java:获取桥接方法的参数名

如果一个方法是桥接方法&#xff0c;那么因为这个方法是由编译器自动生成的&#xff0c;所以它的方法参数名是无意的arg0,arg1。。。 如果要直接通过Method.getParameters(),得到的Pamameter对象中的name就是这些意义的名字。 所以对于一个由编译器生成的桥接方法&#xff0c;如…

常见的视频监控RTSP RTMP 流媒体协议及开发测试工具

一 流媒体协议 RTMP (Real-Time Messaging Protocol): 封装格式&#xff1a;FLV 或 MP4协议&#xff1a;TCP端口&#xff1a;默认2200厂家&#xff1a;Adobe Systems特点&#xff1a;实时性强&#xff0c;延迟低&#xff0c;支持服务器端的推流和拉流。应用&#xff1a;主要用…

超分CAMixerSR 使用笔记

目录 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: 设置预训练模型: 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: codes/basicsr改为codes/basicsr_m 设置预训练模型: path:pretrain_network_g: F:\project\chaofen\CAMixerSR-main\pretrained_mode…

C++初学(14)

14.1、while循环 和for循环相比&#xff0c;while循环没有初始化和更新部分&#xff0c;它只有测试条件和循环体。 while(text-condition)body首先程序计算圆括号内的测试条件&#xff08;text-condition&#xff09;表达式。如果该表达式为ture&#xff0c;则执行循环体中的…

vue3编程 -动态多开模态框实现方案

页面按需弹出多个模态框&#xff1a; 一、v-for方案&#xff1a; 采用v-for提前生成多个模态框实例&#xff0c;采用这种方案的案例社区已经很多 二、采用h函数方案&#xff1a; 代码如下&#xff0c;代码可运行&#xff1a; 基本思路&#xff1a; 1. 封装模态框组件DialogMo…

Docker快速上手

Docker 前言一、基本组成二、常用命令2.1 Docker服务2.2 image相关命令2.3 Container相关命令 三、Docker Volume 容器卷3.1 匿名挂载3.2 具名挂载 四、Docker 网络模式4.1 bridge桥接模式4.2 host主机模式4.3 None模式4.4 Container模式4.5 Customer模式 前言 本篇文章不再赘…

读软件开发安全之道:概念、设计与实施08密码学(下)

1. 对称加密 1.1. symmetric encryption 1.2. 使用各方共享的密钥来隐藏数据 1.2.1. 对称加密在本质上依赖共享密钥 1.3. 所有加密都是通过对明文进行转换&#xff0c;把明文消息&#xff08;或者原始消息&#xff09;变成无法识别的形式&#xff08;也称为密文&#xff09…

LeetCode 热题100-69 有效的括号

有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相…

我的CSDN-----第128天创作纪念日

机缘 起初的我&#xff0c;是为了在学习代码的过程中通过写博客的方式来巩固自己的知识。后来在遇到不会的问题时可以在csdn上面查找&#xff0c;寻求一点思路&#xff0c;将学到的知识通过博客的方式呈现出来。 收获 每当发布一篇博客后&#xff0c;就会收到很多人的评论加关…

Adobe Animate (AN)软件安装,硬件配置(附安装包)

目录 一、Adobe An 软件简介 Adobe An 软件的特点 Adobe An 软件的优势 下载 二、Adobe An 软件安装 安装前的准备工作 安装过程中的注意事项 安装后的设置 三、Adobe An 软件使用 高级动画技巧 交互设计 优化与性能提升 四、Adobe An 软件快捷键 选择工具快捷键…

Linux 下命令行参数和环境变量

Linux 下命令行参数和环境变量 命令行参数为什么要有命令行参数谁可以做到结论 环境变量一些现象查看环境变量添加环境变量添加内存级环境变量永久有效 其他环境变量HOMEPWDSHELLHISTSIZE 自定义环境变量定义取消 本地变量整体理解环境变量环境变量的组织方式Linux 代码获取环境…

31. 高度过渡 带粘性分区标题的列表

高度过渡 当元素的高度未知时,将元素的高度从 0 过渡到 auto。 使用 transition 指定 max-height 的变化应该被过渡。使用 overflow: hidden 防止隐藏元素的内容溢出其容器。使用 max-height 指定 0 的初始高度。使用 :hover 伪类将 max-height 更改为由 JavaScript 设置的 --…

【机器人学】7-2.六自由度机器人自干涉检测-计算圆柱体的上下圆心坐标【附MATLAB代码】

目录 前言 机械臂几何参数 机器等效圆柱体坐标确定 MATLAB代码 前言 上一章介绍了机器人自干涉检测的总体算法&#xff0c;提出了算法的三个核心&#xff1a; 一 根据机械臂的几何数据以及DH参数&#xff0c;确定机械臂等效的圆柱体的上下圆心坐标。 二 将一个圆柱体旋转到…

网络攻击原理及过程

网络攻击原理表 攻击者 内容 攻击访问 攻击效果 攻击意图 黑客 挑战 间谍 用户命令 破坏信息 好奇 恐怖主义者 脚本或程序 本地访问 信息泄密 获取情报 公司职员 自治主体 远程访问 窃取服务 经济利益 职业犯罪分子 电磁泄露 拒绝服务 恐怖事…

CSS3 3D 转换

CSS3 3D 转换 CSS3 3D 转换是一种强大的技术,它允许开发者创建出令人印象深刻的3D视觉效果,而无需复杂的JavaScript或第三方库。通过使用CSS3的3D转换功能,设计师可以轻松地将元素旋转、倾斜、移动或缩放,以创建出深度和透视感。在本文中,我们将探讨CSS3 3D转换的基础知识…

python 压力测试脚本

需求&#xff1a; 生成一个12位不重复的随机数将随机数赋值给Json 串中的 orderCode字段将Json用ECB 指定 key为bJXQezYtR4ZSNK4p进行加密并作为值传给{ “data”: “” }设置每秒30个并发持续1分钟调用接口接口输出测试测试报告 代码示例 import json import random import…