NullPointerException
в SimpleFont.loadEncoding
Я могу воспроизвести NullPointerException
в SimpleFont.loadEncoding
, используя ваш файл примера "Sample_Report.pdf". Это вызвано ошибкой в PDF, в некоторых словарях шрифтов отсутствуют обязательные записи.
Однако я не могу воспроизвести два других исключения, используя «Sample_Report.pdf». Таким образом, я сосредоточусь на воспроизводимой проблеме.
Причина
В вашем примере PDF есть несколько простых шрифтов, в которых отсутствует необходимая запись FirstChar , например ::
32 0 obj
<<
/Name /EvoPdf_meeaimambhggkplibeicinfbamefiocn
/Subtype /TrueType
/FontDescriptor 37 0 R
/Widths [0 507 507 507 507 507 507 507 507 507 507 507 507 0 507 507 507 507 507 507 507 507 507 507 507 507 507 507 507 507 507 507 226 326 401 498 507 715 682 221 303 303 498 498 250 306 252 386 507 507 507 507 507 507 507 507 507 507 268 268 498 498 498 463 894 579 544 533 615 488 459 631 623 252 319 520 420 855 646 662 517 673 543 459 487 642 567 890 519 487 468 307 386 307 498 498 291 479 525 423 525 498 305 471 525 230 239 455 230 799 525 527 525 525 349 391 335 525 452 715 433 453 395 314 460 314 498 507 507 507 250 305 418 690 498 498 395 1038 459 339 867 507 468 507 507 250 250 418 418 498 498 905 450 705 391 339 850 507 395 487 226 326 498 507 498 507 498 498 393 834 402 512 498 306 507 394 339 498 336 334 292 550 586 252 307 246 422 512 636 671 675 463 579 579 579 579 579 579 763 533 488 488 488 488 252 252 252 252 625 646 662 662 662 662 662 498 664 642 642 642 642 487 517 527 479 479 479 479 479 479 773 423 498 498 498 498 230 230 230 230 525 525 527 527 527 527 527 498 529 525 525 525 525 453 525 453 ]
/Encoding /WinAnsiEncoding
/Type /Font
/BaseFont /Calibri
/LastChar 255 >>
endobj
Согласно спецификации PDF ISO 32000-1 (и аналогично ISO 32000-2), словари шрифтов TrueType содержат те же записи, что и словари шрифтов Type1 (с некоторыми отличиями) не имеет отношения к данному случаю), а в разделе Type1 шрифты указывается:
FirstChar
целое число
(Обязательно, за исключением стандартных 14 шрифтов) Первый код символа, определенный в массиве ширины шрифта.
Шрифт выше не является стандартным шрифтом 14. Таким образом, требуется иметь запись FirstChar . Это не. Таким образом, это определение шрифта нарушено.
PDF Clown, с другой стороны, ожидает, что PDF-файлы будут соответствовать спецификации. Таким образом, он просто извлекает значение FirstChar из шрифта и немедленно использует его, что приводит к NullPointerException
.
Обходной путь
Можно сделать PDF Clown немного более мягким, установив для него значение по умолчанию 0 в SimpleFont
FirstChar поисках. Есть два таких поиска.
В SimpleFont.loadEncoding()
заменить
ByteArray charCode = new ByteArray(new byte[]{(byte)((PdfInteger)getBaseDataObject().get(PdfName.FirstChar)).getIntValue()});
от
PdfInteger firstCharObject = (PdfInteger)getBaseDataObject().get(PdfName.FirstChar);
ByteArray charCode = new ByteArray(new byte[]{(byte)(firstCharObject != null ? firstCharObject.getIntValue() : 0)});
и в SimpleFont.onLoad()
аналогично замените
ByteArray charCode = new ByteArray(
new byte[]
{(byte)((PdfInteger)getBaseDataObject().get(PdfName.FirstChar)).getIntValue()}
);
от
PdfInteger firstCharObject = (PdfInteger)getBaseDataObject().get(PdfName.FirstChar);
ByteArray charCode = new ByteArray(
new byte[]
{(byte)(firstCharObject != null ? firstCharObject.getIntValue() : 0)}
);
как это уже было сделано здесь .
NullPointerException
in CompositeFont.loadEncoding
Я могу воспроизвести NullPointerException
в CompositeFont.loadEncoding
, используя ваш файл примера "UnicodeTest.pdf". Эти исключения вызваны отсутствием кодировки CMaps в PDF Clown.
Существует ряд кодировок , главным образом для языков CJK, которые, как ожидается, будет поддерживать соответствующий процессор PDF, но какие библиотеки PDF (в частности, разработанные в Европе или Америке) часто не поддерживают из коробка.
PDF Clown ожидает такую кодировку CMaps как ресурсы в / fonts / cmap / в pdfclown.jar; по умолчанию, однако, есть только общие CMaps Identity-H и Identity-V , и нет ни одного конкретного китайского / японского / корейского CMaps.
Вы можете добавить необходимые CMaps в файл pdfclown.jar, добавив их в папку main\res\pkg\fonts\cmap\
проекта PDF Clown и создав файл jar.
Вы можете получить все CMaps из проекта adobe-type-tools / cmap-resources на github, просто просмотрите структуру папок этого проекта и соберите файлы из подпапок CMap
.
В случае вашего примера файла CMaps UniCNS-UTF16-H , UniGB-UTF16-H , UniJIS-UTF16-H и UniKS-UTF16-H достаточно, но для приложения, работающего с произвольными файлами PDF, вам, вероятно, следует добавить все кодировки CMaps.