【问题标题】:iText - Manipulate existing PDF - add dashes to end of each paragraphiText - 操作现有的 PDF - 在每个段落的末尾添加破折号
【发布时间】:2026-02-17 10:50:01
【问题描述】:

我需要在 iText 中操作现有的 PDF 以在每个段落的末尾添加破折号。像这样的:

我会在 Word 中使用制表符进行此操作。

这是否可以在现有文档上使用 iText。

任何帮助将不胜感激。

谢谢!

编辑澄清

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

可能有些段落不需要破折号,但我可以控制原始 PDF。它由不同的系统组装而成,我可以在需要前导的段落中添加某种标记(即,我可以在这些段落的末尾添加诸如“~tab~”之类的文本)。

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

编辑以获得更多说明

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

【问题讨论】:

  • 在您的图片中,所有段落的宽度相同,并且左右对齐;此外,只有一个文本列,除了段落,没有页眉,没有页脚,没有边距材料,没有图像之外什么都没有。这对你的任务来说是理所当然的吗?你没有提到你用的iText的味道,是5.5.x版本还是7.0.x版本?
  • 你说你可以“为特定文档设置破折号的结束位置(即10px)” - 你的意思是离页面边框10px吗?还是您的意思是每个破折号应在 10px 后结束? (顺便说一下,像素对于 PDF 来说并不是一个非常自然的单位。)
  • 是的,我可以根据页面边框指定破折号的结束位置。
  • 如果文档没有其他特别之处,画出这些线条并不太难。只需找到不长于其他文本行的文本行,然后绘制线条。

标签: itext


【解决方案1】:

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

高层计划:

  1. 使用 IEventListener 处理正在解析的 PDF 中的事件
  2. 留意 TextRenderInfo 事件,存储它们
  3. 对 TextRenderInfo 事件进行排序,以确保您的事件列表符合逻辑阅读顺序。
  4. 合并列表中的项目,如果它们出现在同一行并且相距小于一定距离(例如 TextRenderInfo 指定的字体中 3 个空格的距离)
  5. 现在你应该有线条了
  6. 如果它们在垂直方向上非常接近并且水平重叠,则合并它们。它们应该有多接近,以及它们有多少重叠是您必须弄清楚的,并且可能因页面和文档而异。
  7. 现在你应该有段落了
  8. 找出每个段落的边界框。或者更准确地说,凸包。有一种很好的算法,称为礼品包装算法。
  9. 现在您可以通过检查凸包来简单地插入线条。这是简单的一步。

如果您可以插入标记,则可以使用 iText7 轻松完成此操作。 iText7 具有 IEventListener 的实现,允许您在 PDF 文档中查找正则表达式。它返回找到正则表达式的位置。如果您可以确保您的标记始终满足某种正则表达式,您可以轻松地查找它们,获取它们的坐标,并在计算出的位置插入一条线。

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

【讨论】:

  • 感谢您的想法。我会尽量按照建议去做。如果我在需要行的段落末尾添加一些文本标记,例如“~tab~”会更简单吗(请参阅问题的编辑)?
  • 我更新了答案以包含更改的信息。
最近更新 更多