2009-09-28 775 views
5

我有一个黑色背景和白色/黄色文本的PDF。如何在打印前从PDF文本中删除黑色背景

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

+1

什么语言,库和平台,您使用的打印此解决方案? (如果您没有以编程方式执行此操作,则应该询问http://superuser.com/,而不是 - 此站点用于编程问题) – Shog9 2009-09-28 18:22:39

+0

您正在使用哪种PDF库? 你的代码是什么样的? 如果这是一个现有的PDF文件,并且您希望以编程方式进行更改,则有一种方法,但需要一些更多详细信息。谢谢! – 2009-09-28 18:23:23

回答

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; 
      } 
     } 
     } 
    } 
} 
2

我喜欢克里斯的解决方案,因为它似乎是最好的一段路要走。我还没有亲自尝试过,但有一件事对我来说很有用,那就是将PDF页面的屏幕截图置于图像查看器中(我使用Irfanview),然后操作颜色直到获得白色背景黑色文本。原始pdf是带有黑色文本的红色背景。

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

1

在OS X上,如果你有GraphicConverter(上次我检查过免费的完整试用版),那么有一个很好的方法可以做到这一点,并且裁剪掉可能由反转导致的黑边。

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

我无法直接从PDF格式转换为pdf格式 - 它只是改变了pdf的第一页,但输出成png格式很好,这让我可以在白色背景图像上打印漂亮的黑色文字。

然后,你已经把这一切都设置为下一个PDF与这个糟糕的设置。

-3

在Adobe Reader中,尝试编辑>首选项>辅助功能>文档颜色选项>替换文档颜色。我认为它也适用于印刷。

我已经找到了Adobe社区讨论(http://forums.adobe.com/message/4010837

+0

谢谢你Vlastik..Its工作,但我有白色的文字,使它出现在白色的背景。必须取消选中“仅更改黑色文本或线条图的颜色”。 – 2015-03-22 06:40:13