SORU
13 Mart 2009, Cuma


Nasıl PDF sayfa renkli veya siyah-beyaz olduğunu nereden bileceğim?

Verilen bir dizi PDF dosyası arasında bazı sayfaları renkli ve kalan siyah & beyaz, herhangi bir program bulmak arasında verilen sayfaları hangi renk ve siyah & beyaz? Bu yararlı bir tez çıktılarını örneğin, sadece harcama için ekstra renkli sayfa yazdırın. Hesap çift taraflı baskı içine alır, ve o renkli yazıcı için siyah ve beyaz uygun bir sayfa gönderen kişi için Bonus puan karşı tarafta renkli bir sayfa tarafından takip edilmektedir.

CEVAP
15 Mart 2009, Pazar


Bu gördüğüm en ilginç sorulardan biridir! Bir bit eşlem oluşturma ve sonra da bit eşlem analiz etmek için en ideal çözüm olacaktır diğer bazı mesajlar katılıyorum. Basit PDF'leri için, burada daha hızlı ama daha az tam bir yaklaşım.

  1. Her PDF Sayfa ayrıştırmak
  2. Renk yönergeleri için (g, rg, k, sc, sahne, vb) bakın
  3. Gömülü görüntüler için bak, renk için analiz

Benim çözüm aşağıda 1 ve 2 numaralı yarısı yok. Diğer yarım #2 olurdu takip ile kullanıcı tanımlı renk, hangi içerir ararken /Alınmış girdileri, sayfa ve kod çözme ... bana ulaşın çevrimdışı eğer bu ilginç, çok yapılabilir ama 5 dakika.

İlk ana programı:

use CAM::PDF;

my $infile = shift;
my $pdf = CAM::PDF->new($infile);
PAGE:
for my $p (1 .. $pdf->numPages) {
   my $tree = $pdf->getPageContentTree($p);
   if (!$tree) {
      print "Failed to parse page $p\n";
      next PAGE;
   }
   my $colors = $tree->traverse('My::Renderer::FindColors')->{colors};
   my $uncertain = 0;
   for my $color (@{$colors}) {
      my ($name, @rest) = @{$color};
      if ($name eq 'g') {
      } elsif ($name eq 'rgb') {
         my ($r, $g, $b) = @rest;
         if ($r != $g || $r != $b) {
            print "Page $p is color\n";
            next PAGE;
         }
      } elsif ($name eq 'cmyk') {
         my ($c, $m, $y, $k) = @rest;
         if ($c != 0 || $m != 0 || $y != 0) {
            print "Page $p is color\n";
            next PAGE;
         }
      } else {
         $uncertain = $name;
      }
   }
   if ($uncertain) {
      print "Page $p has user-defined color ($uncertain), needs more investigation\n";
   } else {
      print "Page $p is grayscale\n";
   }
}

Ve sonra burada her sayfada renk yönergeleri işleme yardımcı göstericisi

package My::Renderer::FindColors;

sub new {
   my $pkg = shift;
   return bless { colors => [] }, $pkg;
}
sub clone {
   my $self = shift;
   my $pkg = ref $self;
   return bless { colors => $self->{colors}, cs => $self->{cs}, CS => $self->{CS} }, $pkg;
}
sub rg {
   my ($self, $r, $g, $b) = @_;
   push @{$self->{colors}}, ['rgb', $r, $g, $b];
}
sub g {
   my ($self, $gray) = @_;
   push @{$self->{colors}}, ['rgb', $gray, $gray, $gray];
}
sub k {
   my ($self, $c, $m, $y, $k) = @_;
   push @{$self->{colors}}, ['cmyk', $c, $m, $y, $k];
}
sub cs {
   my ($self, $name) = @_;
   $self->{cs} = $name;
}
sub cs {
   my ($self, $name) = @_;
   $self->{CS} = $name;
}
sub _sc {
   my ($self, $cs, @rest) = @_;
   return if !$cs; # syntax error                                                                                             
   if ($cs eq 'DeviceRGB') { $self->rg(@rest); }
   elsif ($cs eq 'DeviceGray') { $self->g(@rest); }
   elsif ($cs eq 'DeviceCMYK') { $self->k(@rest); }
   else { push @{$self->{colors}}, [$cs, @rest]; }
}
sub sc {
   my ($self, @rest) = @_;
   $self->_sc($self->{cs}, @rest);
}
sub SC {
   my ($self, @rest) = @_;
   $self->_sc($self->{CS}, @rest);
}
sub scn { sc(@_); }
sub SCN { SC(@_); }
sub RG { rg(@_); }
sub G { g(@_); }
sub K { k(@_); }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • akalyne

    akalyne

    13 Mayıs 2009
  • BachelorsPadTv

    BachelorsPad

    17 Ocak 2012
  • Eric Magidson

    Eric Magidso

    4 Ocak 2009