Найти и использовать уже встроенный шрифт? - PullRequest
0 голосов
/ 13 марта 2019

У меня есть файл PDF с Adobe Illustrator, который я загрузил в память с помощью itext7 pdfreader.

Этот файл PDF уже содержит встроенный шрифт с именем «Lato (Embedded)» Кодировка: Ansi.

Как создать из него объект PDFFont, чтобы я мог использовать его для рисования дополнительных абзацев?

1 Ответ

0 голосов
/ 17 марта 2019

Прежде всего, обратите внимание, что вы могли бы написать дополнительные абзацы с таким интересом только в том случае, если подмножество содержит все глифы, необходимые для написания текста, или если шрифт был полностью встроен в PDF.

Решение ниже работает в том случае, если нужный вам шрифт используется для записи хотя бы одного глифа в потоке содержимого любой страницы документа (включая вложенные объекты XObject), а также в случае, если у вас нет других шрифтов с похожим шрифтом.имена в документе.

Вот небольшой вспомогательный класс, который поможет вам извлечь нужный шрифт из документа:

private static class FontFinder implements IEventListener {
    private PdfFont suitableFont;
    private String nameToLookFor;

    private FontFinder(String nameToLookFor) {
        this.nameToLookFor = nameToLookFor;
    }

    public static PdfFont findFont(PdfDocument pdfDocument, String fontName) {
        FontFinder finder = new FontFinder(fontName);
        PdfCanvasProcessor processor = new PdfCanvasProcessor(finder);
        for (int i = 1; i <= pdfDocument.getNumberOfPages(); i++) {
            processor.processPageContent(pdfDocument.getPage(i));
        }
        return finder.suitableFont;
    }

    @Override
    public void eventOccurred(IEventData data, EventType type) {
        if (data instanceof TextRenderInfo) {
            PdfFont curFont = ((TextRenderInfo) data).getFont();
            String fontName = curFont.getFontProgram().getFontNames().getFontName();
            if (fontName != null && fontName.contains(nameToLookFor)) {
                suitableFont = curFont;
            }
        }
    }

    @Override
    public Set<EventType> getSupportedEvents() {
        return new HashSet<>(Arrays.asList(EventType.RENDER_TEXT));
    }
}

Вам нужно будет открыть PdfDocument в режиме печати (передавая PdfReader и PdfWriter в конструктор).

PdfDocument pdfDocument = new PdfDocument(new PdfReader(inFile), new PdfWriter(outFile));

Затем вы можете получить свой шрифт следующим образом (убедитесь, что результат не равен нулю):

PdfFont font = FontFinder.findFont(pdfDocument, "Lato");

После этого вы можете использовать этот экземпляр font для рисования любого содержимого, например, передав его в setFont метод Paragraph, Div и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...