Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java U+;FFFD在此字体中不可用';s编码:winansioncoding_Java_Encoding_Pdfbox - Fatal编程技术网

Java U+;FFFD在此字体中不可用';s编码:winansioncoding

Java U+;FFFD在此字体中不可用';s编码:winansioncoding,java,encoding,pdfbox,Java,Encoding,Pdfbox,我正在使用PDFBOX2.0.1 我尝试在表单字段中动态添加一些(用户提供的)UTF8文本,并将结果显示给用户。不幸的是,pdf库不能正确编码特殊字符,如“äöü”。。。或者我找不到任何有用的文档来帮助我解决这个问题 有人能告诉我给定的代码示例有什么问题吗 try (PDDocument document = PDDocument.load(pdfTemplate)) { PDDocumentCatalog catalog = document.getDocumentCatalog();

我正在使用PDFBOX2.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);
}

我还发现了这些(相关)问题:

但这并不能帮助我选择正确的编码方式。IIRC Java在内部使用UTF16进行字符编码,但为什么默认值还不够? 这是PDF文档本身的问题还是我用来设置它的代码的问题


它是动态的用户输入,所以我有很多方法来代替我自己

因此,如果PDFBox人员决定修复损坏的PDFBox方法,那么这段看似干净的变通代码将开始失败,因为它将为修复方法提供损坏的输入数据

诚然,我怀疑他们会在2.0.0之前修复这个bug(在2.0.0中,修复的方法有不同的名称),但人们永远不知道

不幸的是,我找不到另一个setter方法,但它可能也适用于不同的范围

编辑


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

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

也就是说,这个角色很可能在某个地方搞砸了。可能文件的编码不是UTF-8,这就是字符混乱的原因

一般来说,您应该只在源代码中写入ASCII字符。您仍然可以使用转义格式\uxxx表示整个Unicode范围。在这种情况下,ä->
\u00E4

--更新--

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


既有
PDFTrueTypeFont.setFontEncoding(新的winansioncoding())
~.setEncoding(COSName.WIN\u ANSI\u编码)@JoopEggen抱歉,我不知道你想告诉我什么。我需要设置一个还是两个?还是应该将其设置为其他设置?请使用2.0.3重试。如果仍然不起作用,请在JIRA中打开一个问题,并附上您的PDF和代码。我想知道U+FFFD来自哪里。WinAnScienceoding支持“ä”。@ST-DDT我只是试图重现这个问题,但我做不到。因此,您的PDF或Java编辑器中有一些非常特殊的内容,Java编译器对代码的编码有不同的假设。要调查前一个选项,请共享有问题的PDF。要检查后一个答案,请按照Simone的答案中的建议,将“ä”替换为“\u00E4”。您可能对这个答案也感兴趣。很抱歉,在我的示例中不够精确。值“Gerät”由用户提供。通过Base64编码。请参阅更新的示例。请参阅我上面的评论,问题可能在于字符串的编码/解码。你试过在控制台上打印出字符串的解码值吗?JS前端的输入用ISO-8859-1编码。我会设法在那里修好的。谢谢你的支持。知道如何从字符串中去掉那个/任何坏字符吗<代码>模式.compile(新字符串({0xFF,0xFD},“UTF-8”).replaceAll(输入)
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)