根据一些问答,我了解到 iText 文本提取工具无法识别下划线和删除线字体属性,因为 PDF 规范不支持它。为了允许识别,我通过添加形状子路径识别来更新 PdfContentStreamProcessor.java。我还添加了 ShapeRenderInfo.java 来包含图形信息。
例如,识别下划线意味着从 TextRenderInfo 对象开始并扫描所有 ShapeRenderInfo 以尝试匹配(矩形包含/相交...等))通过阅读问答,我确实了解到 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。
最佳答案
由于 iText 没有提供所有必需的事件,因此我通过添加必要的 PDF 命令处理(请参阅 PDF 引用第 8 章)来修改 PdfContentStreamProcessor,然后我编写了一个新的处理程序 RenderListenerExtended 以添加形状处理功能。 然后新的逻辑(下划线、上划线等所需的)已在第 2 点之后实现。测试正在进行中。 江青
关于java - 在 iText pdf 处理过程中识别下划线和删除线属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25956454/