如何在打印前从PDF文本中删除黑色背景

时间:2009-09-28 18:19:07

标签: pdf printing colors edit

我的PDF有黑色背景和白/黄文字。

如何在打印前删除黑色背景并反转文本的颜色?

4 个答案:

答案 0 :(得分:6)

一般来说这可能是非常重要的,但是如果你有一个可预测的PDF集合(比如,所有来自同一个来源),那么你可以将这样的快速解决方案组合起来:

  • 从CPAN安装CAM::PDF
  • 运行“getpdfpage.pl my.pdf 1> page1.txt”获取第1页的图形代码
  • 搜索“rg”以查找RGB文本颜色的位置(或“RG”表示背景,或者“g”或“G”表示灰度,“k”或“K”表示CMYK颜色“sc”或“SC”表示特殊颜色空间)
  • 编辑page1.txt以设置您喜欢的颜色
  • 运行“setpdfpage.pl my.pdf 1 page1.txt out.pdf”

所有这些都可以通过编程方式完成,而不是通过命令行工具。 getpdfpage.pl和setpdfpage.pl是围绕CAM :: PDF API的简单小包装器。

一般的解决方案是使用getPageContentTree()来解析PDF页面语法并搜索颜色更改操作符并更改它们。但是,如果您的PDF使用自定义颜色空间(“sc”),这可能会非常棘手。并且搜索执行整页黑色填充的操作员也可能很难,具体取决于几何形状。

如果您提供示例PDF的URL,我可以提供一些更具体的建议。

更新:一时兴起,我写了一个可能适用于某些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;
            }
         }
      }
   }
}

答案 1 :(得分:2)

我喜欢克里斯的解决方案,因为它似乎是最好的方式。我没有亲自尝试过这个,但有一件事对我有用的是拍摄有问题的pdf页面的屏幕截图,将其粘贴在图像查看器中(我使用Irfanview),并操纵颜色直到我得到白色背景黑色文字。原始的pdf是带有黑色文本的红色背景。

使用irfanview将图像转换为2种颜色(黑白)。对于您,您可能必须首先生成图像的负片,然后转换为2种颜色(或者可能只是负片图像转换可能就足够了)。对我来说最终的结果是文本中出现了一些小的像素化,但是出于我的目的(来自孩子学校的简单列表),它运行良好。

答案 2 :(得分:1)

在OS X上,如果你有GraphicConverter(最后我检查了免费的完整试用版),那么有一个很好的方法可以做到这一点,并裁掉可能由反转引起的黑色边框。

在File-&gt;转换&amp;修改(或您首先获得的选项中的批量转换),您可以点击“编辑批次”按钮,然后选择反转,灰度和对比度,一直调整对比度(当它被灰度化时,它们都是相同的),并选择裁剪并选择正确的边框(对于我的情况是720x540),您可以先打开文件并选择所需的部分进行检查 - 选中的像素显示在一个小状态框中。

我无法直接从pdf转换为pdf - 它只更改了pdf的第一页,但输出为pngs很好地完成了这一操作,这使我可以在白色背景图像上打印漂亮的黑色文本。 / p>

然后你已经为这个糟糕的设置设置了下一个pdf。

答案 3 :(得分:-2)

在Adobe Reader中尝试编辑&gt;偏好&gt;可访问性&gt;文档颜色选项&gt;替换文档颜色。我认为它也适用于印刷。

我在Adobe社区讨论(http://forums.adobe.com/message/4010837

上找到了这个解决方案