Удалить слои / фон из PDF в PHP / Bash / C # - PullRequest
5 голосов
/ 22 мая 2011

У меня есть несколько файлов PDF, которые мне нужно изменить, используя скрипт PHP.Я также могу выполнить exec (), поэтому могу использовать практически все, что работает в CentOS.

Файлы PDF при открытии через Adobe Acrobat Pro X показывают 2 слоя на панели «Слои»:

  1. Фон
  2. Цвет

Когда я отключаю оба этих слоя, я получаю черно-белый текст и изображения (текст не является векторным,это отсканированный документ).

Я хочу отключить эти слои и любые другие подобные слои, найденные в PDF-файлах, используя PHP и / или C # или любой инструмент командной строки.

Другая полезная информация:

Когда я запускаю pdfimages (поставляется с XPDF) в моих PDF-файлах, он извлекает именно то, что мне действительно нужно, удаляясь с каждой страницы ...

Обновление дополнительной информации: я изменил пример 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 >>

, которая фактически является информацией о слое, и документация PDFSharp для ключа / OC:

Перед обработкой изображения его видимость определяется на основе этой записи.Если определено, что оно невидимо, все изображение пропускается, как если бы не было оператора Do для его вызова.

Итак, как мне теперь изменить значение / OC на что-то, что сделаетэти слои невидимы?

1 Ответ

9 голосов
/ 23 мая 2011

После долгих часов экспериментов я нашел способ! Я публикую код, чтобы кто-то мог найти его полезным в будущем:

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