使用 PDFBox 将西里尔字符写入 PDF 表单字段

rop*_*opo 5 java pdf fonts acrobat pdfbox

我正在使用 pdfbox 2.0.5 使用以下代码填写 PDF 文档的表单字段:

        doc = PDDocument.load(inputStream);
        PDDocumentCatalog catalog = doc.getDocumentCatalog();
        PDAcroForm form = catalog.getAcroForm();
        for (PDField field : form.getFieldTree()){
            field.setValue("??????");
        }
Run Code Online (Sandbox Code Playgroud)

我收到此错误:U+0434 ('afii10069') 在此字体中不可用 Times-Roman (generic: TimesNewRomanPSMT) encoding: StandardEncoding with Difference

PDF 文档本身包含显示正常的西里尔文文本。我试过使用不同的字体。对于“Arial Unicode MS”,它需要下载一个 50MB 的“Adobe Acrobat Reader DC 字体包”。这是对西里尔字符的要求吗?

我必须在文本字段中指定哪种字体来处理西里尔文(或亚洲)字符?

谢谢,罗波

Mar*_*oun 4

Adobe 通过重用 {/Ubuntu} 字体中的嵌入字体文件来处理该问题,并从中创建新的字体资源。这是一个快速技巧,可以作为如何实现类似目标的指南。该代码特定于我得到的示例。

\n\n
PDDocument doc = PDDocument.load(new File(...));\nPDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();\nPDResources formResources = acroForm.getDefaultResources();\nPDTrueTypeFont font = (PDTrueTypeFont) formResources.getFont(COSName.getPDFName("Ubuntu"));\n\n// here is the \'magic\' to reuse the font as a new font resource\nTrueTypeFont ttFont = font.getTrueTypeFont();\n\nPDFont font2 = PDType0Font.load(doc, ttFont, true);\nttFont.close();\n\nformResources.put(COSName.getPDFName("F0"), font2);\n\nPDTextField formField = (PDTextField) acroForm.getField("Text2");\nformField.setDefaultAppearance("/F0 0 Tf 0 g");\nformField.setValue("\xc3\xb6\xc3\xa4\xc3\xbc\xd0\xb8\xd0\xbd\xd1\x84\xd0\xbe\xd1\x80\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8e");\n\ndoc.save(...);\ndoc.close();\n
Run Code Online (Sandbox Code Playgroud)\n