Τι συμβαίνει πραγματικά όταν συμπιέζετε ένα PDF
Το PDF123 Compress επανασυμπιέζει ροές και πακετάρει αντικείμενα με το qpdf, αλλά δεν υποδειγματοληπτεί εικόνες, δεν επανακωδικοποιεί bitmap σε JPEG με απώλειες και δεν δημιουργεί υποσύνολα γραμματοσειρών. Η γραμμικοποίηση σχεδόν δεν αλλάζει το μέγεθος του αρχείου.

Δύο PDF μπορούν να δείχνουν ίδια στην οθόνη και να διαφέρουν κατά τρεις τάξεις μεγέθους: 50 KB έναντι 50 MB. Το χάσμα σχεδόν ποτέ δεν βρίσκεται στους τελεστές κειμένου. Σε ένα συμβόλαιο είκοσι σελίδων οι τελεστές πιάνουν συνήθως μερικές δεκάδες kilobyte, ενώ όλα τα υπόλοιπα είναι δείγματα εικόνας, μια ολόκληρη ενσωματωμένη γραμματοσειρά και το πόσο σφιχτά είναι πακεταρισμένες οι ροές και τα αντικείμενα.
Αυτό έχει μια συνέπεια που αξίζει να ειπωθεί από την αρχή: η «συμπίεση ενός PDF» δεν είναι μία ενέργεια αλλά τέσσερις. Μικραίνουν διαφορετικά πράγματα και κοστίζουν διαφορετικά, και όποιος τις αντιμετωπίζει ως μία αποκτά αντιφατική εμπειρία: το αρχείο συμπιέστηκε αλλά δεν μίκρυνε, ή μίκρυνε αλλά οι σελίδες θόλωσαν.
Το μέγεθος προέρχεται από εικόνες, γραμματοσειρές και πακετάρισμα
Οι περισσότερες περιπτώσεις του «γιατί είναι τεράστιο αυτό το PDF;» ξεκινούν από μια σάρωση ή φωτογραφία υψηλής ανάλυσης που παραμένει ενσωματωμένη στο μέγεθος λήψης. Αξίζει να κάνουμε την αριθμητική μία φορά: μια σελίδα μεγέθους Letter 8,5 × 11 ίντσες στα 300 DPI είναι περίπου 2550 × 3300 εικονοστοιχεία, και με τρία byte ανά εικονοστοιχείο αυτό είναι περίπου 25 MB χωρίς συμπίεση. Είκοσι τέτοιες σελίδες φτάνουν συχνά στα 60–80 MB πριν καν αγγίξει κανείς τη συμπίεση.
Η δεύτερη πηγή είναι οι γραμματοσειρές. Ένα PDF μπορεί να ενσωματώσει ολόκληρο το πρόγραμμα μιας γραμματοσειράς, ώστε το κείμενο να αποδίδεται ίδια σε κάθε μηχάνημα, και το κόστος καθορίζεται από το μέγεθος των πινάκων γλύφων, όχι από το πόσο κείμενο διαβάζεται πραγματικά. Γι’ αυτό η δημιουργία υποσυνόλων γραμματοσειράς είναι ξεχωριστός μοχλός μεγέθους.
Η τρίτη είναι το ίδιο το πακετάρισμα. Το ίδιο περιεχόμενο μπορεί να αποθηκευτεί με σπάταλες ρυθμίσεις συμπίεσης, ή τα αντικείμενά του να είναι διάσπαρτα στο αρχείο, καθένα με τη δική του λογιστική επιβάρυνση. Τίποτα από αυτά δεν αλλάζει ούτε ένα εικονοστοιχείο ή γλύφο, και είναι ακριβώς το κομμάτι που μπορεί να αγγίξει η επανασυμπίεση ροών.
Η «συμπίεση» είναι τέσσερις διαφορετικοί μοχλοί
Υπάρχουν τέσσερις μοχλοί στο μέγεθος· δρουν σε διαφορετικά επίπεδα και το κόστος τους ελάχιστα αλληλεπικαλύπτεται. Η επιλογή του λάθος μοχλού είναι ο πιο συχνός λόγος που μια συμπίεση φαίνεται να μην κάνει τίποτα.
| Μοχλός | Τι αγγίζει | Όφελος μεγέθους | Κόστος |
|---|---|---|---|
| Επανασυμπίεση ροών και ροές αντικειμένων | Πώς συμπιέζονται οι ροές περιεχομένου, πώς αποθηκεύονται και πακετάρονται τα αντικείμενα | Εξαρτάται από το πόσο χαλαρό ήταν το αρχικό | Η εμφάνιση των σελίδων δεν αλλάζει |
| Υποδειγματοληψία εικόνων | Ο αριθμός εικονοστοιχείων, δηλαδή η ανάλυση | Μεγάλο | Η ανάλυση μειώνεται οριστικά |
| Απωλεστική επανακωδικοποίηση εικόνων | Η αναπαράσταση byte του bitmap | Μεγάλο | Η ποιότητα της εικόνας μειώνεται |
| Υποσύνολα γραμματοσειρών | Οι ενσωματωμένοι πίνακες γλύφων | Μέτριο | Οι γλύφοι που δεν χρησιμοποιούνται δεν είναι πια επεξεργάσιμοι |
| Γραμμικοποίηση | Η σειρά των αντικειμένων | Σχεδόν μηδενικό | Ανταλλάσσεται με χρόνο φόρτωσης της πρώτης σελίδας |
Οι πρώτες τέσσερις γραμμές λέγονται όλες χονδρικά «συμπίεση», αλλά μόνο η πρώτη αφήνει το περιεχόμενο άθικτο. Είναι και η γραμμή της οποίας η απόδοση κρίνεται πιο εύκολα λάθος: μια σάρωση που χρωστά το μέγεθός της κυρίως σε ακατέργαστα δείγματα εικόνας έχει λίγη επανάληψη για να αφαιρεθεί, και οι μοχλοί που θα τη μίκρυναν ουσιαστικά είναι η υποδειγματοληψία και η απωλεστική επανακωδικοποίηση, με τίμημα την οριστική απώλεια ανάλυσης και ποιότητας.
Ποιον από τους τέσσερις μοχλούς χρησιμοποιεί το PDF123 Compress
Η Συμπίεση PDF (POST /api/v1/misc/compress-pdf) κάνει μόνο την πρώτη γραμμή. Εκτελεί το qpdf με συμπίεση των ασυμπίεστων ροών (--compress-streams=y), δεύτερο πέρασμα στις ροές που είναι ήδη συμπιεσμένες με Flate (--recompress-flate) και πακετάρισμα των αντικειμένων σε ροές αντικειμένων (--object-streams=generate).
Δεν υποδειγματοληπτεί εικόνες, δεν επανακωδικοποιεί τα bitmap σε JPEG χαμηλότερης ποιότητας και δεν δημιουργεί υποσύνολα γραμματοσειρών. Οι σελίδες πρέπει να δείχνουν ίδιες, και η εξοικονόμηση προέρχεται από την επανασυμπίεση Flate και το πακετάρισμα των αντικειμένων.
Η συνθήκη αποτυχίας αξίζει την ίδια σαφήνεια. Όταν το μέγεθος ενός αρχείου προέρχεται κυρίως από δεδομένα εικόνας που έχουν ήδη συμπιεστεί ως JPEG, το Flate δεν έχει τίποτα να στύψει, γιατί αυτά τα byte βρίσκονται έξω από το εύρος των τριών διακοπτών παραπάνω. Γι’ αυτό ένα πακέτο σαρώσεων μπορεί να επιστρέψει μόνο λίγα τοις εκατό μικρότερο, ενώ ένα PDF με πολύ κείμενο και παρόμοιο μέγεθος κερδίζει αισθητά περισσότερο.
Η αντίστροφη διαδρομή είναι η Αποσυμπίεση PDF, που ξεδιπλώνει τις ροές για επιθεώρηση (--qdf, με τις ροές αντικειμένων απενεργοποιημένες) και επίσης δεν αλλάζει την εμφάνιση των σελίδων.
Πότε χρειάζεται άλλη διαδρομή, όχι το Compress
| Τι χρειάζεστε | Ποια διαδρομή να ακολουθήσετε |
|---|---|
| Ίδια εμφάνιση, μόνο αφαίρεση της επιβάρυνσης πακεταρίσματος | Compress |
| Ένα πακέτο σαρώσεων είναι πραγματικά πολύ μεγάλο και η απώλεια ποιότητας είναι αποδεκτή | Υποδειγματοληψία ή απωλεστική επανακωδικοποίηση, όχι αυτό το Compress |
| Πρέπει να μείνει επεξεργάσιμο, αλλά ο επόμενος χαρακτήρας δεν εκτυπώνεται | Διαφορετικές ρυθμίσεις εξαγωγής ή αρχείο προέλευσης, δείτε τα υποσύνολα γραμματοσειράς |
| Ο περιηγητής πρέπει να δει νωρίτερα την πρώτη σελίδα | Η γραμμικοποίηση λύνει την πρώτη απόδοση, όχι το μέγεθος |
| Το αρχείο δεν ανοίγει καθόλου | Repair, είναι δομικό πρόβλημα, όχι πρόβλημα μεγέθους |
Στην τελευταία γραμμή κρύβεται μια παγίδα: το Γραμμικοποίηση PDF δεν είναι ξεχωριστή υλοποίηση εδώ, αλλά ψευδώνυμο του Compress. Και τα δύο δείχνουν στην ίδια λειτουργία, το κανονικό id είναι misc/compress-pdf με το linearize-pdf ως ψευδώνυμο, η πύλη για αυτό το εργαλείο στέλνει πάντα linearize=true και optimizeLevel=1, ο διακομιστής δεν διαβάζει κανένα από τα δύο πεδία, και στο qpdf δεν περνά ποτέ το --linearize. Η λειτουργία που στην πραγματικότητα γραμμικοποιεί ένα αρχείο είναι το Protect, όταν το κρυπτογραφεί.
Έτσι, αν θέλετε την ίδια εμφάνιση σε μικρότερο αρχείο, το Compress είναι ολόκληρη η απάντηση. Αν θέλετε απωλεστική σμίκρυνση εικόνων ή υποσύνολα γραμματοσειρών, αυτή η διαδρομή είναι ο λάθος μοχλός. Το αρχείο επιστρέφεται απευθείας, χωρίς λογαριασμό. Για να δείτε πού πραγματικά ζουν τα αντικείμενα, οι ροές και ο πίνακας ετεροαναφορών, συνεχίστε με το Τι περιέχει ένα PDF.