java - 在 iText pdf 处理过程中识别下划线和删除线属性

标签 java pdf itext

根据一些问答,我了解到 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/

相关文章:

java - 在java中使用http客户端将字节数组作为文件发送

Java,从ArrayList中删除对象

java - 在 Java 上嵌入 XULRunner 应用程序

java - 如何阅读使用未知的随机所有者密码创建的 PDF?

c# - Itextsharp : Adjust 2 elements on exactly one page

java - REST JAX-RS 日志记录

pdf - 如何使用itextsharp从PDF读取表格?

node.js - 如何向 puppeteer 生成的 PDF 添加水印?

html - 对学生隐藏 HTML

java - 使用现有证书、中间文件和远程创建的签名,使用 itextpdf for Java 对 PDF 进行两步签名