J'utilise l'installation suivante:
Java 11.0.1
PDFBox 2.0.15
Objectif: le rendu d'un document PDF contenant des caractères chinois
Problème: java.lang.IllegalArgumentException: U + 674E est pas disponible dans l'encodage de cette police: WinAnsiEncoding
Je l'ai déjà essayé:
En utilisant différentes polices pour le support des caractères chinois. Le dernier est NotoSansCJKtc-Regular.ttf
Définir la police à unicode comme décrit ici: Java: Ecrire les caractères nationaux au format PDF en utilisant PDFBox , mais la méthode utilisée loadTTF est dépréciée.
En utilisant Arial Unicode-MS_4302.ttf
Mon code ressemble à ceci (raccourci un peu):
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);
}
Résultat attendu: les caractères chinois sur pdf.
Résultat réel: java.lang.IllegalArgumentException: U + 674E est pas disponible dans l'encodage de cette police: WinAnsiEncoding
Donc, ma question est sur la façon de mieux le rendu de support des caractères chinois avec PDFBox. Toute aide est appréciée.
Le code suivant fonctionne pour moi, il utilise le fichier de 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();