gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:08:05 30 4
gpt4 key购买 nike

我使用的是 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com