嘗試使用Apache PDFBox 2.0.2版替換文本(使用下面的代碼)會生成一個輸出,其中很少的字符不會顯示,大多數情況下是大寫Case字符。例如,用「ABCDEFGHIJKLMNOPQRSTUVWXYZ」替換「pdf」中的輸出爲「ABCDEF HIJKLM OP RST W Y」。這是一些錯誤?或者我們有一些解決方法來處理這些字符。Apache PDFBox替換文本結果中的幾個字符錯過
public static PDDocument replaceText(PDDocument document, String searchString, String replacement) throws IOException {
if (StringUtils.isEmpty(searchString) || StringUtils.isEmpty(replacement)) {
return document;
}
PDPageTree pages = document.getDocumentCatalog().getPages();
for (PDPage page : pages) {
PDFStreamParser parser = new PDFStreamParser(page);
parser.parse();
List tokens = parser.getTokens();
for (int j = 0; j < tokens.size(); j++) {
Object next = tokens.get(j);
if (next instanceof Operator) {
Operator op = (Operator) next;
//Tj and TJ are the two operators that display strings in a PDF
if (op.getName().equals("Tj")) {
// Tj takes one operator and that is the string to display so lets update that operator
COSString previous = (COSString) tokens.get(j - 1);
String string = previous.getString();
string = string.replaceFirst(searchString, replacement);
previous.setValue(string.getBytes());
} else if (op.getName().equals("TJ")) {
COSArray previous = (COSArray) tokens.get(j - 1);
for (int k = 0; k < previous.size(); k++) {
Object arrElement = previous.getObject(k);
if (arrElement instanceof COSString) {
COSString cosString = (COSString) arrElement;
String string = cosString.getString();
string = StringUtils.replaceOnce(string, searchString, replacement);
cosString.setValue(string.getBytes());
}
}
}
}
}
// now that the tokens are updated we will replace the page content stream.
PDStream updatedStream = new PDStream(document);
OutputStream out = updatedStream.createOutputStream();
ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
tokenWriter.writeTokens(tokens);
page.setContents(updatedStream);
out.close();
}
return document;
}
您的問題與[此問題]相同(https://stackoverflow.com/q/34239106/1729265),其中使用的PDF庫有iText。 [我的答案](https://stackoverflow.com/a/34315962/1729265)中的大部分也適用於此。 – mkl
感謝@mkl,很好,精心製作了一個..我試圖處理你的建議,如果可能的話,仍然想用PDFbox解決方案。 –
我不想讓你用iText代替PDFBox。我的意思是「我的許多答案也適用於此。」是解釋問題發生的原因,這些解釋是獨立於圖書館的,它們基於PDF的工作原理。 – mkl