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

7

我有一份黑底白/黄字的PDF文件。

在打印之前如何去除黑色背景并将文字的颜色反转?


1
你使用什么语言、库和平台来打印?(如果你不是通过编程实现这个功能,你应该去 http://superuser.com/ 上询问,因为这个网站是用于编程问题的) - Shog9
你使用哪个PDF库? 你的代码是什么样子的? 如果这是一个现有的PDF文件,而你希望通过编程来修改它,那么有一种方法,但需要更多的细节。谢谢! - Will Marcouiller
4个回答

6
这通常不是一个简单的问题,但如果你有一系列可预测的PDF文件(比如来自同一来源),那么你可以像这样拼凑一个快速解决方案:
  • 从CPAN安装CAM::PDF
  • 运行"getpdfpage.pl my.pdf 1 > page1.txt"以获取第一页的图形代码
  • 搜索“rg”以找到RGB文本颜色更改的位置(或“RG”用于背景,或可能是灰度的“g”或“G”,或CMYK颜色的“k”或“K”,“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;
            }
         }
      }
   }
}

2
我喜欢Chris的解决方案,因为它似乎是最好的方法。我个人没有尝试过那个方法,但有一件事情对我有效,就是在pdf页面上截图,将其粘贴到图像查看器中(我使用了Irfanview),并调整颜色,直到得到白色背景和黑色文本。原始pdf文件是红色背景和黑色文本。
使用irfanview将图像转换为2种颜色(黑色和白色)。对于您,您可能需要先生成图像的反色,然后再将其转换为2种颜色(或者只进行反色图像转换就足够了)。对于我来说,最终结果导致文本出现了一些轻微的像素化,但对于我的目的(孩子学校的简单列表),这已经足够了。

1
在OS X上,如果你有GraphicConverter(据我所知,有免费的完整试用版),有一个很好的方法可以做到这一点,并裁剪掉可能由反转导致的黑色边框。
在“文件”->“转换和修改”(或者在你首先得到的选项中进行批量转换)下,你可以点击“编辑批处理”按钮,选择反转、灰度和对比度,将对比度调整到最高(当它被灰度化时,所有的颜色都是相同的),并选择裁剪,选择正确的边框(对于我的情况,它是720x540),你可以先打开文件并选择你想要的部分——所选像素会显示在一个小的状态框中。
我无法直接从pdf转换为pdf——它只改变了pdf的第一页,但输出为png则非常好,这使我能够在白色背景图像上打印漂亮的黑色文本。
然后,你就可以为下一个pdf设置好这个糟糕的设置了。

-2
在Adobe Reader中,尝试点击“编辑”>“首选项”>“辅助功能”>“文档颜色选项”>“替换文档颜色”。我认为这个方法也适用于打印。
我在Adobe社区讨论中找到了这个解决方案(http://forums.adobe.com/message/4010837)。

谢谢你,Vlastik。它有效了,但是我有白色文本,所以要让它出现在白色背景中。必须取消“仅更改黑色文本或线条艺术的颜色”的选项。 - user4699099

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接