Удалить слои/фон из PDF в PHP/Bash/C#

У меня есть несколько файлов 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);

To:
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 на что-то, что сделает эти слои невидимыми?


person Tom    schedule 22.05.2011    source источник
comment
так что не стесняйтесь опубликовать решение, используя любой из них. К сожалению, этот сайт не работает так. Вам действительно нужно попробовать код самостоятельно, показать, где вы запутались, тогда мы можем попытаться оказать некоторую помощь. В противном случае вы можете опубликовать множество фриланс-досок, которые могут предоставить вам такой код за определенную плату, если требования выполнимы.   -  person onteria_    schedule 22.05.2011
comment
Меня смущает тот факт, что ни одна из библиотек и инструментов для работы с PDF в сети не имеет чего-то вроде извлечения информации о слоях. Мне не нужно полное решение, я просто хочу, чтобы кто-то указал мне на правильную ссылку или возможность инструмента.   -  person Tom    schedule 22.05.2011
comment
Я предполагаю, что это было бы довольно сложно сделать, я не могу сказать, что когда-либо видел инструмент командной строки или библиотеку, которая могла бы это сделать. Вполне возможно, что код из pdfimages можно было бы адаптировать для вырезания, а не для копирования.   -  person Orbling    schedule 22.05.2011
comment
Сейчас я просматриваю этот код: pdfsharp.net/wiki/ExportImages-sample.ashx Теперь давайте посмотрим, сможет ли он удалить изображения с каждой страницы вместо того, чтобы экспортировать их, скачав сейчас :D   -  person Tom    schedule 22.05.2011


Ответы (1)


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

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();
        }
    }
}
person Tom    schedule 23.05.2011