Компонент .NET для преобразования цветного PDF в оттенки серого - PullRequest
4 голосов
/ 30 сентября 2011

В настоящее время я использую Ghostscript для преобразования цветных PDF-файлов в полутоновые PDF-файлы .Сейчас я ищу надежный .NET коммерческий или не коммерческий компонент / библиотека для замены ghostscript.Я гуглил и не нашел ни одного компонента / библиотеки, который мог бы сделать это легко или сделать это вообще.

РЕДАКТИРОВАТЬ # 1:

Почему Ghostscript у меня не работает:

Я реализовал Ghostscript и использую его нативный API.Проблема в том, что Ghostscript не поддерживает несколько экземпляров интерпретатора в рамках одного процесса.-DJOBSERVER режим также не работает для меня, потому что я не собираю всю работу, и они обрабатывают их все сразу.Бывает, что Ghostscript обрабатывает большую работу, которая занимает около 20 минут, и тем временем я получаю небольшую работу, которая должна быть обработана как можно скорее и не может ждать 20 минут.Другая проблема заключается в том, что обработанные событиями страницы Ghostscript нелегко отловить.Я написал парсер для сообщений ghostscript stdout и могу считать обработанный номер страницы, но не для каждой страницы, когда она обрабатывается как ghostscript, отправляет сообщение для группы обработанных страниц.Есть еще несколько проблем с Ghostscript, таких как создание плохих pdf, дублирование проблем со шрифтами .....

Вы можете найти еще одну проблему, с которой я столкнулся с ghostscript, здесь: Ghostscript - PS в PDF - инвертированные изображенияпроблема

-

через год после ОБНОВЛЕНИЯ:

До начала года я задавал этот вопрос.Позже я сделал свое собственное решение, используя iTextSharp.

Здесь вы можете посмотреть преобразование PDF в оттенки серого:

http://habjan.blogspot.com/2013/09/proof-of-concept-converting-pdf-files.html

или

https://itextsharpextended.codeplex.com/

У меня работает в большинстве случаев:)

Ответы [ 6 ]

3 голосов
/ 07 октября 2011

Не совсем ответ, но я думаю, что вы слишком быстро отвергаете Ghostscript.

Известно ли вам об API GhostScript (для Ghostscript в процессе)? Или в режиме -dJOBSERVER, который может принимать серию команд PS, переданных по стандарту в?

Это все равно не даст вам ваши обратные вызовы, но оно не является многопоточным.


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

Вам также придется заменить данные пикселей в любых изображениях, которые вы можете найти.

Хорошей новостью является то, что iText [Sharp] способен работать в нескольких потоках, при условии, что каждый документ используется из одного потока одновременно.

Я подозреваю, что это также относится и к предлагаемой коммерческой библиотеке, что не очень хорошая сделка.


А потом над моей головой зажегся свет… нарисованный в оттенках серого.

Режимы наложения и группы прозрачности!

Возьмите все содержимое текущей страницы и вставьте его в группу прозрачности, которая смешана со сплошным черным прямоугольником, который покрывает страницу. Я думаю, что есть даже режим яркости альфа-смеси ... давайте посмотрим здесь.

Да, PDF справочный раздел 11.6.5.2 «Словари мягких масок». Вы будете хотеть группу "яркости".

Теперь плохие новости. Если ваша цель при переходе на шкалу серого - сэкономить место, это полностью провалится. Это на самом деле сделает каждый файл немного больше ... скажем, 100 байт на страницу, отдайте или возьмите.

Программное обеспечение для рендеринга PDF тоже должно быть довольно популярным. Проект рендеринга вашего двоюродного брата не должен применяться. Это продвинутые графические материалы, которые нечасто используются в обычных PDF-файлах, поэтому последнее, что нужно реализовать.

Итак ... Для каждой исходной страницы

  1. Создать новую страницу.

  2. Накройте его черным фоном.

  3. Покройте его белым прямоугольником (раньше он был в обратном направлении) в группе прозрачности, в которой словарь мягкой маски установлен в качестве яркости содержимого оригинальной страницы (теперь хранится в форме XObject).

Поскольку это весь ваш собственный код, у вас будет широкая возможность делать все, что вы хотите, в начале или в конце каждой страницы.

Боже, это просто сумасшествие, чтобы работать! Это требует некоторого PDF-Fu, но не так сильно, как «преобразование каждого цветового пространства и изображения различными способами, как я прохожу документ». Более глубокие знания, меньше кода для написания.

2 голосов
/ 30 сентября 2011

Это не библиотека .net, а скорее потенциальный обходной путь. Вы можете установить виртуальный принтер, способный записывать файлы PDF. Я бы предложил CutePDF, так как он бесплатный, простой в использовании и отлично справляется с печатью большого количества форматов файлов в PDF. С CutePDF вы можете делать практически все, что можете делать с обычным принтером, включая печать в оттенках серого.

После установки виртуального принтера вы можете использовать c # для «печати» версии в оттенках серого.

Редактировать: Я только что вспомнил, что бесплатная версия не молчит. После печати на принтере CutePDF он попросит вас «Сохранить как». У них есть SDK, доступный для покупки, но я не могу сказать, сможет ли он помочь вам перейти в оттенки серого.

1 голос
/ 24 сентября 2013

За год до этого я задал этот вопрос. Позже я сделал собственное решение, используя iTextSharp.

Вы можете взглянуть на решение для преобразования PDF в оттенки серого здесь: https://itextsharpextended.codeplex.com/

1 голос
/ 05 октября 2011

Если вам подходит коммерческий продукт, позвольте мне порекомендовать Amyuni PDF Creator .Net .Используя его, вы сможете перечислять все элементы на странице и соответственно менять их цвета, изображения также можно установить в градациях серого. Применяются обычные заявления об отказе от ответственности

Пример кода с использованием Amyuni PDF Creator ActiveX, версия .Net будет аналогичным:

        pdfdoc.ReportState = ReportStateConstants.acReportStateDesign;
        object[] page_items = (object[])pdfdoc.get_ObjectAttribute("Pages[1]", "Objects");

        string[] color_attributes = new string[] { "TextColor", "BackColor", "BorderColor", "StrokeColor" };
        foreach (acObject page_item in page_items)
        {
            object _type = page_item["ObjectType"];
            if ((ACPDFCREACTIVEX.ObjectTypeConstants)_type == ACPDFCREACTIVEX.ObjectTypeConstants.acObjectTypePicture)
            {
                page_item["GrayScale"] = true;
            }
            else
                foreach (string attr_name in color_attributes)
                {
                    try
                    {
                        Color color = System.Drawing.ColorTranslator.FromWin32((int)page_item[attr_name]);
                        int grayColor = (int)(0.3 * color.R + 0.59 * color.G + 0.11 * color.B);
                        int newColorRef = System.Drawing.ColorTranslator.ToWin32(Color.FromArgb(grayColor, grayColor, grayColor));
                        page_item[attr_name] = newColorRef;
                    }
                    catch { } //not all items have all kinds of color attributes
                }
        }
0 голосов
/ 10 октября 2011

После большого количества исследований я узнал о ABCpdf от Websupergoo .Их компонент может легко преобразовать любую PDF-страницу в оттенки серого, просто вызвав метод Recolor .Компонент коммерческий.

0 голосов
/ 06 октября 2011

iTextPdf хороший продукт для создания / управления pdf. Имеется как коммерческая, так и бесплатная версии.

Посмотрите aspose.pdf для .net itпредоставляет следующие функции и многое другое.

  • Добавление и удаление водяных знаков из документа PDF
  • Установка поля страницы, размера, ориентации, типа перехода, коэффициента масштабирования и внешнего вида документа PDF
  • ..

И здесь - это список PDF-библиотек с открытым исходным кодом.

...