سؤال

لدي PDF مع خلفية سوداء ونص أبيض / أصفر.

كيف يمكنني إزالة الخلفية السوداء قبل الطباعة وتقلب لون النص؟

هل كانت مفيدة؟

المحلول

من المرجح أن يكون هذا غير تافه لحلها بشكل عام، ولكن إذا كان لديك مجموعات يمكن التنبؤ بها من ملفات PDF (قل، كل ذلك من نفس المصدر)، فقد تتمكن من الاختراق معا حلا سريعا مثل ذلك:

  • ثبيت كام :: PDF. من CPAN.
  • تشغيل "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 هي أغلفة صغيرة بسيطة حول كام :: PDF API.

سيكون الحل العام استخدام GetPagecontenttree () لتحليل بناء جملة صفحة PDF والبحث عن مشغلي تغيير الألوان وتغييرها. ولكن إذا كان PDF الخاص بك يستخدم مساحة ألوان مخصصة ("SC")، فقد يكون هذا صعبا. والبحث عن المشغل الذي يقوم بالملء الأسود بالكامل قد يكون صعبا أيضا، اعتمادا على الهندسة.

إذا قمت بتوفير عنوان URL لعينة PDF، فيمكنني تقديم بعض النصائح الأكثر تحديدا.

تحديث: على نزوة، كتبت نصي مبدل بلون بدائي قد يعمل لبعض ملفات 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;
            }
         }
      }
   }
}

نصائح أخرى

أحب محلول كريس، كما يبدو أنه أفضل طريقة للذهاب. لم أحاول أنني شخصيا، ولكن الشيء الوحيد الذي كان يعمل بالنسبة لي كان يأخذ لقطة شاشة لصفحة PDF المعنية، مما يجعله في عارض الصور (استخدم IrfanView)، ومعالجة الألوان حتى حصلت على الخلفية البيضاء النص الأسود. PDF الأصلي كان خلفية حمراء مع نص أسود.

تستخدم IrfanView لتحويل الصورة إلى 2 ألوان (أبيض وأسود). بالنسبة لك، قد تضطر إلى توليد سلبية من الصورة أولا، ثم تحويلها إلى 2 ألوان (أو ربما فقط تحويل الصور السلبية قد يكون كافيا). النتيجة النهائية بالنسبة لي أسفرت عن بعض البكسلات البسيطة في النص، ولكن لأغراضي (قائمة بسيطة من مدرسة الأطفال)، فقد عملت بشكل جيد.

على نظام التشغيل X، إذا كنت قد حصلت على Graphicconverter (التجريب التجريبي الكامل المجاني متاح آخر راجع)، فهناك طريقة رائعة للقيام بذلك، وقم باقتطاع الحدود السوداء التي قد تنجم عن الانعكاس أيضا.

ضمن الملف-> تحويل وتعديل (أو تحويل الدفعات) في الخيارات التي تحصل عليها أولا)، يمكنك الضغط على زر "تحرير الدفعات"، واختر العكس، Greyscale، والتباين، وضبط التباين طوال الطريق (عندما يحصل Greyscaled كل شيء نفس الشيء)، واختر المحاصيل أيضا واختر الحدود المناسبة (لوضعي كان 720x540)، والذي يمكنك أولا التحقق من خلال فتح الملف واختيار الجزء الذي تريده - البكسل المحدد تظهر في القليل مربع الحالة.

لم أتمكن من التحويل من PDF إلى PDF مباشرة - إلا أنها غيرت الصفحة الأولى فقط من PDF، ولكن إخراجها حيث قامت PNGs بالخدعة بشكل جيد، مما سمح لي بطباعة نص أسود لطيف على صور خلفية بيضاء.

ثم قمت بإعداد كل شيء من أجل PDF التالي مع هذا الإعداد السيئ.

في Adobe Reader حاول تحرير> التفضيلات> إمكانية الوصول> خيارات الألوان المستندات> استبدال ألوان المستندات. أعتقد أنه يجب أن تعمل أيضا للطباعة.

لقد وجدت هذا الحل على مناقشات Adobe المجتمعية (http://forums.adobe.com/message/4010837.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top