【问题标题】:How do you programmatically redact PDF FIles?您如何以编程方式编辑 PDF 文件?
【发布时间】:2011-05-18 12:22:54
【问题描述】:

Adobe Acrobat 能够编辑 PDF 文件(即实际删除信息,而不是简单地在其上绘制一个黑框)。我想以编程方式使用此功能。要使用 GUI 进行编校,您可以选择 Mark for Redaction 工具,将其绘制在要编校的文本上,然后应用编校。

有没有办法通过 AppleScript 或其他方式以编程方式执行此操作?

我知道要编辑的文本的 (X,y) 位置。

谢谢!

【问题讨论】:

  • Acrobat 的脚本钩子都集成到了 Javascript 中,所以我提交了添加该标签。我还认为,首先生成 PDF 的系统会更好地处理编辑。
  • 要非常小心如何进行编辑以及您认为要编辑的内容。没有正确完成(即,在现有文本对象上绘制一个黑框)是微不足道的撤消并且仍然将文本留在可以搜索/提取的文档中。 PDF 中的真正编辑并非易事。
  • 是的,这很重要,这就是我想使用执行此操作的软件的原因。 Acrobat 具有内置的编辑功能。

标签: pdf applescript redaction


【解决方案1】:

为了正确编辑 PDF,您需要更改内容流。这很难。

如果您可以找到绘制要删除的文本的内容流部分,那么您就成功了一半。

另一半正在弄清楚如何更改内容流,这样您就不会修改文档的其余部分。如果下一个文本绘制运算符由“tm”命令进行(设置文本矩阵,它绝对定位下一段文本),这很容易。如果不是...您必须计算要替换的文本的确切宽度(几个不同的 PDF 库可以做到这一点),并更改绘图命令以跳过那么多内容。

例如:

英国电信 /F1 10 TF 1 0 0 1 30 720 吨米 (这里有一些文字,你只想编辑那里的大写“编辑”)Tj * (此文本相对于上一行定位)Tj 1 0 0 1 30 650 吨米 (此文字绝对定位,从30、650开始)Tj

因此,您必须将第一行 (...)Tj 分解为 (Here's some text, and you only want to)Tj、N 0 Td 和 (that upper case "redact" over there)Tj... 其中“N”正确调整以下文本绘制操作的位置,以便它落在完全相同的位置。因此,您需要使用字体资源 /F1(无论结果如何)知道“ REDACT ”的精确宽度,大小为 10 磅。

为了让您的生活更精彩,您也必须担心字距紧缩的文字。因此,您可以在文本中提供很少的间距调整:

(取自 PDF 规范中绘制的第一个文本)

[(Adobe Sys)5(t)1(ems Inc)5(orporated)5(20)5(08 \226 All rights)5(reser)-9(ved)]TJ

要正确编辑“Incorporated”,您需要确定它已被拆分为两个字符串,并调整其后面的字符串的位置,使其位于完全相同的位置。

字符串可以是<DEADBEEF> 十六进制值,而不是(plain old ascii)。

明白了吗?而且我没有在这里介绍所有可能性,只介绍最常见的可能性。

就像我说的:这很难。


有一个名为 Appligent Redax(无连接)的 acrobat 插件,可让您绘制注释(或通过模板、正则表达式等生成注释),然后运行它们的代码来处理编辑。应该可以以编程方式创建他们的注释,甚至可能激活他们的插件:文档中的 JS 可以运行菜单项。

【讨论】:

  • RE:“更改绘图命令以跳过这么多东西”......那岂不是仍将编辑的内容留在 PDF 中,仍可用于以后提取?我很好奇,因为 PDF 已成为电子书公司的通用语,有时由于版权原因需要删除文本。回到页面布局是一件很麻烦的事情,但我们必须确保内容不能被重复使用,即使是意外。
  • 我是说你必须用其他东西替换一些内容流。 (Redact me, but not me)Tj 和 N 0 Td (, but not me)Tj,其中 N 是以点为单位的正确宽度(几乎可以肯定是浮点值)。正确删除所有已编辑的文本后,然后添加黑框(相比之下这是非常微不足道的)。
  • @Mark:感谢您的澄清。
  • 我不推荐N 0 Td,因为Td操作符有改变当前行开始位置的副作用,所以像T*这样的操作符将不再正常工作(我说根据经验)。实现文本编辑的正确方法是[-N]TJ,而不是 N 0 Td。否则你是对的,这很难做到。使用 Type0 字体,文本甚至不可读,因为使用了字形 ID,这不是一种有意义的编码。如果幸运的话,可以使用 ToUnicode CMap 来解码文本内容。在其他情况下,逻辑结构信息可能会有所帮助。
  • 我要补充一点,[-N]TJ 中的 N 值必须比实际尺寸大 1000*。
【解决方案2】:

您可以使用 GroupDocs.Redaction for .NET 以编程方式编辑 PDF 文档中的文本。您可以对文本执行精确的短语、区分大小写和正则表达式的编辑。这就是您可以执行确切的短语编辑的方式。

using (Document doc = Redactor.Load("D:\\candy.pdf"))
{
     doc.RedactWith(new ExactPhraseRedaction("candy", new ReplacementOptions("[redacted]")));
     // Save the document to "*_Redacted.*" file.
     doc.Save(new SaveOptions() { AddSuffix = true, RasterizeToPDF = false }); 
} 

披露:我在 GroupDocs 担任开发人员宣传员。

【讨论】:

  • 哇。那太棒了。我不知道!有没有办法在 Mac 或 Linux 上运行它,也许在 Mono 下?
  • @vy32,目前,API 不支持 Mono。不过,我们很快就会发布适用于 Java 平台的 API。
  • @vy32 GroupDocs.Redaction 已针对 Java 平台发布。见:products.groupdocs.com/redaction/java
【解决方案3】:

这是一个包含您需要做的事情的网页。正如其他人提到的,您必须在 Javascript 中执行此操作,因为这就是 Acrobat 的本机脚本。

http://acrobatusers.com/tutorials/2008/07/auto_redaction_with_javascript

虽然我经常使用 Acrobat,但令人惊讶的是,我从来不需要编写脚本。我查了字典,看起来你必须编写 Javascript 文件,保存它,然后用 Applescript 打开它,如果这是你想做的(比如作为服务)。

tell application "Adobe Acrobat Professional"
   do script "this.info.title;"
end tell

这是 Adob​​e 的 Acrobat Javascript 文档

http://livedocs.adobe.com/acrobat_sdk/9.1/Acrobat9_1_HTMLHelp/wwhelp/wwhimpl/common/html/wwhelp.htm?context=Acrobat9_HTMLHelp&file=JavaScript_SectionPage.70.1.html

【讨论】:

    【解决方案4】:

    在 Adob​​e Acrobat 中,您可以通过使用可在许多不同事件上调用的 ActionScript 来做到这一点。

    如果您想在一个单独的应用程序中执行此操作,那么在各种平台上都有许多不同的工具可以创建和操作 PDF 文档,尽管我还没有找到一个功能丰富的开源库,甚至可以来接近其中一些产品。

    http://www.aspose.com/categories/.net-components/aspose.pdf-for-.net/default.aspx

    http://www.aspose.com/categories/java-components/aspose.pdf-for-java/default.aspx

    http://itextpdf.com/

    iText 是我个人的最爱,值得每一分钱。

    【讨论】:

    • “ActionScript”是 Flash 的脚本语言,是 ECMAScript 的一种方言。 PDF 使用 JavaScript,它是 ECMAScript 的另一种方言。两者非常相似,但又不同。
    • Acrobat 是 GUI 指令的;有没有办法以编程方式运行 Acrobat?
    【解决方案5】:

    一般来说,编辑 PDF 是一项相当复杂的任务。

    您可以在 doXiview (https://doxiview.cib.de) 上免费编辑 PDF 页面。编辑选项位于右侧。

    另一种方法是由 CIB pdf 工具箱 (https://pdftoolbox.cib.de/) 以编程方式完成

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 2013-08-05
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多