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

Tom*_*Tom 5 php c# pdf gd imagemagick

我有一些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文档:

在处理图像之前,将根据此条目确定其可见性.如果确定不可见,则跳过整个图像,就好像没有Do操作符来调用它一样.

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

Tom*_*Tom 9

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

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)