【发布时间】:2014-09-21 06:25:52
【问题描述】:
根据一些问答,我了解 iText 文本提取工具无法识别下划线和删除线字体属性,因为 PDF 规范不支持它。为了允许识别,我确实通过添加形状子路径识别来更新 PdfContentStreamProcessor.java。我还添加了 ShapeRenderInfo.java 以包含图形信息。
例如识别下划线意味着从 TextRenderInfo 对象开始并扫描所有 ShapeRenderInfo 以尝试匹配(矩形包含/相交...等)通过阅读 q&a 我确实了解 iText 文本提取工具不支持下划线(罢工-through, over-strike, ...) 字体属性识别,因为 PDF 规范只允许通过在文本下绘制形状来添加下划线。 为了实现下划线识别,我确实通过添加形状子路径管理更新了 PdfContentStreamProcessor.java,我还添加了 ShapeRenderInfo.java 以包含图形渲染参数。
我的想法是通过从 TextRenderInfo 和 ShapeRenderInfo 获取 Rectangles2D 并检查它们之间的包含/相交来识别下划线。
我正在做的事情意味着当前 iText 如何将事件传递给 RenderListener 的方式发生了显着变化,因为它们当前在 pdf 流中遇到传播,相反我需要先收集 XxxxxRenderObjects,然后在页面结束时传递,从而允许通过矩形进行搜索。
简而言之:TextRenderInfo 上的 isUnderline() 方法将开始扫描收集的形状,尝试将图形对象矩形与文本矩形进行匹配。
除了需要更新 RenderListener.java 以允许 ShapeRender 事件传播之外,我确实确定了以下可能的解决方案来实现逻辑更改:
1) 更新 PdfContentStreamProcessor 实现新的事件传递策略
2) 通过插入一个能够处理逻辑的新层(新侦听器)来屏蔽 PdfContentStreamProcessor 和 RenderListener(s)
我对 iText 团队的问题是:最好的选择是什么?您还有什么建议吗?
先谢谢了
JQ.
【问题讨论】:
-
我不是某个 iText 团队 的一员,但无论如何我的 2¢:我建议将收集事件的所有内容放在一个页面中,或者将它们分析在一个单独的层。将这些功能放在一起几乎没有什么好处,因此应该使用不同的编程单元。
-
这是一个有趣的问题,但在 StackOverflow 问题的上下文中很难回答。这是应该与 iText 开发团队讨论的问题。我们正在开展类似的项目。例如,请参阅:youtube.com/watch?v=lZnbhnU4m3Y 您确实希望避免我们在正式版本中处理此功能而您通过创建与正式版本不兼容的分支来处理该功能的情况。
-
Bruno 我同意,这就是我问这个问题的原因,如果我的代码对 iText 有用,我很乐意分享。