Как удалить черный фон из текста PDF перед печатью
У меня есть PDF с черным фоном и белым/желтым текстом.
Как удалить черный фон перед печатью и инвертировать цвет текста?
4 ответов
это, вероятно, будет нетривиальным для решения в целом, но если у вас есть предсказуемые коллекции PDF-файлов( скажем, все из одного источника), то вы можете взломать быстрое решение, например:
- установить CAM:: PDF из CPAN
- run "getpdfpage.pl мой.в формате PDF 1 > страница1.txt", чтобы получить графические коды к странице 1
- поиск "rg", чтобы найти, где цвет текста RGB изменяется (или " RG "для фона, или, возможно," g " или " G" для оттенков серого или " k "или" K "для цветов CMYK" sc "или" SC " для специальных цветовых пространств)
- изменить страницу 1.txt, чтобы установить цвета, которые вам нравятся
- run "setpdfpage.pl мой.в формате PDF 1 страница1.txt вне.PDF-файл"
все это можно сделать программно, а не с помощью инструментов командной строки. getpdfpage.pl и setpdfpage.pl простые маленькие обертки вокруг CAM:: PDF API.
общим решением было бы использовать getPageContentTree() для синтаксического анализа страницы PDF и искать операторов изменения цвета и изменять их. Но если ваш PDF использует настраиваемое цветовое пространство ("sc"), это может быть сложно. И поиск оператора, который делает полностраничную черную заливку, тоже может быть сложным, в зависимости от геометрии.
Если вы предоставите URL для образца PDF, я мог бы предоставить более конкретные советы.
обновление: по прихоти я написал рудиментарный сценарий смены цвета, который может работать для некоторых PDF-файлов. Чтобы использовать его, бегите так пример, который превращает любой красный элемент в зеленый:
perl recolor.pl input.pdf '1 0 0 rg' '0 1 0 rg' out.pdf
для этого необходимо знать синтаксис PDF директив цвета, которые вы пытаетесь изменить, поэтому может потребоваться что-то вроде getpdfpage.pl шаги, рекомендованные выше.
и исходный код:
#!/usr/bin/perl -w
use strict;
use CAM::PDF;
use CAM::PDF::Content;
my %COLOROPS = map {$_ => 1} qw(rg RG g G k K sc SC);
my $pdf = CAM::PDF->new(shift) || die $CAM::PDF::errstr;
my @oldcolors;
my @newcolors;
while (@ARGV >= 2) {
push @oldcolors, parseColor(shift);
push @newcolors, parseColor(shift);
}
my $out = shift || '-';
for my $p (1 .. $pdf->numPages) {
my $page = $pdf->getPageContentTree($p);
traverse($page->{blocks});
$pdf->setPageContent($p, $page->toString());
}
$pdf->cleanoutput($out);
sub parseColor {
my ($in) = @_;
my $ops = CAM::PDF::Content->new($in);
die 'Invalid color syntax in ' . $in if !$ops->validate();
my @blocks = @{$ops->{blocks}};
die 'Expected one color operator in ' . $in if @blocks != 1;
my $color = $blocks[0];
die 'Not a color operator in ' . $in if !exists $COLOROPS{$color->{name}};
return $color;
}
sub traverse {
my ($blocks) = @_;
for my $op (@{$blocks}) {
if ($op->{type} eq 'block') {
traverse($op->{value});
} elsif (exists $COLOROPS{$op->{name}}) {
COLOR:
for (my $i=0; $i < @oldcolors; ++$i) {
my $old = $oldcolors[$i];
if ($old->{name} eq $op->{name} && @{$old->{args}} == @{$op->{args}}) {
for (my $v=0; $v < @{$op->{args}}; ++$v) {
next COLOR if $old->{args}->[$v]->{value} != $op->{args}->[$v]->{value};
}
# match! so we will replace
$op->{name} = $newcolors[$i]->{name};
@{$op->{args}} = @{$newcolors[$i]->{args}};
last COLOR;
}
}
}
}
}
Мне нравится решение Криса, так как это, кажется, лучший способ пойти. Я лично не пробовал это, но одна вещь, которая сработала для меня, - это снимок экрана рассматриваемой страницы pdf, вставка ее в Средство просмотра изображений (я использовал Irfanview) и манипулирование цветами, пока я не получил белый фон с черным текстом. Оригинальный pdf-файл был красным фоном с черным текстом.
используется irfanview для преобразования изображения в 2 цвета (черный и белый). Для вас, возможно, придется создать сначала отрицательное изображение, а затем преобразовать в 2 цвета (или, возможно, просто отрицательное преобразование изображения может быть достаточно). В итоге для меня вылилось в незначительные pixellation в тексте, но для моих целей (простой список из школы детей), все работало нормально.
в OS X, если у вас есть GraphicConverter (бесплатная Полная пробная версия, доступная в последний раз, когда я проверял), есть отличный способ сделать это и обрезать черную границу, которая может возникнуть в результате инверсии.
под файлом - >конвертировать и изменять (или Пакетное преобразование в параметрах, которые вы сначала получаете), вы можете нажать кнопку" Редактировать пакеты " и выбрать инвертировать, оттенки серого и контраст, настроить контраст полностью вверх (когда он получает оттенки серого, это все равно), а также выбрать обрезать и выбрать правильный граница (для моей ситуации это было 720x540), которую вы можете сначала проверить, открыв файл и выбрав нужную часть-выбранные пиксели отображаются в маленьком поле состояния.
Я не смог конвертировать из pdf в pdf напрямую-он изменил только первую страницу pdf, но вывод, поскольку pngs сделал трюк красиво, что позволило мне печатать хороший черный текст на белых фоновых изображениях.
тогда у вас все настроено для следующего pdf с этой плохой настройкой.
в программе Adobe ридер попробовать редактирование " > "установки" > "Универсальный доступ" > " параметры цветов документа > заменить цвета документа. Я думаю, что это также должно работать для печати.
Я нашел это решение в обсуждениях сообщества Adobe (http://forums.adobe.com/message/4010837)