4

我想问是否可以使用xpdf库编辑 PDF 文件,如果可以,如何?我想这是可能的,但我找不到任何关于 xpdf 的教程或文档,所以我真的不知道 :(。如果任何其他库支持pdf编辑,我也可以使用另一个库。我对此类库的唯一要求是它必须是C++库或至少是C库,并且必须是跨平台的(Windows 和 Linux)

我只需要对 pdf 文件进行基本编辑,例如:

“这是 pdf 文档中的文本”将更改为“这是 pdf 中的文本”,文本颜色也不同。

感谢您的回复!

4

4 回答 4

17

只是为了让您了解您所涉及的范围,PDF 内容的“基本编辑”几乎总是不平凡的。

PDF 中的页面内容由在页面上绘制的简短 RPN 程序表示。它是一种在语义上类似于 PostScript 的小型语言,但没有循环结构或函数定义(因此不存在停机问题)。在一个理智的世界中,您在页面上的文本将由以下内容表示:

BT /F1 12 Tf 72 720 Td (this is a text in a pdf document) Tj ET

当翻译成更熟悉的东西时,是这样的:

BeginText();
SetFont(F1, 12.0);  // Font 1, 12.0 pt
TextMoveTo(72, 720);
ShowText("this is a text in a pdf document");
EndText();

所以在这种情况下,你必须把它变成这样的东西:

BeginText();
SetFont(F1, 12.0);  // Font 1, 12.0 pt
TextMoveTo(72, 720);
ShowText("this is a ");
SetFont(F2, 12);
ShowText("text");
SetFont(F1, 12);
ShowText(" in a pdf document");
EndText();

这将成为:

BT /F1 12 Tf 72 720 Td (this is a ) Tj /F2 12 Tf (text) Tj /F1 12 Tf
( in a pdf document) Tj ET

在等效的 PDF 中。问题是多方面的:

  1. 您必须提取页面及其所有资源(非常重要)
  2. 您必须生成一个新页面,插入新资源(您正在添加新字体),如果允许则嵌入字体
  3. 更改页面的内容流以包含您更改的内容。

而 3 是你要挂断的地方,因为有无数种方法可以生成一个包含你描述的内容的页面,即使有一个像样的库,你也很难得到 70 个其中 %。让我简要描述一下为什么这听起来很糟糕。有 PDF 生成程序(我在看你,troff)首先将所有纯文本放在页面上,然后放置所有斜体文本,然后是所有粗体文本。我发誓,我不是在编造这个。有些程序想要非常精确地放置文本,所以如果你幸运的话,它们会使用 TJ 操作符来放置具有特定字距的文本。如果您不走运(大多数情况下),他们会在页面上的每个字形之前使用一组移动来布置文本。如果您的文字位于曲线或不寻常的方向(地图、广告)上怎么办?如果有人巧妙地更改字体大小以更好地区分大小写或模拟小型大写字母,该怎么办?

这就是为什么当我为 Acrobat 1.0 编写查找文本工具时,我花了两个月的时间来处理尽可能多的边缘情况。这不是编辑文本 - 它只是试图找到一个单词或短语。

我不会为你推荐一个库——抱歉——我给 xpdf 做了一个简短的介绍,目前尚不清楚它是否具有 PDF 生成功能,或者它是否只是 PDF 的消费者。PdfLib,这是一个商业产品,似乎是为了生成PDF,虽然不清楚它是否可以消费它,但你当然可以通过将它们粘合在一起来获得双方。

如果是我,我会使用我开发的工具,但我仍然对这项任务有点害羞。我工作的公司Atalasoft正在使用我的库来生成 PDF,并在非常有限的域(注释、文档元数据)内进行编辑。最困难的部分是我们尽最大努力向客户隐藏 PDF 的复杂性。一般来说,我们的客户想要我们理解规范而不是它们并使其余部分变得容易 - 但是像这样的任务(编辑是另一项),如果不了解 PDF 规范的深度,真的很难做到。如果你开始进入 PDF 操作的图书馆世界,你应该从阅读规范开始,尤其是第 8 章(图形)和第 9 章(文本),你会更好地理解你将要做的事情与图书馆。

于 2010-01-20T15:54:49.827 回答
2

xpdf 是一个只读的 PDF 库。它不能写PDF,更不用说修改内容了。

于 2011-10-14T16:56:55.443 回答
0

你看过 Itext/ISHarp 来编辑 PDF 文件吗?

于 2010-01-19T17:21:50.000 回答
0

虽然不是传统意义上的库,但 Pdfedit具有可编写脚本的编辑功能。但它需要QT。PodoFo可能最适合您的要求。还有PdfHummus

但请注意,如果您希望编辑由您无法控制的工具生成的 PDF 中的文本,您可能会遇到一些问题。问题是 - 并且@plinth 提到了它 - 有很多方法可以生成看起来相似但在上下文中彼此非常不同的文本。

于 2015-01-25T19:34:14.057 回答