PDFBox和中文字符

时间:2015-10-12 08:38:22

标签: java pdf pdfbox

我正在使用pdfbox 1.8,我正在尝试填写带有中文字符的pdf表单,但我得到的只是奇怪的字符。我有一个ttc文件(uming.ttc)并使用font forge我导出了ttf文件(现在我尝试只使用其中一种导出的字体)。

使用

加载字体
    InputStream is = ..
    PDTrueTypeFont font = PDTrueTypeFont.loadTTF(doc, is);

我正在使用以下代码编写pdf字段(我在stackoverflow中找到了这个代码,但目前我无法找到它)

    protected void setPDFFieldAndFont(String fieldName, String keyFontName, Object... values) {
    try {
        PDField pdField = pdfForm.getField(fieldName);
        if (pdField == null) {
            return;
        }
        // append fields to create a new textfield
        Filler filler = new Filler();
        filler.append(values);
        String textFieldString = filler.toString();
        String fontName = key2FontName.get(keyFontName);
        COSDictionary dict = pdField.getDictionary();
        COSString defaultAppearance = (COSString) dict
                .getDictionaryObject(COSName.DA);
        if (defaultAppearance != null)
        {
            dict.setString(COSName.DA, "/" + fontName + " 11 Tf");
        }
        if (pdField instanceof PDTextbox)
        {
            PDTextbox textbox = new PDTextbox(pdfForm, dict);
            //PDTextbox textbox = (PDTextbox) pdField;
            textbox.setValue(textFieldString);

        }
    } catch (IOException e) {
        throw new IllegalStateException("Invalid field name: " + fieldName, e);
    }
}

我已经读过pdfbox2.0支持unicode我需要使用这个新版本吗?

使用font-forge我看到我的ttf字体编码为ISO-10646-1。

感谢您的帮助

EDITED

正如Tilman Hausherr所说,我尝试了EmbeddedFonts.java并且它工作正常,但我以不同的方式填写表单。我创建了一个主要样本:

public static void main(String[] args)  throws IOException {

    String pdfform = "D:\\form.pdf";

    PDDocument doc = PDDocument.load(new File(pdfform));
    PDType0Font font = PDType0Font.load(doc, new File("D:\\fonts\\UMingCN.ttf"));
    PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();

    PDResources res = acroForm.getDefaultResources();
    if (res == null){
        res = new PDResources();
    }
    COSName fontName = res.add(font);
    acroForm.setDefaultResources(res);



    PDField pdField = acroForm.getField("personalInformation_fullName");
    if (pdField == null) {
        return;
    }
    COSDictionary dict = pdField.getCOSObject();
    COSString defaultAppearance = (COSString) dict.getDictionaryObject(COSName.DA);
    if (defaultAppearance != null)
    {
        dict.setString(COSName.DA, "/" + fontName.getName() + " 11 Tf");
    }
    if (pdField instanceof PDTextField)
    {
        PDTextField textbox = new PDTextField(acroForm);
        textbox.getCOSObject().addAll(dict);

        textbox.setValue("保保保");
    }

    doc.save("example2.pdf");
    doc.close();
}

但它没有填充任何东西。在调试中,代码转到textbox.setValue,但保存的pdfform没有在pdf中设置的值。 可能我错过了什么......

再次感谢

0 个答案:

没有答案