我正在使用PDFBox 2.0.4使用acroForms创建PDF文档。这是我的测试代码示例:
PDDocument document = new PDDocument();
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
PDAcroForm acroForm = new PDAcroForm(document);
document.getDocumentCatalog().setAcroForm(acroForm);
String dir = "../testPdfBox/src/main/resources/fonts/";
PDType0Font font = PDType0Font.load(document, new File(dir + "Roboto-Regular.ttf"));
PDResources resources = new PDResources();
String fontName = resources.add(font).getName();
acroForm.setDefaultResources(resources);
String defaultAppearanceString = format("/%s 12 Tf 0 g", fontName);
acroForm.setDefaultAppearance(defaultAppearanceString);
PDTextField field = new PDTextField(acroForm);
field.setPartialName("SampleField");
field.setDefaultAppearance(defaultAppearanceString);
acroForm.getFields().add(field);
PDAnnotationWidget widget = field.getWidgets().get(0);
PDRectangle rect = new PDRectangle(50, 750, 200, 50);
widget.setRectangle(rect);
widget.setPage(page);
widget.setPrinted(true);
page.getAnnotations().add(widget);
field.setValue("Sample field 123456");
acroForm.flatten();
document.save("target/SimpleForm.pdf");
document.close();
一切正常。但是当我尝试从创建的文档中复制文本并将其粘贴到NotePad或Word时,它就变成了正方形。
我经常搜索这个问题。最流行的答案是创建的PDF中没有toUnicode cmap。所以我用CanOpener for Acrobat探索我的文档:
是的,没有toUnicode cmap,但一切正常,如果不使用acroForm.flatten()。当表单字段没有展平时,我可以从文档中复制/粘贴文本,看起来是正确的。不过,我需要把所有领域都弄平。
所以,我有两个问题:
为什么在展平形式下复制/粘贴文本时出现问题,而且在非展平状态下一切正常?
如何避免文本复制/粘贴问题? 是否只有一个解决方案 - 我自己创建toUnicode CMap,就像this example一样?
我的测试pdf文件可用here。
答案 0 :(得分:1)
请替换
PDType0Font font = PDType0Font.load(document, new File(dir + "Roboto-Regular.ttf"));
与
PDType0Font font = PDType0Font.load(document, new FileInputStream(dir + "Roboto-Regular.ttf"), false);
这可确保字体完整嵌入,而不仅仅作为子集。