Question

J'ai un PDF avec un fond noir et texte blanc / jaune.

Comment puis-je supprimer le fond noir avant l'impression et inverser la couleur du texte?

Était-ce utile?

La solution

Il est susceptible d'être à résoudre non trivial en général, mais si vous avez une collection prévisible de fichiers PDF (disons, tous de la même source), alors vous pouvez être en mesure de pirater ensemble une solution rapide comme ceci:

  • CAM :: PDF CPAN
  • run "getpdfpage.pl my.pdf 1> page1.txt" pour obtenir les codes graphiques de la page 1
  • recherche « rg » pour trouver où la couleur du texte RVB est modifié (ou « RG » pour le fond, ou peut-être « g » ou « G » pour niveaux de gris ou « k » ou « K » pour les couleurs CMJN « sc » ou "SC" pour colorimétriques spéciaux)
  • modifier page1.txt pour définir les couleurs que vous aimez
  • run "setpdfpage.pl my.pdf 1 page1.txt out.pdf"

Tout cela peut être fait par programmation au lieu de l'aide d'outils de ligne de commande aussi. getpdfpage.pl et setpdfpage.pl sont interfacées peu simples autour de l'API CAM :: PDF.

Une solution générale serait d'utiliser getPageContentTree () pour analyser la syntaxe de page PDF et recherche de la couleur de changement d'opérateur et de les modifier. Mais si votre PDF utilise un espace de couleur personnalisée ( « sc ») cela peut être difficile. Et la recherche de l'opérateur qui fait la pleine page par remplissage noir pourrait être difficile aussi, en fonction de la géométrie.

Si vous fournissez une URL pour un exemple de fichier PDF, je pourrais fournir des conseils plus spécifiques.

Mise à jour: sur un coup de tête, je l'ai écrit un script de changement de couleur rudimentaire qui peut fonctionner pour certains fichiers PDF. Pour l'utiliser, courir comme cet exemple qui se place tout vert élément rouge:

perl recolor.pl input.pdf '1 0 0 rg' '0 1 0 rg' out.pdf

Cela vous oblige à connaître la syntaxe PDF des directives de couleur que vous essayez de changer, donc il peut encore exiger quelque chose comme les étapes de getpdfpage.pl recommandées ci-dessus.

Et le code source:

#!/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;
            }
         }
      }
   }
}

Autres conseils

J'aime la solution de Chris, car il semble être la meilleure façon d'aller. Je ne l'ai pas personnellement essayé, mais une chose qui m'a fait le travail pour prenais une capture d'écran de la page pdf en question, le coller dans une visionneuse d'images (je Irfanview), et de manipuler les couleurs jusqu'à ce que je le fond blanc avec texte noir. Le pdf original était un fond rouge avec du texte noir.

Utilisé IrfanView pour convertir l'image en 2 couleurs (noir et blanc). Pour vous, vous pourriez avoir à générer un négatif de l'image d'abord, puis convertir en 2 couleurs (ou peut-être juste la conversion d'image négative pourrait être suffisant). Le résultat final me a donné lieu à une pixellisation mineure dans le texte, mais pour mes besoins (une simple liste de l'école des enfants), il a bien fonctionné.

Sur OS X, si vous avez GraphicConverter (essai complet gratuit disponible Aux dernières nouvelles), il y a une excellente façon de le faire, et rogner une bordure noire qui pourrait résulter d'une inversion trop.

Dans le Fichier-> Convertir & Modifier (ou la conversion par lots dans les options que vous obtenez d'abord), vous pouvez frapper la « Modifier batchs » bouton et choisissez inverti, échelle de gris et le contraste, réglez le contraste sur toute la hauteur ( quand il est greyscaled il est tout de même), et choisissez la culture aussi, et choisir la bordure droite (pour ma situation, il était 720x540), que vous pouvez d'abord vérifier en ouvrant le fichier et en sélectionnant la partie que vous voulez - les pixels montrent sélectionnés vers le haut dans une petite boîte d'état.

Je n'ai pas pu convertir pdf en pdf directement - il a seulement changé la première page du pdf, mais la sortie comme PNGs fait bien l'affaire, ce qui m'a permis d'imprimer joli texte noir sur fond blanc images <. / p>

Ensuite, vous avez l'avez tous mis en place pour le prochain pdf avec cette configuration mauvaise.

Dans Adobe Reader essayer Edition> Préférences> Accessibilité> Couleurs de document Options> Remplacer les couleurs du document. Je pense qu'il faut aussi travailler pour l'impression.

J'ai trouvé cette solution sur Adobe Discussions Communauté ( http://forums.adobe.com/message/ 4010837 )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top