如何使用PDFBox 2.0查找並替換PDF文檔中的文本,他們拉動了舊的示例,它的語法不再起作用,因此我在想如果它仍然有可能,最好的方法是去做。謝謝!PDFBox 2.0 RC3 - 查找和替換文本
2
A
回答
3
你可以嘗試這樣的:
public static PDDocument replaceText(PDDocument document, String searchString, String replacement) throws IOException {
if (Strings.isEmpty(searchString) || Strings.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;
}
1
我花在想出了一個解決方案的時間和最終獲取的Acrobat DC訂閱,這樣我可以爲文本創建字段作爲佔位符是更換。在我的情況下,這些字段是用於客戶信息和訂單詳細信息,因此它不是非常複雜的數據,但該文檔充滿了業務相關條件的頁面,並且佈局非常複雜。
然後我只是做了這個,這可能適合你。
private void update() throws InvalidPasswordException, IOException {
Map<String, String> map = new HashMap<>();
map.put("fieldname", "value to update");
File template = new File("template.pdf");
PDDocument document = PDDocument.load(template);
List<PDField> fields = document.getDocumentCatalog().getAcroForm().getFields();
for (PDField field : fields) {
for (Map.Entry<String, String> entry : map.entrySet()) {
if (entry.getKey().equals(field.getFullyQualifiedName())) {
field.setValue(entry.getValue());
field.setReadOnly(true);
}
}
}
File out = new File("out.pdf");
document.save(out);
document.close();
}
因人而異
+1
使用AcroForm字段確實是應該如何完成PDF填充。但是你不需要Acrobat來創建字段,你也可以用PDFBox來做到這一點...(雖然沒有好的GUI) – mkl
+0
Thx @mkl,我意識到可以使用pdfbox創建字段,但我可以沒有弄清楚如何將它們放在文檔中的確切位置。 –
相關問題
- 1. 查找和替換文本
- 2. 查找和文本文件替換
- 3. 查找和替換腳本
- 4. 如何查找和替換文本?
- 5. 查找和替換c中的文本#
- 6. Java的查找和替換文本
- 7. 用PHPWord查找和替換文本
- 8. jQuery的查找和替換文本
- 9. PHPStorm - 查找和選擇替換文本?
- 10. 使用PDFBox替換PDF文本
- 11. 查找和替換文件
- 12. PDFBOX文本換行
- 13. 查找和替換
- 14. 查找和替換
- 15. 查找和替換
- 16. 查找和替換
- 17. 查找和替換:\」
- 18. 查找並替換文本等文字
- 19. 查找 - 替換文本框和表格中包含的文本
- 20. VB腳本查找和替換Word文檔中的文本
- 21. 查找和替換 - Google表格腳本
- 22. 在shell腳本中查找和替換
- 23. 使用記事本查找和替換++
- 24. 批處理腳本查找和替換
- 25. 記事本++查找和替換
- 26. 查找和替換函數的腳本
- 27. 記事本+ +定期查找和替換
- 28. 查找和替換爲textWrangler腳本
- 29. 查找和替換空行記事本++
- 30. RegEx查找和替換Y文本和Z文本之間的X文本
那個老例子實際上只有在非常簡單的PDF工作並沒有改變或者(更糟糕的)損壞更復雜的。 – mkl