我正在使用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:...在此字体的编码中不可用,但这无助于我选择正确的编码或编码方式。IIRC Java内部使用UTF16进行字符编码,为什么默认值还不够?这是PDF文档本身的问题还是我用来设置它的代码?
PdfBox编码符号货币euro很好的动态用户输入,因此有很多方法可以替代我自己。
因此,如果PDFBox的人们决定修复损坏的PDFBox方法,则此看似干净的变通方法代码将开始失败,因为它随后将向固定的方法提供损坏的输入数据。
诚然,我怀疑他们会在2.0.0之前解决此错误(在2.0.0中,固定方法的名称有所不同),但永远不会知道...
不幸的是,我找不到其他的setter方法,但它可能也适用于其他范围。
编辑
更新了示例代码以更好地表示问题。
U + FFFD用于替换其值在Unicode中未知或无法表示的传入字符,将U + 001A用作控制字符以表示替代函数(源)。
那就是说那个角色很可能被弄乱了。也许文件的编码不是UTF-8,这就是字符混乱的原因。
通常,您应该只在源代码中写入ASCII字符。您仍然可以使用转义的\ uXXXX表示整个Unicode范围。在这种情况下ä-> \u00E4
。
-更新-
显然,问题在于如何使用JS函数从客户端/服务器端对用户输入进行编码/解码btoa
。可以在以下链接中找到此问题的解决方案:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句