【发布时间】:2015-03-23 20:54:04
【问题描述】:
我正在尝试使用 Java 中的 PDFBox 编辑 pdf 的某些内容。问题是,每当我编辑 pdf 中的任何字符串并尝试使用 Adobe Reader 打开它时,最后一行都不会出现在新呈现的 pdf 中。
当我尝试直接从浏览器顶部打开呈现的 pdf 时,我能够看到最后一行。但是,它以不同的格式编码。我正在使用以下代码来编辑 pdf 的内容:
PDDocument doc = PDDocument.load(FileName);
PDPage page = (PDPage) doc.getDocumentCatalog().getAllPages().get(0);
PDStream contents = page.getContents();
PDFStreamParser parser = new PDFStreamParser(contents.getStream());
parser.parse();
List<Object> tokens = parser.getTokens();
for (int j = 0; j < tokens.size(); j++) {
Object next = tokens.get(j);
if (next instanceof PDFOperator) {
PDFOperator op = (PDFOperator) next;
if (op.getOperation().equals("Tj")) {
COSString previous = (COSString) tokens.get(j - 1);
String string = previous.getString();
string = string.replace("@ordnum&", (null != data.getOrderNumber()?data.getOrderNumber():""));
string = string.replace("@shipid&", (null != data.getShipmentId()?data.getShipmentId():""));
string = string.replace("@customer&", (null != data.getCustomerNumber()?data.getCustomerNumber():""));
string = string.replace("@fromname&", (null != data.getFromName()?data.getFromName():""));
tokens.set(j - 1, new COSString(string.trim()));
}
}
}
编辑 pdf 会删除显示“有问题?...”的行。这里有什么问题?我做错了吗?
谢谢。
【问题讨论】:
-
我做错了什么吗? - 是的:您认为
COSString的内容是易于编辑的字符串。一般来说,他们不是。它们可能具有自定义的单字节或多字节编码。在您的情况下,底线是唯一使用特殊编码进行编码的底线。而你的编辑会破坏它, -
但是我没有对那个 COSString 做任何事情。当我尝试打印字符串时,我看不到那条线。那么它不应该按原样出现吗?如果没有,我该如何处理/处理?我是 PDFBox 新手,所以对它了解不多。
-
但我没有对那个 COSString 做任何事情 - 是的,你做了。您将其转换为 Java 字符串 (
previous.getString()),您可以对其进行修剪并从 (new COSString(string.trim())) 构建一个新的 COSString,以替换原始字符串。在某些编码的情况下,这可能会完全破坏字符串。 如果没有,我该如何处理/处理 - PDF 内容根本不应该像这样编辑,无论是在 PDFBox 还是在其他 PDF 库中。考虑使用 PDF 表单域。