U+FFFD 在此字体的编码中不可用:WinAnsiEncoding
U+FFFD is not available in this font's encoding: WinAnsiEncoding
我正在使用 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
从 client/server 端获取 encoded/decoded。可以在 link:
找到这个问题的解决方案
我正在使用 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
从 client/server 端获取 encoded/decoded。可以在 link: