我正在尝试使用此方法修改 pdf(第一个代码块 - 使用 PDFStreamParser 并迭代 PDFOperator,然后在需要时更新 COSString):
http://www.coderanch.com/t/556009/open-source/PdfBox-Replace-String-double-pdf http://www.coderanch.com/t/556009/open-source/PdfBox-Replace-String-double-pdf
我遇到了一些 UTF-8 字符(变音符号)的问题:当我打印要更新的文本时,它显示为“Societ??ii Na?ionale”(其中“?”是类似 0002 或 0004 的代码) )。
有趣的是:
- 当我编写更新的 pdf 文件时,字符显示正确(即使我无法检测并替换它们)
- 如果我尝试使用 PDFTextStripper 的 getText(...) 剥离文本,则文本将被完美提取。
- 我尝试了 2 个 pdfbox 版本:1.5.0(其行为如上所述)和 1.8.1(最终的书面 pdf 文件无法正确显示特殊字符,并且文档中出现“空”字符串)
我可以为用于更新 pdf 的类做什么(配置)(或者至少尝试...)以便正确显示所有 UTF-8 字符?
EDIT:
Screenshot:
EDIT 2:
我搜索了 PDFTextStripper 及其超类中的 pdfbox 源代码,发现了文本是如何提取的:
在 processStream 方法的开头,我们有
graphicsState = new PDGraphicsState(aPage.findCropBox());
当剥离 processEncodedText 中的文本时,使用 PDFont 类的实例,如下所示:
final PDFont font = graphicsState.getTextState().getFont();
文本是从 byte[] 中提取的:
String c = font.encode( string, i, codeLength );
新问题是,当我使用相同的两行代码实例化 PDFont 类时,我得到一个“null”字体类,因此我无法使用 .encode(...) 方法。
这些类的源代码在这里:http://grepcode.com/file/repo1.maven.org/maven2/org.apache.pdfbox/pdfbox/1.5.0/org/apache/pdfbox/util/PDFStreamEngine.java http://grepcode.com/file/repo1.maven.org/maven2/org.apache.pdfbox/pdfbox/1.5.0/org/apache/pdfbox/util/PDFStreamEngine.java and http://grepcode.com/file/repo1.maven.org/maven2/org.apache.pdfbox/pdfbox/1.5.0/org/apache/pdfbox/util/PDFTextStripper.java http://grepcode.com/file/repo1.maven.org/maven2/org.apache.pdfbox/pdfbox/1.5.0/org/apache/pdfbox/util/PDFTextStripper.java
我现在正在挖掘更多...