как изменить все цвета в PDF на соответствующие дополнительные цвета; как сделать PDF негативом

Как все цвета в PDF-файле можно изменить в соответствии с их комплиментами? Итак, я имею в виду, что документ, состоящий из черного текста на белом фоне, будет заменен документом, состоящим из белого текста на черном фоне. Любые красные цвета в документе будут изменены на бирюзовые цвета и так далее. Есть ли какая-то стандартная утилита, которую можно использовать для этой цели, или мне, вероятно, придется придумывать некоторые неудобные преобразования изображений ImageMagick?

РЕДАКТИРОВАТЬ: Вот очень ручной способ сделать это с помощью ImageMagick:

convert -density 300 -quality 100 "${fileName}" tmp.png
mogrify -flatten *.png
mogrify -negate *.png
convert *.png "${fileName}"_1.pdf

РЕДАКТИРОВАТЬ: я изменил формулировку для ясности.


person d3pd    schedule 14.12.2013    source источник
comment
Как правило, черный текст на белом фоне вообще не имеет фона, поэтому инвертировать нечего.   -  person Jongware    schedule 14.12.2013
comment
Спасибо за ваш комментарий. Как вы думаете, вы могли бы предложить формулировку того, что я хочу? Я не уверен насчет инвертирования сейчас ...   -  person d3pd    schedule 14.12.2013
comment
Поскольку это не обычная операция с PDF, вам действительно нужно изучить какое-то неудобное преобразование изображений ImageMagick. Если результат растрового изображения приемлем, преобразуйте PDF в любой формат растрового изображения и инвертируйте его.   -  person Jongware    schedule 14.12.2013
comment
Если вы искали подход к программированию, этот ответ может вас заинтересовать.   -  person mkl    schedule 16.12.2013


Ответы (2)


Я могу придумать как минимум 3 способа инвертировать (отрицать, дополнять) цвета описания страницы в формате PDF - я имею в виду обработку содержимого страницы как черного ящика, поэтому не считая прямого погружения в содержимое страницы и безделья в соответствии с Динго ответ. К сожалению, готовые бесплатные инструменты (в основном Ghostscript) дают неполное решение и требуют ручного вмешательства.

Обратите внимание, что все конкретные термины, используемые ниже, требуют хотя бы некоторого знания основ PDF и Справочников по языку Postscript и представлены здесь в некотором упрощении. Пожалуйста, обратитесь к руководствам или Google. за подробное описание.

  1. #P3#
    gs -q -sDEVICE=pdfwrite -o out.pdf -c '{1 sub neg} settransfer' -f in.pdf
    
    #P4# #P5#
    #P6#
    #P7# #P8# #P9#
  2. В некоторой степени с TF связано использование инвертирующих цветовых профилей Device-Link, которые представляют собой простые идентификационные профили DL с инвертирующими (входными или выходными) кривыми.

    Это интересное использование интересной технологии, но, опять же, Ghostscript в настоящее время не поддерживает надлежащее управление цветом (и профили DL) в рабочих процессах PDF-2-PDF. Более того, Adobe Acrobat не знает, что делать с профилями DL, их использование внутри Acrobat требует дорогостоящих сторонних плагинов.

  3. Если средство просмотра PDF (рендерер) утверждает, что поддерживает 1.4 и прозрачность (в настоящее время все они поддерживают), это еще один путь. В Справке по PDF говорится, что если текущий Режим наложения равен Difference и мы рисуем белым цветом, это фактически означает инвертирование фона. Итак, мы явно закрашиваем фон белым цветом (если фона нет, то и инвертировать нечего), затем помещаем наш текущий контент (обрабатывая его как черный ящик), затем устанавливаем Режим наложения на Difference и рисуем поверх с белым. Это ясно? Опять же, мне не удалось установить режим наложения с помощью Ghostscript с помощью:

    [ /BM /Difference /SetTransparency pdfmark 
    

    Он нормально работает с Distiller, но игнорируется Ghostscript. Может быть (опять же) я что-то упускаю.

Хорошо, в заключение (ответ становится несколько длинным), вот Perl-решение для 3D-метода с использованием надлежащего API (сайт программирования, не так ли. Подойдет любой язык программирования и соответствующий API):

use strict;
use warnings;
use PDF::API2;
use PDF::API2::Basic::PDF::Utils;

my $pdf = PDF::API2->open('adobe_supplement_iso32000.pdf');
for my $n (1..$pdf->pages()) {
    my $p = $pdf->openpage($n);

    $p->{Group} = PDFDict();
    $p->{Group}->{CS} = PDFName('DeviceRGB');
    $p->{Group}->{S} = PDFName('Transparency');

    my $gfx = $p->gfx(1);  # prepend
    $gfx->fillcolor('white');
    $gfx->rect($p->get_mediabox());
    $gfx->fill();

    $gfx = $p->gfx();  # append
    $gfx->egstate($pdf->egstate->blendmode('Difference'));
    $gfx->fillcolor('white');
    $gfx->rect($p->get_mediabox());
    $gfx->fill();
}
$pdf->saveas('out.pdf');

Здесь я беру один из документов Adobe и инвертирую его.

введите здесь описание изображения

Что важно: на странице должно быть явно задано пространство смешивания прозрачности в RGB, потому что Adobe Reader по умолчанию использует CMYK, а инвертирование цветов в CMYK вам, вероятно, не нужно. Чистый черный CMYK 0-0-0-100 инвертируется в 100-100-100-0, это тоже (почти) черный. Черный RGB дает что-то вроде 70-60-50-70 CMYK, который инвертируется в коричневый 30-40-50-30, а вам это не нужно. Вот почему я добавляю групповую запись в словари страниц.

person user2846289    schedule 15.12.2013
comment
Большое спасибо за Вашу помощь. Я многому научился из ваших описаний. Отсутствие стандартизации примечательно, не так ли? Больше всего я выиграл от вашего Perl-подхода к модулю PDF::API2. Для тех, кто использует репозитории Ubuntu, этот модуль API можно установить с помощью пакета libpdf-api2-perl. - person d3pd; 18.12.2013
comment
Вот это да! этот perl-скрипт работает для меня как для просмотра pdf в chrome и для просмотра его на моем ipad с ibooks! В этом случае он действительно инвертирует правильно! Хотел бы я дать этому ответу тысячу голосов. - person xdavidliu; 24.05.2019

Ваш вопрос, кажется, очень похож на этот:

Изменить цвет фона pdf

но вы также хотите изменить цвет текста.

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

----------------

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

ПРЕДВАРИТЕЛЬНАЯ ПРОВЕРКА:

откройте файл PDF с помощью редактора, способного показать внутреннюю структуру PDF, например

notepad++http://notepad-plus-plus.org/download/v6.1.8.html

и проверьте, видите ли вы такие фрагменты кода, как

0.000 0.000 0.000 rg (it means *black*)
1.000 1.000 1.000 rg (it means *white*)

и так далее...

(фрагмент кода может измениться, например, в pdf, созданном с помощью внутренней функции экспорта pdf openoffice, те же фрагменты кода находятся в следующих формах:

0 0 0 rg (it means *black*)
1 1 1 rg (it means *white*)

и так далее...

если вы можете видеть эти фрагменты кода, то вы можете начать изменять значения, в противном случае вам нужно распаковать текстовые потоки

вы можете выполнить эту задачу с

pdftk

http://www.pdflabs.com/docs/install-pdftk/

pdftk file.pdf output uncompressed.pdf uncompress

и повторно сжать после законченных изменений

pdftk uncompressed.pdf output recompressed.pdf compress

теперь, если вы видите эти фрагменты кода, вы можете изменить значения

ШАГ 1 (для редактирования PDF) -

первое, что вам нужно, это найти правильную эквивалентность между цветовыми значениями RGB текста и фона и внутренним представлением тех же цветов в формате PDF.

Поскольку кажется, что вы житель Windows с третьей планеты в созвездии Microsoft, вы можете использовать бесплатную палитру цветов, подобную этой

http://www.iconico.com/download.aspx?app=ColorPic&type=free

для определения значений RGB цвета текста и фона

когда у вас есть эти значения, вам нужно преобразовать их в специальное внутреннее представление в формате PDF.

для этого примите во внимание эту пропорцию:

1:255=x:выбранный вами цвет

например: скажем, у вас есть этот триплет RGB для фона:

30,144,255

лазурный фон

чтобы узнать соответствующие значения в pdf, чтобы вставить фрагмент кода для изменения цвета фона pdf, вы делаете: (вы можете использовать http://www.wolframalpha.com/ для точных вычислений)

1:255=x:30 = 30/255 = 0.117 (approximated to first three decimals)

1:255=x:144 = 144/255 = 0.564 (approximated to first three decimals)

1:255=x:255 = 255/255 = 1

Итак, весь триплет в pdf, соответствующий RGB 30 144 255, будет таким:

0.117 0.564 1.000

ШАГ 2 (для редактирования PDF)

мы ищем 0,117 0,564 1,000 в pdf-файле с помощью notepad++ (необходимо проверить обтекание и соответствие только одному слову), и мы нашли внутреннее pdf-представление фона, и мы можем изменить цвет с лазурного на, скажем, белый

1.000 1.000 1.000

or

1 1 1

но, поскольку вы написали про черный фон, точнее, я создал образец pdf с белым фоном и черным текстом.

черный текст на белом фоне

поскольку мы знаем, что 0.000 0.000 0.000 rg означает черный, мы ищем это и можем изменить 0.000 0.000 0.000 rg на 1.000 1.000 1.000 rg (белый), НО...

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

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

и далее действуем следующим образом:

мы меняем белый фон с 1.000 1.000 1.000 на что-то вроде

0.5 0.5 0.5 (light grey)

black_on_gray

затем ищем

0.000 0.000 0.000 (black text) and change to **white**
1.000 1.000 1.000

полученный промежуточный файл pdf:

белое на сером

наконец, мы снова меняем цвет фона с

0.5 0.5 0.5 (light grey)

в черный

0.000 0.000 0.000

и теперь у нас есть векторный pdf с белым текстом и черным фоном

белое на черном

пожалуйста, не забудьте

1 - снова сжать этот PDF-файл, который вы модифицировали, если вы распаковали его с помощью pdftk 2 - восстановить

pdftk file.pdf output fixed.pdf

шаги

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

не в этом посте, чтобы не быть слишком многословным

дайте отзыв, пожалуйста, и не стесняйтесь спрашивать больше

person Dingo    schedule 14.12.2013
comment
Большое спасибо за вашу помощь. Я совершенно новичок в редактировании PDF-файлов таким образом, но я многому научился у вас. Я продолжу экспериментировать, потому что стремлюсь преобразовать все цвета в соответствующие им дополнения. В очередной раз благодарим за помощь! ... и да будет известно, что я не являюсь членом Галактической Империи Micro$oft - я Ubuntunaut! - person d3pd; 18.12.2013