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

标签 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 嗯,它是动态用户输入,所以有很多东西我必须自己替换。

Thus, if the PDFBox people decided to fix the broken PDFBox method, this seemingly clean work-around code here would start to fail as it would then feed the fixed method broken input data.

Admittedly, I doubt they will fix this bug before 2.0.0 (and in 2.0.0 the fixed method has a different name), but one never knows...

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

编辑

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

最佳答案

U+FFFD 用于替换其值未知或无法在 Unicode 中表示的传入字符,与使用 U+001A 作为控制字符来指示替换功能 ( source ) 相比。

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

作为一般规则,您应该只在源代码中写入 ASCII 字符。您仍然可以使用转义形式\uXXXX 来表示整个 Unicode 范围。在本例中 ä -> \u00E4.

--更新--

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

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

关于java - U+FFFD 在此字体的编码中不可用 : WinAnsiEncoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39720305/

相关文章:

java - pdfbox 不正确的标题检查 pdf 版本 1.3

java - 使用 ByteBuddy 定义方法、调用和拦截器并委托(delegate)给目标?

java - PDFBox - 查找页面尺寸

java - 这段代码中出现 java.lang.stackoverflowerror 的原因是什么?

php - WS-Security php 中 PasswordDigest 的工作算法

browser - 为什么 Git 在其查询字符串中有一个 'Check ✓' 标记?

c++ - 使用 C++ 将越南语字符从 ISO88591、UTF8、UTF16BE、UTF16LE、UTF16 编码为十六进制,反之亦然

java - PDFBox:提取图像位置(错误的 x 和 y)

java - Apache http 客户端 -> 本地地址绑定(bind) -> 一段时间后发生 BindException

java.lang.IllegalArgumentException : FormUrlEncoded can only be specified on HTTP methods with request body (e. g., @POST)