Я пытаюсь встроить подмножество ното-регулярных в мой код. но я продолжаю получать:
java.lang.UnsupportedOperationException: OTF fonts do not have a glyf table
at org.apache.fontbox.ttf.OpenTypeFont.getGlyph(OpenTypeFont.java:66)
at org.apache.fontbox.ttf.TTFSubsetter.addCompoundReferences(TTFSubsetter.java:481)
at org.apache.fontbox.ttf.TTFSubsetter.getGIDMap(TTFSubsetter.java:136)
at org.apache.pdfbox.pdmodel.font.TrueTypeEmbedder.subset(TrueTypeEmbedder.java:306)
at org.apache.pdfbox.pdmodel.font.PDType0Font.subset(PDType0Font.java:162)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1138)
Я скачал файл шрифта NotoSansCJK-Regular.ttc
из https://www.google.com/get/noto/help/cjk/
Подмножество шрифтов работает для .ttf
шрифтов, поскольку у меня не было проблем, если в сохраненном мною документе нет специальных символов.
EDIT
Похоже, что настоящие шрифты коллекции типов могут иметь общую таблицу глифов (имеет смысл, так как коллекция шрифтов содержит японские глифы). Таким образом, отдельный PDType0Font, проанализированный с .ttc
, не может рассматриваться как отдельный шрифт.
Я загрузил шрифт, используя:
ttc.processAllFonts((TrueTypeFont ttf) -> {
PDFont font = PDType0Font.load(doc, ttf, true);
fontList.add(font);
});
Я предполагаю, что мне нужно выполнить дополнительную работу, чтобы выполнить эту работу, но я нигде не могу найти примеры кода.
EDIT2
Похоже, проблема в том, что при установке определенных файлов шрифтов OpenType (которые содержатся в коллекции шрифтов) включается внутренний флаг isPostScript
. Затем флаг проверяется и процесс прерывается при вызове getGlyph()
.
Следующий код генерирует ошибку таблицы glyf
при создании PDF-документов
// downloaded from Noto project site
String OTF_FILE = "./src/test/resources/NotoSansJP-Regular.otf";
PDDocument doc = new PDDocument();
PDFont otf = null;
try (InputStream inputStream = new FileInputStream(new File(OTF_FILE))) {
otf = PDType0Font.load(doc, new OTFParser().parse(inputStream), true);
PDPage page = new PDPage();
PDPageContentStream stream = new PDPageContentStream(doc, page);
stream.setFont(otf, 10f);
stream.beginText();
stream.newLineAtOffset(100f, 600f);
stream.showText("二ろほス反2化みた大第リきやね景手ハニエ者性ルヤリウ円脱");
stream.endText();
stream.close();
doc.addPage(page);
doc.save("test.pdf");
} catch (IOException iox) {
// failed
}
но он сгенерирует pdf отлично, как только я установлю для параметра поднабора значение true в PDType0Font.load
вызове
Аналогично, если я загружаю шрифт otf через коллекцию:
String OTF_FILE = "./src/test/resources/NotoSansCJK-Regular.ttc";
PDDocument doc = new PDDocument();
PDFont otf = null;
try (InputStream inputStream = new FileInputStream(new File(OTF_FILE))) {
TrueTypeCollection ttc = new TrueTypeCollection(inputStream);
otf = PDType0Font.load(doc, ttc.getFontByName("NotoSansCJKjp-Regular"), true);
PDPage page = new PDPage();
PDPageContentStream stream = new PDPageContentStream(doc, page);
stream.setFont(otf, 10f);
stream.beginText();
stream.newLineAtOffset(100f, 600f);
stream.showText("二ろほス反2化みた大第リきやね景手ハニエ者性ルヤリウ円脱");
stream.endText();
stream.close();
doc.addPage(page);
doc.save("test.pdf");
} catch (IOException iox) {
// failed
}
Мне либо нужно встроить весь шрифт, либо поднабор выдает ошибку
РЕДАКТИРОВАТЬ 3
В итоге я обошел это, загрузив шрифт OTF из «OpenType / CFF (OTF) для конкретного языка», который содержит символы из всех 4 регионов, и преобразовал его, используя otf2ttf из fonttools