У меня есть файл 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. Я имею в виду те места, где используется шрифт, это буквально пустая, пустая страница... Все равно чего-то там нет. Сам шрифт был загружен с здесь
resources.getFontNames()
. Также не делайте подмножества, поэтому последний параметр должен быть ложным. - person Tilman Hausherr   schedule 09.11.2020PDTrueTypeFont.load(document, file, WinAnsiEncoding.INSTANCE);
- person Tilman Hausherr   schedule 10.11.2020resources.getFont(<"F1" means Helvetica which is used in an original file>).getSubType()
, он возвращаетType0
. Как тогда понять, как правильно загружать шрифты? - person jeffest   schedule 10.11.2020System.out.println(doc.getPage(0).getResources().getFont(COSName.getPDFName("F1")).getSubType());
дает мне Type1. С новым файлом он получает тип 0. Проблема в том, что этот шрифт начинает числа с 1, в то время как старый класс truetype начинает их с 32, что также делал стандартный шрифт 14. Можно шрифт посмотреть с помощью PDFDebugger, тогда будет понятнее. - person Tilman Hausherr   schedule 10.11.2020getSubType()
являетсяType1
, и это очень запутанно, как вы видите, я не смог правильно встроить Helvetica. - person jeffest   schedule 11.11.2020Type1
. В то время как процесс загрузки выполняется черезPDTrueTypeFond.load()
, а не черезPDType0Font.load()
. НоgetSubType()
вернулType1
, а неTrueType
- не противоречит ли здесь логика? Моя задача — просто встроить шрифты и отправить документы в полиграфию. Я не думаю, что PDF/A — это то, что мне нужно. - person jeffest   schedule 11.11.2020System.out.println(doc.getPage(0).getResources().getFont(COSName.getPDFName("F1")).getSubType());
- person Tilman Hausherr   schedule 11.11.2020