Как удалить черный фон из текста 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)