【问题标题】:Inline text editing within a PDF file [closed]PDF文件中的内联文本编辑[关闭]
【发布时间】:2013-08-27 15:53:54
【问题描述】:

我想知道是否有可用的编程库允许对 PDF 文档中的文本进行内联编辑。在此之后将文本绘制到文档中不是我想要的,而且我已经知道有许多设施和库可以做到这一点;我正在寻找可以让我做出这样的改变的东西(其中 NEW 没有被绘制,而是被编辑,例如,一个字符串):

“这是我的文档”变成“这是我的新文档”。

...应该保留格式(尤其是在页面上的特定区域内没有进行编辑的情况下)。自动换行支持也很棒!

那么那里有这样的东西还是我在叫错树?我已经查看了 FPDF、PdfBox 甚至 GNOME 等一系列工具,但运气不佳(tbh,我确信 GNOME 可能会允许它,但目前了解它太费时了——所以关于这方面的指针将是也很棒)。

谢谢,如果已经问过这个问题,我们很抱歉。

在编程语言方面:我愿意使用 C、C++、Java、PHP、Python 和 Perl 中的建议。

【问题讨论】:

  • 也许this 有帮助。
  • 嗯...我稍后将更新问题以说明格式应保留在已编辑的行内。但首先,您的建议是否保留格式?
  • 也许我从错误的角度解决了这个问题,应该处理一些其他标准类型的文档文本(例如 Microsoft Word 或 Libre Office 的 XML 格式),然后将其导出为 PDF——但是什么会最好的库就是为此(即 XML/HTML5 到 PDF)?
  • 如果可以选择,您应该切换格式。 PDF 是一种最终格式,任何尝试大幅更改现有内容(与添加新内容相比)至少是非常困难的,特别是如果它包括重排。哪种格式最好,取决于情况,例如谁创建模板。

标签: java c linux pdf lamp


【解决方案1】:

为了跟进我的 cmets,这是相当典型的原始 PDF 文本输出的样子——PDF 参考指南 16-v4 第 1213 页的缩小部分:

36451 0 obj  % Contents
% used filter: FlateDecode
/GS2 gs
BT
/F1 1 Tf
8 0 0 8 297.417 105.667 Tm
0 0 0 1 k
0 Tc
0 Tw
(1213) Tj
/F5 1 Tf
24 0 0 24 253.784 617 Tm
[ (C) 19.1 (olophon) ] TJ
/F3 1 Tf
10.505 0 0 10.505 136.5 566 Tm
-0.0014 Tc
0.2018 Tw
[ (This do) -10.1 (c) -7.2 (u) -0.3 (men) 17.6 (t) -1.4 ( was p) 10 (r) 11.9 (o) -10.1 (d) 10.8 (uce) -7.2 (d) -1.3 ( usin) 6.6 (g ) 36.5 (A) 24.6 (d) 0.9 (o) 3.8 (b) -10.1 (e) ] TJ
8.4 0 0 8.4 326.25 570.2 Tm
0 Tc

.. 类似这样的几百行被省略了。一些兴趣点:Tf 设置文本字体(在别处定义,并且可能具有自定义编码 - 并不总是 ASCII)。 Tj'显示'文本; Tm 以“当前单位”设置变换矩阵。在不知道两者的实际大小的情况下,不可能立即看到文本“Colophon”是否紧跟在“1213”之后。 TcTw 设置默认字符和单词间距,并且经常被滥用来插入“空格”。不过,不在这里; TJ 数组指定带有散布 kerning 值的文本片段(我猜,基于它们的位置)。

无法确定此单个文本行是单独的一行,还是较长段落的一部分。甚至无法确定它是否是合理的字符串 - 您需要将其左右边缘与 其他 行进行比较才能找出答案。

(此输出是使用我自己从头开始编写的 PDF 阅读器创建的,使用上述参考,仅此而已。)

如您所见,仅查找文本是一个挑战,尽管有些库或多或少在这方面取得了成功。 没有他们——如果我是正确的——吹嘘能够编辑“任何 PDF”。

【讨论】:

  • 您的回答最接近事实真相。除了已经制作的各种 cmets,我对其他寻找类似内容的人的建议是使用真正可编辑的格式,然后将其导出为 PDF。我将从这里进一步调查我的选择,如果我找到一个快速的解决方案,我会留下另一条评论。
  • 我将继续使用 LibreOffice 的 unoconv 命令行程序(目前)以及 libreoffice 的 .fodt 格式。有些像这样:unoconv -f pdf -o out.pdf MyDocument.fodt
  • 唯一的缺点是,除非我使用侦听器,否则我每次都必须在 shell 上下文中执行此命令,并且可能使用已知的临时文件。不过 unoconv3.py 看起来很有趣。
【解决方案2】:

只需在 pdf 文件中查找文本并进行修改。如果我没记错的话,字符串文字是这样编码的:(This is my document)。如果您要更改的文本被拆分为多个字符串文字,或者您需要自动换行,那么任何 pdf 库都可能对您没有太大帮助。

【讨论】:

  • 它就像(This is my document) 仅在最简单的文档中,即在仅具有标准编码且没有字距调整的文档中。
  • 几乎任何 PDF 文档中的文本被分解为多个字符串。考虑字体、大小或颜色变化、单词和字母间距以及左、右、居中或两端对齐的文本。没有两个 PDF 制作者遵循相同的程序来做同样的事情。 “自动换行”……算了。 PDF 并不意味着可以通过这种方式进行编辑。
  • 我拥有的文档实际上并不包含纯文本,而是全部编码的。文档使用的 PDF 版本为 1.5 (PDF-1.5)。我应该使用哪个版本的 PDF 对 pdf 进行编码以便纯文本可见?自动换行限制似乎是一个障碍。
  • “编码”,你为什么这么认为?它可能只是压缩的——对于任何版本的 PDF 都是有效的操作。它可以使用任意数量的有效 PDF 编码流(ASCIIHex、ASCII85、LZW、Flate、RunLength、CCITTFax)以任何顺序“编码”(PDF 参考 1.4 的 3.3,但也适用于您的 1.5)。此外,可能已将单独的对象流连接到单个复合对象中。它与版本无关:如果您创建 PDF,您可以选择是否压缩纯数据流——后者将生成更大但可读的 PDF。
  • 这个建议不是问题的答案,除了从原始文件开始之外,也没有任何好的答案。即使在最简单的情况下,这个建议也不太可能奏效。 PDF 并不是指定的可编辑格式。在任何需要操作的情况下,唯一有效的解决方案是从原始内容开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 2018-01-18
相关资源
最近更新 更多