【发布时间】:2013-04-04 14:06:38
【问题描述】:
我正在尝试使用此方法修改 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
我现在正在挖掘更多...
【问题讨论】:
-
让我们一次拿一个。因此,当您打印包含一些变音符号的文本时,它会显示为 ???还是一些数字?您能否提供一个打印语句的示例以及一些输出?
-
您找到的字符串替换代码here on coderanch 几乎不起作用: 1. PDF 页面内容中字符串的编码完全取决于问题的字体;您的代码采用标准编码。 2. 单个单词的字母(或当前情况下的占位符)可能会在内容流中传播到多个字符串;您的代码不会找到这样的分隔占位符。 3. 字体只能部分嵌入PDF;如果您的替换字符串使用未使用的字符,它们将不会显示。 ...
-
@Eugene :文本显示正确,但变音符号显示为 4 位数的正方形(顶部两个 - 例如 00,底部两个,例如 02)。我无法将输出剪切/粘贴到浏览器中(因为它们将显示为空格),但我将在 Eclipse 控制台中附上带有输出的屏幕截图。
-
@ice13ill 我问的原因是因为我有一个非常相似的事情要做(几乎)阅读和解析包含罗马尼亚字符(也有变音符号)的 pdf。我使用 itext 而不是 pdfbox,效果很好
标签: java pdf utf-8 diacritics pdfbox