iTextPdf7 - Получить шрифт из ресурсов

Я использую iText7 для создания PDF-файлов с помощью Java. Я использую некоторые пользовательские шрифты, и эти файлы находятся в папке resources.

Пока я тестирую и запускаю приложение на netbeans, оно отлично работает:

PdfFontFactory.register("./src/main/resources/GOTHAM-BOLD.otf", "gotham-bold");
PdfFont gBold = PdfFontFactory.createRegisteredFont("gotham-bold", PdfEncodings.IDENTITY_H);

Но когда я создаю и пытаюсь запустить приложение и создать файл PDF, iText не может найти файлы шрифтов, потому что ему нужен прямой path. Какие у меня есть альтернативы? Мне это действительно нужно, чтобы работать на любом компьютере (как и другие ресурсы).


person zediogoviana    schedule 17.10.2017    source источник


Ответы (1)


Я не совсем уверен, почему вы используете псевдонимы. Вы можете использовать другие фабричные методы, которые принимают массивы byte[] в сочетании с Class.getResourceAsStream(String), чтобы получить содержимое ресурса шрифта, которое можно использовать для создания экземпляра FontProgram, а затем создать PdfFont.

Код можно изменить следующим образом:

// Apache Commons IO is used, but any way of retrieving bytes from stream will suffice
byte[] fontContents = IOUtils.toByteArray(getClass().getResourceAsStream("GOTHAM-BOLD.otf"));

FontProgram fontProgram = FontProgramFactory.createFont(fontContents);
document.setFont(PdfFontFactory.createFont(fontProgram, PdfEncodings.IDENTITY_H));

Если вы работаете в статическом контексте, вы можете использовать его как Main.class.getResourceAsStream() (поместите имя вашего класса вместо Main).

Убедитесь, что ресурс шрифта появился в окончательной сборке, и все готово. В этом подходе нет зависимости от каких-либо URL-адресов.

person Alexey Subach    schedule 17.10.2017
comment
это работало только при работе в NetBeans ... Но при запуске встроенного шрифта он все равно не мог загрузить шрифт. Это дает null pointer exception . Я подтвердил, что шрифты находятся в банке, включая все остальные ресурсы (также я могу визуализировать их во время работы - проблема заключается в создании файла PDF) - person zediogoviana; 18.10.2017
comment
@Anonirato, это маловероятно, если только банка не построена неправильно. Алексей просто предложил стандартный подход к поставленной задаче. - person mkl; 18.10.2017
comment
@Алексей У меня были другие проблемы, не связанные с этим вопросом! Ваш ответ сработал отлично! Благодарю вас! - person zediogoviana; 18.10.2017