查找并使用已经嵌入的字体?

时间:2019-03-13 11:17:31

标签: itext7

我已经使用Adobe Illustrator创建了一个PDF文件,并已使用itext7 pdfreader将其加载到内存中。

该PDF文件已经包含一个名为“ Lato(Embedded)”的嵌入式字体,编码为:Ansi。

如何从中创建PDFFont对象,以便我可以使用它来绘制其他段落?

1 个答案:

答案 0 :(得分:0)

首先请注意,只有当子集包含编写文本所需的所有字形,或者字体完全嵌入到PDF中时,您才能编写带有这种样式的其他段落。

以下解决方案适用于以下情况:要查找的字体用于在文档中任何页面的内容流中至少写入一个字形(包括嵌套的XObjects),并且如果您没有其他字体,文档中的类似名称。

这是一个小的实用程序类,可帮助您从文档中提取所需的字体:

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(将PdfReaderPdfWriter都传递给构造函数)。

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

然后,您可以通过以下方式获取字体(确保结果不为null):

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

之后,您可以使用该font实例绘制任何内容,例如通过将其传递给setFontParagraph等的Div方法。