在 PHP/Bash/C# 中从 PDF 中删除图层/背景

本文关键字:删除图层 PDF 背景 PHP Bash 中从 | 更新日期: 2023-09-27 17:57:08

我有一些PDF文件需要使用PHP脚本进行修改。我也能够 exec(),所以我可以使用几乎任何在 CentOS 上运行的东西。

通过Adobe Acrobat Pro X打开的PDF文件在"图层"面板中显示2个图层:

  1. 背景
  2. 颜色

当我禁用这两个图层时,我最终会得到黑白文本和图像(文本不是矢量,而是扫描的文档)。

我想使用 PHP 和/或 C# 或任何命令行工具禁用这些图层以及 PDF 中的任何其他类似图层。

其他有用信息:

当我在我的 PDF 上运行 pdfimages (随 XPDF 一起提供)时,它会准确地提取我实际需要从每个页面中删除的内容......

其他信息更新:我在这里修改了PDFSharp示例:http://www.pdfsharp.net/wiki/ExportImages-sample.ashx:

改 性:
第 28 行:ExportImage(xObject, ref imageCount);

自:

PdfObject obj = xObject.Elements.GetObject("/OC"); Console.WriteLine(obj);

我在控制台中为每个图像获得了以下输出:

<< /Name Background /Type /OCG >>
<< /OCGs [ 2234 0 R ] /P /AllOff /Type /OCMD >> << /Name Text Color /Type /OCG >>

这实际上是图层信息,以及/OC 键的 PDFSharp 文档:

在处理图像之前,其 可见性基于此确定 进入。如果确定为 看不见,整个图像是 跳过,好像没有做 运算符来调用它。

那么现在,如何将/OC 值修改为使这些层不可见的内容?

在 PHP/Bash/C# 中从 PDF 中删除图层/背景

经过长时间的实验,我找到了方法!我正在发布代码,以便将来有人可能会发现它有帮助:

using System;
using System.IO;
using System.Collections.Generic;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace LayerHide {
    class MainClass
    {
        public static void Main (string[] args)
        {
            PdfReader reader = new PdfReader("test.pdf");
            PdfStamper stamp = new PdfStamper(reader, new FileStream("test2.pdf", FileMode.Create));
            Dictionary<string, PdfLayer> layers = stamp.GetPdfLayers();
            foreach(KeyValuePair<string, PdfLayer> entry in layers )
            {
                PdfLayer layer = (PdfLayer)entry.Value;
                layer.On = false;
            }
            stamp.Close();
        }
    }
}