我正在使用Itext
库来操作我的 PDF。
我正在使用此示例http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-16#616-listusedfonts.java来找出未嵌入 PDF 中的字体。
该库是否提供任何选项来检查字体未嵌入 PDF 的确切位置?
我正在使用Itext
库来操作我的 PDF。
我正在使用此示例http://developers.itextpdf.com/examples/itext-action-second-edition/chapter-16#616-listusedfonts.java来找出未嵌入 PDF 中的字体。
该库是否提供任何选项来检查字体未嵌入 PDF 的确切位置?
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
}
例如文本提取,您通常使用渲染侦听器实现LocationTextExtractionStrategy
或SimpleTextExtractionStrategy
(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
...
}
}