iText-操纵现有PDF-在每个段落末尾添加破折号

iText-操纵现有PDF-在每个段落末尾添加破折号,itext,Itext,我需要操纵iText中现有的PDF,在每个段落的末尾添加破折号。大概是这样的: 我会用Word和tab-leaders做这个 在现有文档上使用iText是否可以做到这一点 任何帮助都将不胜感激 谢谢 编辑以进行澄清 iText版本是5.5.x,但我想我们可以升级它,如果新版本的任务更简单的话 可能有一些段落不需要破折号,但我可以控制原始PDF。它是由不同的系统组合而成的,我可以在需要引线的段落中添加一些标记(例如,我可以在这些段落的末尾添加“~tab~”之类的文本) 目前,需要这种编辑的文档有

我需要操纵iText中现有的PDF,在每个段落的末尾添加破折号。大概是这样的:

我会用Word和tab-leaders做这个

在现有文档上使用iText是否可以做到这一点

任何帮助都将不胜感激

谢谢

编辑以进行澄清

iText版本是5.5.x,但我想我们可以升级它,如果新版本的任务更简单的话

可能有一些段落不需要破折号,但我可以控制原始PDF。它是由不同的系统组合而成的,我可以在需要引线的段落中添加一些标记(例如,我可以在这些段落的末尾添加“~tab~”之类的文本)

目前,需要这种编辑的文档有页眉和页脚,只有文本和一列对齐对齐

编辑以获得更多澄清

我甚至可以(通过配置)为特定文档设置破折号必须结束的位置(即10px)。我们知道每一种需要以这种方式操作的文档类型(及其结构)。

这是非常困难的。 您应该将PDF文档视为指令的容器,而不是所见即所得格式。因此,找出行的位置(更不用说段落)是非常困难的

高级别计划:

  • 使用IEventListener处理正在解析的PDF中的事件
  • 注意TextRenderInfo事件,存储它们
  • 对TextRenderInfo事件进行排序,以确保事件列表符合逻辑读取顺序
  • 如果列表中的项目出现在同一行上且相距小于一定距离(例如,TextRenderInfo指定的字体中的3个空格的距离),则合并列表中的项目
  • 现在你应该有台词了
  • 如果直线在垂直方向上彼此接近,并且水平重叠,则合并直线。它们之间的距离应该有多近,重叠的程度是您必须弄清楚的,并且可能会因页面和文档的不同而有所不同
  • 现在你应该有段落了
  • 找出每个段落的边界框。或者更准确地说,是凸面外壳。有一种很好的算法叫做礼品包装算法
  • 现在,您可以通过检查凸面外壳来简单地插入线。这是简单的一步
  • 如果可以插入标记,则可以使用iText7轻松地完成此操作。iText7有一个IEventListener的实现,允许您在PDF文档中查找正则表达式。它返回找到正则表达式的位置。如果可以确保标记始终满足某种正则表达式,则可以轻松查找它们,获取它们的坐标,并在计算位置插入一条线

    当然,然后需要去掉标记文本。 为此,您可以使用pdfSweep。

    这非常难。 您应该将PDF文档视为指令的容器,而不是所见即所得格式。因此,找出行的位置(更不用说段落)是非常困难的

    高级别计划:

  • 使用IEventListener处理正在解析的PDF中的事件
  • 注意TextRenderInfo事件,存储它们
  • 对TextRenderInfo事件进行排序,以确保事件列表符合逻辑读取顺序
  • 如果列表中的项目出现在同一行上且相距小于一定距离(例如,TextRenderInfo指定的字体中的3个空格的距离),则合并列表中的项目
  • 现在你应该有台词了
  • 如果直线在垂直方向上彼此接近,并且水平重叠,则合并直线。它们之间的距离应该有多近,重叠的程度是您必须弄清楚的,并且可能会因页面和文档的不同而有所不同
  • 现在你应该有段落了
  • 找出每个段落的边界框。或者更准确地说,是凸面外壳。有一种很好的算法叫做礼品包装算法
  • 现在,您可以通过检查凸面外壳来简单地插入线。这是简单的一步
  • 如果可以插入标记,则可以使用iText7轻松地完成此操作。iText7有一个IEventListener的实现,允许您在PDF文档中查找正则表达式。它返回找到正则表达式的位置。如果可以确保标记始终满足某种正则表达式,则可以轻松查找它们,获取它们的坐标,并在计算位置插入一条线

    当然,然后需要去掉标记文本。
    为此,您可以使用pdfSweep。

    在图像中,所有段落都具有相同的宽度,并且左右对齐;此外,只有一个文本列,只有段落,没有页眉,没有页脚,没有页边空白材料,没有图像。对于你的任务来说,这是理所当然的吗?你没有提到你使用的iText的风格,它是5.5.x版本还是7.0.x版本?你说你可以“为特定文档设置破折号必须结束的位置(即10px)”—你是说距离页面边框10px?或者你的意思是每一个破折号都应该在10px后结束?(顺便说一句,像素对于PDF来说不是一个很自然的单位。)是的,我可以根据页面边框指定破折号的结束位置。如果文档没有其他特殊之处,那么绘制这些线条并不太困难。一个人只需要找到没有其他人长的文本线,然后画线。在你的图像中,所有段落都有相同的宽度,并且左右对齐;此外,只有一个文本列,只有段落,没有页眉,没有页脚,没有页边空白材料,没有图像。对于你的任务来说,这是理所当然的吗?你没有提到你使用的iText的风格,它是5.5.x版本还是7.0.x版本?你说你可以“设置破折号必须结束的位置(即10像素)