在pdfbox中打印汉字
Printing Chinese characters in pdfbox
我正在使用以下设置:
Java 11.0.1
pdfbox 2.0.15
Objective: 渲染包含汉字的pdf
问题:java.lang.IllegalArgumentException:U+674E 在此字体编码中不可用:WinAnsiEncoding
我已经试过了:
使用不同的字体支持汉字。最新的是NotoSansCJKtc-Regular.ttf
按照此处所述将字体设置为 unicode:Java: Write national characters to PDF using PDFBox,但是不推荐使用使用的 loadTTF 方法。
使用 Arial-Unicode-MS_4302.ttf
我的代码看起来像这样(缩短了一点):
try (InputStream pdfIn = inputStream; PDDocument pdfDocument =
PDDocument.load(pdfIn)) {
PDFont formFont;
//Check if Chinese characters are present
if (!Util.containsHanScript(queryString)) {
formFont = PDType0Font.load(pdfDocument,
PdfReportGenerator.class.getResourceAsStream("LiberationSans-Regular.ttf"),
false);
} else {
formFont = PDType0Font.load(pdfDocument,
PdfReportGenerator.class.getResourceAsStream("NotoSansCJKtc-Regular.ttf"),
false);
}
List<PDField> fields = acroForm.getFields();
//Load fields into Map
Map<String, PDField> pdfFields = new HashMap<>();
for (PDField field : fields) {
String key = field.getPartialName();
pdfFields.put(key, field);
}
PDField currentField = pdfFields.get("someFieldID");
PDVariableText pdfield = (PDVariableText) currentField;
PDResources res = acroForm.getDefaultResources();
String fontName = res.add(formFont).getName();
String defaultAppearanceString = "/" + fontName + " 10 Tf 0 g";
pdfield.setDefaultAppearance(defaultAppearanceString);
pdfield.setValue("李柱");
acroForm.flatten(fields, true);
ByteArrayOutputStream pdfOut = new ByteArrayOutputStream();
pdfDocument.save(pdfOut);
}
预期结果:汉字pdf。
实际结果:java.lang.IllegalArgumentException:U+674E 不适用于此字体的编码:WinAnsiEncoding
所以我的问题是关于如何最好地支持使用 pdfbox 呈现汉字。感谢任何帮助。
以下代码对我有用,它使用 PDFBOX-4629:
的文件
PDDocument doc = PDDocument.load(new URL("https://issues.apache.org/jira/secure/attachment/12977270/Report_Template_DE.pdf").openStream());
PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
PDVariableText field = (PDVariableText) acroForm.getField("search_query");
List<PDField> fields = acroForm.getFields();
PDFont font = PDType0Font.load(doc, new FileInputStream("c:/windows/fonts/arialuni.ttf"), false);
PDResources res = acroForm.getDefaultResources();
String fontName = res.add(font).getName();
String defaultAppearanceString = "/" + fontName + " 10 Tf 0 g";
field.setDefaultAppearance(defaultAppearanceString);
field.setValue("李柱");
acroForm.flatten(fields, true);
doc.save("saved.pdf");
doc.close();
我正在使用以下设置:
Java 11.0.1
pdfbox 2.0.15
Objective: 渲染包含汉字的pdf
问题:java.lang.IllegalArgumentException:U+674E 在此字体编码中不可用:WinAnsiEncoding
我已经试过了:
使用不同的字体支持汉字。最新的是NotoSansCJKtc-Regular.ttf
按照此处所述将字体设置为 unicode:Java: Write national characters to PDF using PDFBox,但是不推荐使用使用的 loadTTF 方法。
使用 Arial-Unicode-MS_4302.ttf
我的代码看起来像这样(缩短了一点):
try (InputStream pdfIn = inputStream; PDDocument pdfDocument =
PDDocument.load(pdfIn)) {
PDFont formFont;
//Check if Chinese characters are present
if (!Util.containsHanScript(queryString)) {
formFont = PDType0Font.load(pdfDocument,
PdfReportGenerator.class.getResourceAsStream("LiberationSans-Regular.ttf"),
false);
} else {
formFont = PDType0Font.load(pdfDocument,
PdfReportGenerator.class.getResourceAsStream("NotoSansCJKtc-Regular.ttf"),
false);
}
List<PDField> fields = acroForm.getFields();
//Load fields into Map
Map<String, PDField> pdfFields = new HashMap<>();
for (PDField field : fields) {
String key = field.getPartialName();
pdfFields.put(key, field);
}
PDField currentField = pdfFields.get("someFieldID");
PDVariableText pdfield = (PDVariableText) currentField;
PDResources res = acroForm.getDefaultResources();
String fontName = res.add(formFont).getName();
String defaultAppearanceString = "/" + fontName + " 10 Tf 0 g";
pdfield.setDefaultAppearance(defaultAppearanceString);
pdfield.setValue("李柱");
acroForm.flatten(fields, true);
ByteArrayOutputStream pdfOut = new ByteArrayOutputStream();
pdfDocument.save(pdfOut);
}
预期结果:汉字pdf。
实际结果:java.lang.IllegalArgumentException:U+674E 不适用于此字体的编码:WinAnsiEncoding
所以我的问题是关于如何最好地支持使用 pdfbox 呈现汉字。感谢任何帮助。
以下代码对我有用,它使用 PDFBOX-4629:
的文件PDDocument doc = PDDocument.load(new URL("https://issues.apache.org/jira/secure/attachment/12977270/Report_Template_DE.pdf").openStream());
PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
PDVariableText field = (PDVariableText) acroForm.getField("search_query");
List<PDField> fields = acroForm.getFields();
PDFont font = PDType0Font.load(doc, new FileInputStream("c:/windows/fonts/arialuni.ttf"), false);
PDResources res = acroForm.getDefaultResources();
String fontName = res.add(font).getName();
String defaultAppearanceString = "/" + fontName + " 10 Tf 0 g";
field.setDefaultAppearance(defaultAppearanceString);
field.setValue("李柱");
acroForm.flatten(fields, true);
doc.save("saved.pdf");
doc.close();