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

发布于 2024-11-08 15:57:33 字数 1134 浏览 0 评论 0原文

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

通过 Adob​​e 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);

我在每个图像的控制台中得到以下输出:
<代码><< /名称背景 /类型 /OCG >>
<代码><< /OCGs [ 2234 0 R ] /P /AllOff /Type /OCMD>>
<代码><< /Name Text Color /Type /OCG >>

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

在图像处理之前,其 可见度是根据此确定的 入口。如果确定是 不可见,整个图像是 跳过,就好像没有做一样 运算符来调用它。

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

I have some PDF files that I need to modify using a PHP script. I'm also able to exec() so I can use pretty much anything that runs on CentOS.

The PDF files when opened through Adobe Acrobat Pro X, show 2 layers in the "layers" panel:

  1. Background
  2. Color

When I disable both of these layers I end up with a black & white text & images (the text is not vector tho, it's a scanned document).

I want to disable these layers and any other similar layer found in the PDFs using PHP and/or C# or any command-line tool.

Other useful information:

When I run pdfimages (provided with XPDF) on my PDFs, it extracts exactly what I actually need removed from each page...

Additional Information Update:
I modified the PDFSharp example here: http://www.pdfsharp.net/wiki/ExportImages-sample.ashx :

Modified:
Line 28: ExportImage(xObject, ref imageCount);

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

I got the following output in the console for each image:
<< /Name Background /Type /OCG >>
<< /OCGs [ 2234 0 R ] /P /AllOff /Type /OCMD >>
<< /Name Text Color /Type /OCG >>

Which is actually the layer information, and the PDFSharp Documentation for the /OC key:

Before the image is processed, its
visibility is determined based on this
entry. If it is determined to be
invisible, the entire image is
skipped, as if there were no Do
operator to invoke it.

So now, how do I modify the /OC value to something that will make these layers invisible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

很酷不放纵 2024-11-15 15:57:33

经过长时间的尝试,我找到了方法!我发布代码是为了将来有人可能会发现它很有帮助:

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();
        }
    }
}

After long hours of experimenting, I found the way! I'm posting the code so someone may find it helpful in the future:

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();
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文