我正在尝试使用此方法修改 pdf(第一个代码块 - 使用 PDFStreamParser 并遍历 PDFOperator,然后在需要时更新 COSString):
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 字符?
编辑:
截屏:
编辑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 );
新问题是,当我用相同的 2 行代码实例化 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/PDFTextStripper.java
我现在正在挖掘更多...