Τεχνικό Άρθρο

CMYK προεπισκόπηση overprint και συσκευές απόδοσης σε HotPDF

Το HotPDF αποδίδει μια φορτωμένη σελίδα PDF μέσω ενός σημείου εισόδου, της RenderLoadedPageToDevice, και η συσκευή που της δίνετε αποφασίζει αν το αποτέλεσμα είναι bitmap, μια σχεδίαση σε εξωτερικό device context όπως ένας καμβάς εκτυπωτή, ή ένα διανυσματικό enriched metafile. Ορίστε το RenderOverprintPreview σε True και η ίδια κλήση προσομοιώνει CMYK overprint μελανιού διεργασίας, ώστε ένας χειριστής να βλέπει στην οθόνη την αλληλεπίδραση μελανιών που αλλιώς θα εμφανιζόταν μόνο στο φύλλο του τυπογραφείου

Αυτά τα δύο χαρακτηριστικά λύνουν διαφορετικά προβλήματα που τυχαίνει να συναντιούνται στην ίδια διαδρομή κώδικα. Η αφαίρεση συσκευής αφαιρεί τον κλάδο όπου προεπισκόπηση, εκτύπωση και εξαγωγή είχαν η καθεμία τη δική της κλήση απόδοσης με τη δική της παρέκκλιση. Η προεπισκόπηση overprint αφαιρεί την κλάση παραγωγικού σφάλματος όπου ένα έγγραφο φαίνεται σωστό σε κάθε αναγνώστη και βγαίνει λάθος από το τυπογραφείο

Γιατί μια σελίδα εκτυπώνεται διαφορετικά από όσο προεπισκοπείται;

Επειδή το overprint είναι μια οδηγία προς τη συσκευή απεικόνισης, όχι μια λειτουργία βαφής. Όταν μια σελίδα ορίζει /OP ή /op true στην κατάσταση γραφικών, λέει στο RIP να μην αποκλείσει τα μελάνια από κάτω — ένα κυανό αντικείμενο σχεδιασμένο πάνω από κίτρινο αφήνει το κίτρινο στη θέση του, και το φύλλο δείχνει πράσινο. Ένας αναγνώστης που αγνοεί το overprint αποκλείει κανονικά και δείχνει κυανό. Κανένα από τα δύο δεν είναι λάθος με τους δικούς του όρους, και αυτό είναι ακριβώς το πρόβλημα: η οθόνη και το τυπογραφείο διαφωνούν, και κανείς δεν το μαθαίνει μέχρι να επιστρέψουν τα δοκίμια

Η RenderOverprintPreview κάνει το HotPDF να πάρει την οδηγία σοβαρά για βάψιμο DeviceCMYK που διέπεται από /OP, /op και /OPM 1. Το αποτέλεσμα είναι μια προεπισκόπηση δοκιμίου παρά μια προεπισκόπηση αναγνώστη: το μαύρο που overprint πάνω από μια απόχρωση παραμένει ένα πλούσιο overlay αντί να ανοίξει μια τρύπα, και ένα ατύχητο overprint ενός σχεδιαστή σε λευκό κείμενο γίνεται ορατό ως το εξαφανιζόμενο κείμενο που θα είναι

var
  Pdf: THotPDF;
  Device: THPDFBitmapRenderDevice;
  Proof: TBitmap;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.LoadFromFile('cover-cmyk.pdf');
    Pdf.RenderOverprintPreview := True;    // proof, not plain preview
    Device := THPDFBitmapRenderDevice.Create;
    try
      if Pdf.RenderLoadedPageToDevice(0, 150, Device) then
      begin
        Proof := Device.TakeBitmap;        // ownership moves to the caller
        try
          Image1.Picture.Assign(Proof);
        finally
          Proof.Free;
        end;
      end;
    finally
      Device.Free;
    end;
  finally
    Pdf.Free;
  end;
end;

Η ρύθμιση συμμετέχει στην ταυτότητα της κρυφής μνήμης απόδοσης, στη μνήμη και στον δίσκο, οπότε μια κανονική προεπισκόπηση και μια προεπισκόπηση δοκιμίου δεν μοιράζονται ποτέ bitmap. Η εναλλαγή της ιδιότητας δεν απαιτεί να ακυρώσετε τίποτα με το χέρι — μια κρυφή μνήμη που θα επέστρεφε τη λάθος από αυτές τις δύο θα ήταν χειρότερη από καθόλου κρυφή μνήμη

Τρεις συσκευές, μία κλήση απόδοσης

Το THPDFRenderDevice είναι μια αφηρημένη κλάση με δύο μέλη που έχουν σημασία: η Kind, που αναφέρει τον προορισμό ως rdkBitmap, rdkDeviceContext ή rdkEnhancedMetafile, και η Execute, που καλεί η βιβλιοθήκη. Τρεις συγκεκριμένες συσκευές έρχονται με το HotPDF, και η καθεμία κατέχει την έξοδό της διαφορετικά

Η THPDFBitmapRenderDevice κατέχει ένα TBitmap μέχρι η TakeBitmap να μεταφέρει την ιδιοκτησία σε εσάς. Η THPDFDeviceContextRenderDevice δέχεται ένα υπάρχον HDC συν πλάτος και ύψος και σχεδιάζει κατευθείαν μέσα σε αυτό, που είναι πώς αποδίδετε πάνω σε καμβά εκτυπωτή χωρίς ενδιάμεσο bitmap. Η THPDFMetafileRenderDevice κατέχει ένα TMetafile μέχρι η TakeMetafile να το μεταφέρει, που κρατά το διανυσματικό περιεχόμενο ως διανυσματικό για τους καταναλωτές που το χρειάζονται

var
  Device: THPDFDeviceContextRenderDevice;
begin
  Printer.BeginDoc;
  try
    Device := THPDFDeviceContextRenderDevice.Create(
      Printer.Canvas.Handle, Printer.PageWidth, Printer.PageHeight);
    try
      Pdf.RenderLoadedPageToDevice(PageIndex, 300, Device);
    finally
      Device.Free;
    end;
  finally
    Printer.EndDoc;
  end;
end;

Η ανάγνωση της Kind αντί για τον έλεγχο της κλάσης runtime είναι σκόπιμη. Ο κώδικας εφαρμογής που διακλαδώνεται βάσει είδους συσκευής συνεχίζει να λειτουργεί όταν μια συσκευή τυλίγεται, διακοσμείται ή αντικαθίσταται, και κώδικας που ελέγχει is THPDFBitmapRenderDevice όχι

Τι σημαίνει πρακτικά η μεταφορά ιδιοκτησίας

Πριν την TakeBitmap ή την TakeMetafile, η συσκευή κατέχει το αντικείμενο και το απελευθερώνει στον καταστροφέα της. Μετά την κλήση, το κατέχετε εσείς και η συσκευή όχι. Και τα δύο μοτίβα είναι θεμιτά: χρησιμοποιήστε την ιδιότητα Bitmap ή Metafile όταν το αντικείμενο πρέπει απλώς να επιζήσει της κλήσης απόδοσης, και αναλάβετε ιδιοκτησία όταν το αντικείμενο επιζεί της συσκευής

Η λειτουργία αποτυχίας είναι η κοινή του Delphi. Πάρτε το bitmap, απελευθερώστε τη συσκευή, ξεχάστε να απελευθερώσετε το bitmap, και έχετε μια διαρροή που μεγαλώνει με τον αριθμό σελίδων — αόρατη σε μια δοκιμή πέντε σελίδων και προφανής σε μια παρτίδα πεντακοσίων. Τυλίξτε και τα δύο αντικείμενα στα δικά τους try/finally παρά να μοιράζεστε ένα, και το ερώτημα ιδιοκτησίας απαντά τον εαυτό του

Προεπισκόπηση overprint και διαφάνεια στην ίδια σελίδα

Το χτύπημα (knockout) ομάδας διαφάνειας παραμένει ενεργό όταν η προεπισκόπηση overprint είναι ανοιχτή, και τα δύο συνθέτονται στην ίδια διαδρομή bounded paint snapshot. Αυτό έχει σημασία επειδή τα πραγματικά αρχεία έτοιμα για εκτύπωση αναμειγνύουν τα δύο συνεχώς: μια ομάδα διαφάνειας που κρατά artwork κάθεται πάνω σε ένα φόντο του οποίου το μαύρο είναι ρυθμισμένο σε overprint, και η προσομοίωση της μίας χωρίς την άλλη παράγει ένα δοκίμιο που είναι λάθος με νέο τρόπο αντί σωστό

Κρατήστε όμως τα όρια στην οπτική σας. Η προεπισκόπηση overprint προσομοιώνει τη συμπεριφορά μελανιού διεργασίας για βάψιμο DeviceCMYK υπό τους ελέγχους overprint που ονομάστηκαν παραπάνω. Είναι ένα δοκίμιο αλληλεπίδρασης μελανιών, όχι ένα δοκίμιο συμβολαίου με διαχείριση χρώματος: δεν αντικαθιστά μια ροή εργασίας ICC, και δεν σας λέει τι θα παραγάγει ένα συγκεκριμένο τυπογραφείο και χαρτί. Αντιμετωπίστε το όπως ένας χειριστής prepress αντιμετωπίζει μια προεπισκόπηση overprint σε έναν επαγγελματικό αναγνώστη — ως τον έλεγχο που πιάνει τα σφάλματα που κανείς δεν πιάνει κοιτώντας μια κανονική προεπισκόπηση

Ενσωμάτωση προεπισκόπησης σε ένα βήμα preflight

Η χρήσιμη θέση για αυτό είναι δίπλα στους ελέγχους που ήδη τρέχετε. Ένα πέρασμα preflight αναφέρει ότι το μαύρο κείμενο είναι ρυθμισμένο σε overprint· μια απόδοση δοκιμίου δείχνει σε έναν χειριστή τι σημαίνει αυτό στη σελίδα· και τα δύο πάνε στην ίδια αναφορά. Για τα spot χρώματα, που συχνά συνοδεύουν το overprint σε εργασίες συσκευασίας, η ανάλυση της απόδοσης spot χρωμάτων Separation και DeviceN καλύπτει την πλευρά των χρωστικών της ίδιας σελίδας, ενώ οι σημειώσεις για την απόδοση μιας σελίδας PDF σε bitmap και για την εκτύπωση ενός φορτωμένου PDF μέσω TPrinter καλύπτουν τους δύο προορισμούς συσκευής στην απλή, μη δοκιμαστική τους μορφή

Το HotPDF αποδίδει, δοκιμάζει και εκτυπώνει φορτωμένες σελίδες PDF από native VCL κώδικα για Delphi και C++Builder, χωρίς εξωτερικό DLL απόδοσης να deploy δίπλα στην εφαρμογή — η σελίδα του HotPDF συστατικού έχει τη λίστα χαρακτηριστικών απόδοσης και μια δοκιμαστική έκδοση