在iText pdf处理期间识别下划线和穿透属性

时间:2014-09-21 06:25:52

标签: java pdf itext

根据一些q& a我明白iText文本提取工具由于PDF规范不支持而无法识别下划线和删除线字体属性。为了允许识别,我通过添加形状子路径识别来更新PdfContentStreamProcessor.java。我还添加了ShapeRenderInfo.java来包含图形信息。

例如,识别下划线意味着从TextRenderInfo对象开始并扫描所有ShapeRenderInfo以尝试匹配(矩形包含/交叉...等))通过阅读q& a我明白iText文本提取工具不支持下划线(透视,重击,...)字体属性识别由于PDF规范允许仅通过在文本下绘制形状下划线。 为了实现下划线识别,我确实通过添加形状子路径管理来更新PdfContentStreamProcessor.java,我还添加了ShapeRenderInfo.java来包含图形渲染参数。

我的想法是通过从TextRenderInfo和ShapeRenderInfo获取Rectangles2D并检查它们之间的包含/交集来识别下划线。

我正在做的事情意味着当前iText如何向RenderListener传递事件有明显的变化,因为它们目前在pdf流中遇到传播,相反我需要首先收集XxxxxRenderObjects,然后在页面结束时传递,因此允许通过矩形搜索。

简而言之:TextRenderInfo上的isUnderline()方法将开始扫描收集的形状,试图将图形对象矩形与文本矩形相匹配。

除了需要更新RenderListener.java以允许ShapeRender事件传播之外,我确实确定了以下可能的解决方案来实现逻辑更改:

1)更新实现新事件传递策略的PdfContentStreamProcessor

2)通过插入一个能够处理逻辑的新层(一个新的侦听器)来屏蔽PdfContentStreamProcessor和RenderListener

我向iText团队提出的问题是:什么是最佳选择?你有进一步的建议吗?

事先谢谢

JQ。

1 个答案:

答案 0 :(得分:0)

由于iText没有提供所有必需的事件,我通过添加必要的PDF命令处理来修改PdfContentStreamProcessor(参见PDF参考第8章)然后我写了一个新的处理程序RenderListenerExtended来添加形状处理功能。 然后在第2点之后实施了新的逻辑(下划线,上划线等所需的......)。测试正在进行中。 JQ