#java #pdfbox #font-embedding
#java #pdfbox #встраивание шрифтов
Вопрос:
У меня есть PDF-файл, который показывает свойства шрифта в Okular (или любом другом средстве просмотра PDF) таким образом:
Name: Helvetica
Type: Type1
File: /usr/share/fonts/truetype/liberation2/LiberationSans-regular.ttf
Embedded: No
Я хочу встроить Helvetica в PDFBox 2xx без изменения самого содержимого файла (текста), чтобы он всегда был доступен с файлом.
Возможно ли это вообще?
Я попробовал что-то вроде:
PDDocument document = PDDocument.load(myFile);
InputStream stream = new FileInputStream(new File("/home/user/fonts_temp/Helvetica.ttf"));
PDFont fontToEmbed = PDType0Font.load(document, stream, true);
PDResources resources = document.getPage(pageNumber).getResources();
resources.add(fontToEmbed);
//or use the font from pdfbox:
resources.add(PDType1Font.HELVETICA);
document.save(somewhere);
document.close();
Я также пытался вызвать
COSName fontCosName = resources.add(PDType1Font.HELVETICA);
resources.put(fontCosName, font);
Что я делаю не так?
Редактировать:
@TilmanHausherr спасибо за подсказку! Но я все еще чего-то не хватает. В настоящее время мой код выглядит так:
PDFont helvetica = PDType0Font.load(document, new FileInputStream(new File("/path/Helvetica.ttf")), false);
...
PDResources resources = page.getResources();
for (COSName fontCosName : resources.getFontNames()){
if(resources.getFont(fontCosName).getName().equals("Helvetica")) {
resources.put(fontCosName, helvetica);
}
}
Конечный результат показывает
Helvetica CID TrueType Fully Embedded
Но шрифт теперь вообще не отображается в файле PDF. Я имею в виду те места, где используется шрифт, буквально пустые, пустая страница… Все еще чего-то нет.
Сам шрифт был загружен отсюда
Комментарии:
1. Вам нужно знать имя, которое в настоящее время используется в ресурсах, поэтому проверьте их с
resources.getFontNames()
помощью . Также не подмножество, поэтому последний параметр должен быть false .2. @TilmanHausherr большое спасибо. Но я обновил сообщение со следующей проблемой — шрифт вообще не отображается в документе
3. Пожалуйста, поделитесь PDF-файлом до и после
4. Я вижу … проблема с кодами, начинающимися с 0… попробуйте использовать PDTrueTypeFont вместо PDType0Font.
PDTrueTypeFont.load(document, file, WinAnsiEncoding.INSTANCE);
5.
System.out.println(doc.getPage(0).getResources().getFont(COSName.getPDFName("F1")).getSubType());
возвращает мне «Type1». С новым файлом он получает «Тип 0». Проблема в том, что этот шрифт начинает числа с 1, в то время как «старый» класс truetype запускает их с 32, что также делал стандартный шрифт 14. Вы можете посмотреть шрифт с помощью PDFDebugger, тогда он станет более понятным.
Ответ №1:
Вам нужно знать имя, которое в настоящее время используется в ресурсах, поэтому проверьте их с помощью resources.getFontNames()
2. Чтобы заменить стандартный шрифт 14, используйте этот объект font:
PDTrueTypeFont.load(document, file, oldFont.getEncoding() /* or WinAnsiEncoding.INSTANCE which is usually right */ );
это гарантирует, что используется та же кодировка, что и стандартный шрифт 14. (Это отличается для Zapf Dingbats и символьного шрифта)
Комментарии:
1. «это гарантирует, что используется та же кодировка, что и стандартный шрифт 14» — Ну … нет. Это не гарантирует, это просто делает очень вероятным. Стандартные 14 шрифтов можно использовать и с другими кодировками, даже с пользовательскими; просто вряд ли кто-то это делает. По сути, вам нужно сохранить исходную кодировку, чтобы обеспечить ту же кодировку..
2. Я пометил этот ответ как правильный, но на самом деле в комментариях после вопроса есть отличная дискуссия