java - 复制/粘贴后 PDFBox 文本外观不正确

标签 java pdf pdfbox

我正在使用 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();

一切正常。但是,当我尝试从创建的文档中复制文本并将其粘贴到记事本或 Word 时,它变成了正方形。

􀀷􀁅􀁑􀁔􀁐􀁉􀀄􀁊􀁍􀁉􀁐􀁈􀀄􀀕􀀖􀀗􀀘􀀙􀀚

我搜索了很多关于这个问题的信息。最流行的答案是创建的 PDF 中没有 toUnicode cmap。因此,我使用 CanOpener for Acrobat 浏览我的文档:

enter image description here

是的,没有toUnicode cmap,但是如果不使用acroForm.flatten(),一切都会正常工作。当表单字段未展平时,我可以从文档中复制/粘贴文本,它看起来是正确的。尽管如此,我需要展平所有字段。

所以,我有两个问题:

  1. 为什么以拼合形式复制/粘贴文本会出现问题,而在非拼合形式下一切正常?

  2. 如何避免文本复制/粘贴出现问题? 是否只有一种解决方案 - 由我自己创建 toUnicode CMap,就像 this example 中那样?

我的测试 pdf 文件可用 here

最佳答案

请更换

PDType0Font font = PDType0Font.load(document, new File(dir + "Roboto-Regular.ttf"));

PDType0Font font = PDType0Font.load(document, new FileInputStream(dir + "Roboto-Regular.ttf"), false);

这可确保字体完整嵌入,而不仅仅是作为子集。

关于java - 复制/粘贴后 PDFBox 文本外观不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48545324/

相关文章:

java - 如何使用 PDFBOX 将覆盖添加到已签名的 PDF 而不使第一个签名无效?

java - JGroups ipAddress 已在魔力 map 中;请确保所有 key 都是唯一的

java - 在java代码中频繁提交插入数据库是一个好习惯吗?

java - 如何在带有 iText 的多行 AcroFields 中使用制表符?

reactjs - 如何在 react-to-print 中使用分页符?

java - 如何使用 PDFBox 2.0 创建单选按钮组

java - 无法序列化 session 的 session 属性 SPRING_SECURITY_CONTEXT

java - 查找包含某个单词而没有其他单词的行

c# - 使用 PDFsharp 连接 PDF 返回空 PDF

java - 如何在 PDFTextStripperByArea 中定义区域?