U + FFFD在此字体的编码中不可用:WinAnsiEncoding

时间:2016-09-27 08:55:28

标签: java encoding pdfbox

我正在使用PDFBox 2.0.1。

我尝试动态地将一些(用户提供的)UTF8文本添加到表单字段,并将结果显示给用户。不幸的是,pdf库无法正确编码特殊字符,例如“äöü”...或者我找不到任何有用的文档可以帮助我解决这个问题。

有人能告诉我给定代码示例有什么问题吗?

try (PDDocument document = PDDocument.load(pdfTemplate)) {
    PDDocumentCatalog catalog = document.getDocumentCatalog();
    PDAcroForm form = catalog.getAcroForm();

    List<PDField> fields = form.getFields();
    for (PDField field : fields) {
        switch (field.getPartialName()) {
            case "devices":
                // Frontend (JS): userInput = btoa('Gerät')
                String userInput = ...
                String name = new String(Base64.getDecoder().decode(base64devices), "UTF-8");
                field.setReadOnly(true);
                break;
        }
    }
    form.flatten(fields, true);
    document.save(bos);
}

这里是错误的堆栈跟踪:

java.lang.IllegalArgumentException: U+FFFD is not available in this font's encoding: WinAnsiEncoding
    org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.encode(PDTrueTypeFont.java:368)
    org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:286)
    org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:315)
    org.apache.pdfbox.pdmodel.interactive.form.PlainText$Paragraph.getLines(PlainText.java:169)
    org.apache.pdfbox.pdmodel.interactive.form.PlainTextFormatter.format(PlainTextFormatter.java:182)
    org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.insertGeneratedAppearance(AppearanceGeneratorHelper.java:373)
    org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceContent(AppearanceGeneratorHelper.java:237)
    org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.setAppearanceValue(AppearanceGeneratorHelper.java:144)
    org.apache.pdfbox.pdmodel.interactive.form.PDTextField.constructAppearances(PDTextField.java:263)
    org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm.refreshAppearances(PDAcroForm.java:324)
    org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm.flatten(PDAcroForm.java:213)
    my.application.service.PDFService.generatePDF(PDFService.java:201)

我还在SO上找到了那些(相关的)问题:

pdfbox: ... is not available in this font's encoding 但这并没有帮助我选择正确的编码或如何。 IIRC Java内部使用UTF16进行字符编码,为什么默认值不够? 这是PDF文档本身的问题还是我用来设置它的代码?

PdfBox encode symbol currency euro 那么它的动态用户输入,所以有很多方法可以替换我自己。

  

因此,如果PDFBox人员决定修复损坏的PDFBox方法,这里看似干净的解决方法代码将开始失败,因为它会提供固定方法损坏的输入数据。

     

不可否认,我怀疑他们会在2.0.0之前修复这个错误(并且在2.0.0中固定方法有不同的名称),但是人们永远不会知道......

不幸的是我无法找到这个其他的setter方法,但它也可能适用于它的不同范围。

修改

更新了示例代码以更好地表示问题。

1 个答案:

答案 0 :(得分:1)

U + FFFD用于替换Unicode中未知或不可代表值的传入字符,比较使用U + 001A作为控制字符来指示替换函数(source)。

那说这个角色很可能搞砸了。也许文件的编码不是UTF-8,这就是为什么角色搞砸了。

作为一般规则,您只应在源代码中编写ASCII字符。您仍然可以使用转义的表单\ uXXXX表示整个Unicode范围。在这种情况下ä - &gt; \u00E4

- 更新 -

显然问题在于如何使用JS函数btoa从客户端/服务器端编码/解码用户输入。可以在此链接找到此问题的解决方案:

Using Javascript's atob to decode base64 doesn't properly decode utf-8 strings