7

背景が黒でテキストが白/黄色の PDF があります。

印刷前に黒い背景を削除して、テキストの色を反転するにはどうすればよいですか?

4

4 に答える 4

6

これは一般的に解決するのは簡単ではありませんが、予測可能な PDF のコレクション (たとえば、すべて同じソースからのもの) がある場合は、次のような簡単な解決策を一緒にハックできる可能性があります。

  • CPAN からCAM::PDFをインストール
  • 「getpdfpage.pl my.pdf 1 > page1.txt」を実行して、ページ 1 のグラフィック コードを取得します。
  • 「rg」を検索して、RGB テキストの色が変更された場所を見つけます (または、背景の「RG」、グレースケールの場合は「g」または「G」、CMYK カラーの「sc」または「SC」の場合は「k」または「K」)。 " 特別な色空間の場合)
  • 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;
            }
         }
      }
   }
}
于 2009-10-02T02:57:21.317 に答える
2

Chris のソリューションが最善の方法のように思われるので、気に入っています。私は個人的にそれを試したことはありませんが、私にとってうまくいったことの1つは、問題のpdfページのスクリーンショットを撮り、それを画像ビューアーに貼り付け(Irfanviewを使用しました)、白い背景が得られるまで色を操作することでした黒のテキスト。元の pdf は、背景が赤でテキストが黒でした。

irfanview を使用して、画像を 2 色 (白黒) に変換しました。あなたの場合、最初に画像のネガを生成し、次に 2 色に変換する必要がある場合があります (または、ネガ画像の変換だけで十分な場合もあります)。私にとっての最終結果は、テキストにいくつかのマイナーなピクセル化をもたらしましたが、私の目的 (子供の学校からの単純なリスト) では問題なく機能しました。

于 2009-10-25T02:37:02.050 に答える
1

OS X では、GraphicConverter (私が最後に確認した無料の完全な試用版が利用可能です) を持っている場合、これを行うための優れた方法があり、反転によって生じる可能性のある黒い境界線も切り取ります。

[ファイル]-> [変換と変更] (または最初に取得したオプションのバッチ変換) の下で、[バッチの編集] ボタンをクリックして、反転、グレースケール、コントラストを選択し、コントラストを完全に調整します (取得したとき)。グレースケールはすべて同じです)、トリミングも選択し、適切な境界線を選択します(私の状況では720x540でした)。これは、ファイルを開いて必要な部分を選択することで最初に確認できます-選択したピクセルが少し表示されますステータスボックス。

pdf から pdf に直接変換することはできませんでした。pdf の最初のページが変更されただけでしたが、png として出力するとうまくいき、白い背景画像に素敵な黒いテキストを印刷することができました。

次に、この悪いセットアップを使用して、次の pdf 用にすべてのセットアップを行います。

于 2011-04-08T02:55:02.953 に答える