1

我正在使用Itext库来操作我的 PDF。

我正在使用此示例http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-16#616-listusedfonts.java来找出未嵌入 PDF 中的字体。

该库是否提供任何选项来检查字体未嵌入 PDF 的确切位置?

4

1 回答 1

3

OP 引用的示例仅检查页面和从中引用的 xobjects 表单,并输出有关这些实体资源中提供的字体的信息。

如果需要查明使用哪种字体的确切位置,则必须使用不同的机制,即解析器将类与自定义渲染侦听器打包在一起。然后,此侦听器可以在使用此类未嵌入字体时对文本绘制操作进行操作。

解析器框架

要找出页面上实际使用某些资源的位置,您必须解析页面内容流并检查其中的 PDF 说明。

iText 通过提供一个解析器框架来帮助您这样做,该框架读取内容流并对其进行预分析。第一次分析的结果将转发到您提供的渲染侦听器。

您可以像这样使用解析器框架:

PdfReader reader = new PdfReader(SOURCE);
for (int page = from; page <= to; page++)
{
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    RenderListener renderListener = YOUR_RENDER_LISTENER_IMPLEMENTATION;
    parser.processContent(page, renderListener);
    // after the page has been processed, probably 
    // some render listener related post-processing
}

例如文本提取,您通常使用渲染侦听器实现LocationTextExtractionStrategySimpleTextExtractionStrategy(iText 附带),并且在页面被处理后,您String从它从页面事件中提取的策略中检索文本。

要自定义的渲染侦听器

iText 5 中的渲染侦听器必须实现接口RenderListener

public interface RenderListener {
    /**
     * Called when a new text block is beginning (i.e. BT)
     */
    public void beginTextBlock();

    /**
     * Called when text should be rendered
     * @param renderInfo information specifying what to render
     */
    public void renderText(TextRenderInfo renderInfo);

    /**
     * Called when a text block has ended (i.e. ET)
     */
    public void endTextBlock();

    /**
     * Called when image should be rendered
     * @param renderInfo information specifying what to render
     */
    public void renderImage(ImageRenderInfo renderInfo);
}

或者ExtRenderListener它声明了一些额外的监听器方法。

任务的渲染侦听器,即查找给定字体用于绘制文本的确切位置的渲染侦听器,只需要renderText非常简单地实现,例如:

public void renderText(TextRenderInfo renderInfo)
{
    DocumentFont documentFont = renderInfo.getFont();
    PdfDictionary font = documentFont.getFontDictionary();
    // Check the font dictionary like in your example code
    if (font FULFILLS SOME CRITERIA)
    {
        // The text
        String text = renderInfo.getText();
        // is rendered on the current page on the base line
        LineSegment baseline = renderInfo.getBaseline();
        // using a font fulfilling the given criteria
        ...
    }
}
于 2016-03-02T10:39:40.910 回答