У меня есть некоторые PDF-файлы, которые мне нужно изменить с помощью PHP-скрипта. Я также могу exec (), поэтому я могу использовать почти все, что работает на CentOS.
Файлы PDF, открытые через Adobe Acrobat Pro X, показывают 2 слоя на панели «слои»:
Когда я отключу оба этих слоя, я получаю черно-белый текст и изображения (текст не является вектором tho, это отсканированный документ).
Я хочу отключить эти слои и любой другой подобный слой, найденный в 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 на то, что сделает эти слои невидимыми?
После долгих часов экспериментов я нашел путь! Я отправляю код, чтобы кто-то мог найти его полезным в будущем:
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(); } } }