【问题标题】:How to remove a black background from PDF text before printing如何在打印前从 PDF 文本中删除黑色背景
【发布时间】:2010-12-02 02:13:53
【问题描述】:

我有一个黑色背景和白色/黄色文本的 PDF。

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

【问题讨论】:

  • 您使用什么语言、库和平台进行打印? (如果您不是以编程方式执行此操作,则应改为在 superuser.com 上提问 - 该站点用于编程问题)
  • 您使用的是什么 PDF 库?你的代码是什么样的?如果这是一个现有的 PDF 文件,并且您希望以编程方式对其进行更改,则有一种方法,但需要一些进一步的细节。谢谢!

标签: pdf printing colors edit


【解决方案1】:

一般来说,解决这个问题可能并非易事,但如果您有一个可预测的 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】:

    我喜欢 Chris 的解决方案,因为它似乎是最好的方法。我没有亲自尝试过,但对我有用的一件事是截取相关 pdf 页面的屏幕截图,将其粘贴到图像查看器中(我使用 Irfanview),然后操纵颜色直到我得到白色背景黑色文本。原始 pdf 是红底黑字。

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

    【讨论】:

      【解决方案3】:

      在 OS X 上,如果您有 GraphicConverter(我上次检查时提供免费的完整试用版),有一个很好的方法可以做到这一点,并剪掉可能由反转导致的黑色边框。

      在File->Convert & Modify(或你第一次得到的选项中的批量转换)下,你可以点击“Edit Batches”按钮,选择反转、灰度和对比度,将对比度一直向上调整(当它被灰度化时都是一样的),然后选择裁剪并选择右边框(对于我的情况是720x540),您可以首先通过打开文件并选择您想要的部分来检查 - 选择的像素显示在一个小状态框中。

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

      那么你已经用这个糟糕的设置为下一个 pdf 设置好了。

      【讨论】:

        【解决方案4】:

        在 Adob​​e Reader 中尝试编辑 > 首选项 > 辅助功能 > 文档颜色选项 > 替换文档颜色。我认为它也应该适用于打印。

        我在 Adob​​e 社区讨论 (http://forums.adobe.com/message/4010837) 上找到了这个解决方案

        【讨论】:

        • 谢谢Vlastik ..它的工作,但我有白色的文字,使它出现在白色背景中。必须取消选中“仅更改黑色文本或线条艺术的颜色”。
        猜你喜欢
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        • 2018-03-28
        • 2020-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        相关资源
        最近更新 更多