pdfbox 2.0.7 - проблема с китайскими иероглифами - PullRequest
0 голосов
/ 17 апреля 2020

pdfbox 2.0.7 - проблема с китайскими иероглифами

Мы используем pdfbox в SAP PO (7.50) уже несколько месяцев, и он работает нормально большую часть времени. Мы получили xml файлы счетов и создали собственный PDF из этой xml структуры. Но теперь мы получаем все больше и больше данных, включая китайские иероглифы. И процесс завершился ошибкой с исключением:

Проблема создания PDF: U + 548 C ('.notdef') недоступна в этом шрифте Кодировка Helvetica-Bold: WinAnsiEncoding

Мы пытались изменить наш код в некоторых частях так, чтобы для китайских символов мы использовали шрифт 'MingLiU', который не включен в TrueTypeCollection mingliu.tt c.

Мы получили подсказку от Tilman Hausherr по следующей ссылке: PDFBox не поддерживает несколько языков

Вот два скриншота из созданного PDF:

(1) enter image description here

На первом снимке экрана показан файл PDF с информацией об ожидаемом адресе поставщика и условиях оплаты (отмечены красным). Он был создан и сохранен с помощью do c .save (имя файла) в конце.

(2) enter image description here

The Второй скриншот показывает PDF, который был создан почти так же. Разница в том, что мы не сохранили 2-й файл в файловой системе , потому что он нам нужен в кодировке base64 в контейнере (тип конверта xml).

Здесь мы были частью вызовите класс (в классе 1), создав PDF-файл (в классе 2), а затем обработайте возвращаемое значение (getBytes и закодируйте с помощью base64).

в классе 1:

// Call createPDFFromMasterXML (returned as String sPdf)
sPdf = pdfFromMaster.createPDFFromMasterXML(oSFDocument);

In класс 2 (создание PDF со значениями от xml):

...
doc = new PDDocument();
page = new PDPage(PDRectangle.A4);
...
// Add Vendor
addVendorInfo(doc, page);
...
// Add other parts
...
doc.addPage(page);
// Add Header
addReportHeader(doc);
// Add Footer
addReportFooter(doc, FOOTER_LINE1, FOOTER_LINE2);           
// Save ByteArrayOutputStream
doc.save(baos);
// write to byte[]
ba = baos.toByteArray();
// Close Document
doc.close();
// flush and close baos
baos.flush();
baos.close();
// return Document
return new String(ba);

Вернуться в класс 1:

...
// Create binary PDF
bPdf = sPdf.getBytes();
// Encode Base64 and get MD5 Hash
sPdfBase64Enc = DatatypeConverter.printBase64Binary(bPdf);
...

Есть идеи ??

...