Βασικά Στοιχεία Εγγράφου, Σελίδας και Απόδοσης
Βασικά στοιχεία εγγράφου, σελίδας και απόδοσης
Aspose::Pdf::Document είναι το σημείο εισόδου για σχεδόν κάθε λειτουργία στο Aspose.PDF FOSS για C++: άνοιγμα και αποθήκευση αρχείων, περιήγηση στη συλλογή σελίδων, ανάγνωση και γραφή μεταδεδομένων, απόδοση σελίδων σε εικόνες raster και εφαρμογή κρυπτογράφησης. Αυτή η σελίδα καλύπτει σε βάθος την κεντρική επιφάνεια Document-στρατευμένη API; πιο εξειδικευμένες περιοχές — γραφικά αρχέτυπα επιπέδου σελίδας, σημειώσεις και διαδραστικές φόρμες, και οι βοηθητικές κλάσεις προσκηνίου — έχουν τις δικές τους σελίδες οδηγού προγραμματιστών.
Φόρτωση, αποθήκευση και βελτιστοποίηση εγγράφου
Δημιουργήστε ένα Document από μια διαδρομή αρχείου για να ανοίξετε ένα υπάρχον PDF, ή χρησιμοποιήστε τον προεπιλεγμένο κατασκευαστή για να ξεκινήσετε ένα νέο, κενό έγγραφο. Save() γράφει τις αλλαγές είτε πίσω στην αρχική διαδρομή είτε σε νέο αρχείο. Optimize() και OptimizeResources() αφαιρούν αχρησιμοποίητους ή διπλότυπους πόρους για να μειώσουν το αρχείο εξόδου.
#include <aspose/pdf/document.hpp>
int main() {
// Open an existing document.
Aspose::Pdf::Document doc("input.pdf");
// ... make edits ...
doc.Optimize();
doc.OptimizeResources();
doc.Save("output.pdf");
// Start a brand-new, empty document.
Aspose::Pdf::Document blank;
blank.Pages().Add();
blank.Save("new.pdf");
}Διαχείριση σελίδων
Document::Pages() επιστρέφει ένα PageCollection. Οι σελίδες είναι αριθμημένες από το 1 — Pages()[1] είναι η πρώτη σελίδα. Add() προσθέτει μια κενή σελίδα και την επιστρέφει, Insert(pageNumber) εισάγει μία σε συγκεκριμένη θέση, και Delete() αφαιρεί σελίδες κατά δείκτη ή μαζικά. Κάθε Page αποκαλύπτει τα MediaBox(), CropBox() και Rotate() για τη γεωμετρία και τον προσανατολισμό του.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/rotation.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& pages = doc.Pages();
std::cout << "Page count: " << pages.Count() << "\n";
auto newPage = pages.Add(); // append
pages.Insert(1); // insert a blank page at position 1
pages.Delete(pages.Count()); // remove the last page
doc.Pages()[1].Rotate(Aspose::Pdf::Rotation::on90);
doc.Save("output.pdf");
}Μεταδεδομένα εγγράφου
Document::Info() επιστρέφει ένα αντικείμενο DocumentInfo με πρόσβαση ανάγνωσης/εγγραφής στα τυπικά στοιχεία του λεξικού /Info: Title, Author, Creator, Subject, Keywords, Producer και Trapped. Document::Metadata() επιστρέφει το λεξικό XMP Metadata για προσαρμοσμένα, ονομαστικά κλειδιά/τιμές.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& info = doc.Info();
std::cout << "Title: " << info.Title() << "\n";
std::cout << "Author: " << info.Author() << "\n";
info.Title("Quarterly Report");
info.Author("Finance Team");
doc.Save("output.pdf");
}Απόδοση σε raster εικόνες
Οι συσκευές απόδοσης σελίδων μετατρέπουν ένα μοναδικό Page σε raster εικόνα. Τα BmpDevice, PngDevice, JpegDevice και TiffDevice εκθέτουν όλα το Process(page, output) και κατασκευάζονται με ένα Resolution που ελέγχει το DPI εξόδου. Το TiffDevice δέχεται επιπλέον TiffSettings (συμπίεση, βάθος χρώματος) και μπορεί να αποδώσει ένα εύρος σελίδων σε μία κλήση μέσω Process(document, fromPage, toPage, output).
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <sstream>
int main() {
Aspose::Pdf::Document doc("report.pdf");
auto page = doc.Pages()[1];
Aspose::Pdf::Devices::BmpDevice device(Aspose::Pdf::Devices::Resolution(150));
std::stringstream sink(std::ios::binary | std::ios::out | std::ios::in);
device.Process(page, sink);
std::cout << "Rendered " << sink.str().size() << " bytes\n";
}RenderingOptions, που γίνονται αποδεκτά από πολλές συσκευές, ελέγχει τη διαχείριση γραμματοσειρών και την παρεμβολή εικόνας κατά τη rasterization — για παράδειγμα SystemFontsNativeRendering() και InterpolationHighQuality().
Κρυπτογράφηση και Δικαιώματα Πρόσβασης
Document::Encrypt(userPassword, ownerPassword, permissions, cryptoAlgorithm) προστατεύει ένα έγγραφο. Ο κωδικός χρήστη απαιτείται για το άνοιγμα του αρχείου· ο κωδικός ιδιοκτήτη απαιτείται για την αλλαγή δικαιωμάτων ή την αφαίρεση προστασίας. Το CryptoAlgorithm επιλέγει το κρυπτογραφικό αλγόριθμο (RC4x40, RC4x128, AESx128, AESx256); οι σημαίες Permissions όπως PrintDocument, ModifyContent και ExtractContent ελέγχουν τι μπορεί να κάνει ένας προβολέας χωρίς τον κωδικό ιδιοκτήτη. Το IsEncrypted() ελέγχει την τρέχουσα κατάσταση, και το Decrypt() αφαιρεί την προστασία από ένα ήδη ανοιχτό έγγραφο.
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
doc.Encrypt("user-password", "owner-password",
Aspose::Pdf::Permissions::PrintDocument,
Aspose::Pdf::CryptoAlgorithm::AESx256);
doc.Save("encrypted.pdf");
Aspose::Pdf::Document secured("encrypted.pdf");
std::cout << std::boolalpha << secured.IsEncrypted() << "\n";
}Εξαγωγή Κειμένου και Διάταξη
Aspose::Pdf::Text::TextAbsorber διασχίζει ένα έγγραφο ή μια σελίδα και συγκεντρώνει απλό κείμενο, το οποίο ανακτάται με Text(). Το TextFragmentAbsorber επιστρέφει αντί αυτού τοποθετημένα αντικείμενα TextFragment, το καθένα εκθέτοντας Rectangle() και TextState(). Για την προσθήκη κειμένου, το TextBuilder::AppendParagraph() γράφει ένα TextParagraph σε μια σελίδα, και τα αντικείμενα παραγράφου ομαδοποιούνται στη συλλογή Paragraphs() της σελίδας.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("report.pdf");
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
Aspose::Pdf::Text::TextFragmentAbsorber fragmentAbsorber;
fragmentAbsorber.Visit(doc.Pages()[1]);
std::cout << "Fragments on page 1: "
<< fragmentAbsorber.TextFragments().Count() << "\n";
}Πίνακες
Row και Rows δημιουργούν διατάξεις πινάκων που τοποθετούνται σε μια σελίδα μέσω της συλλογής Paragraphs(). Κάθε Row κατέχει μια συλλογή Cells; Cell υποστηρίζει κείμενο, μια εικόνα φόντου (BackgroundImage() / BackgroundImageFile()), και περιθώρια ανά κελί μέσω του BorderInfo. BorderInfo συνδυάζει ένα GraphInfo ανά πλευρά, και το BorderSide επιλέγει ποιες πλευρές εφαρμόζει ένα στυλ περιθωρίου.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/border_info.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
Aspose::Pdf::Table table;
table.Left(72.0f);
table.Top(700.0f);
table.ColumnWidths("120 120");
table.DefaultCellBorder(
Aspose::Pdf::BorderInfo(Aspose::Pdf::BorderSide::All, 1.0f));
auto& rows = table.Rows();
auto& row = rows.Add();
row.Cells().Add("Item");
row.Cells().Add("Qty");
doc.Pages()[1].Paragraphs().Add(table);
doc.Save("output.pdf");
}Σελιδοδείκτες και Πλοήγηση
Document::Outlines() επιστρέφει τη συλλογή Outlines του ανώτερου επιπέδου (δένδρο σελιδοδεικτών). Κάθε καταχώρηση είναι ένα OutlineItemCollection, το οποίο με τη σειρά του περιέχει υποκαταχωρήσεις και εκθέτει τα Title(), Bold(), Italic() και Destination() (ένα IAppointment, όπως ένας στόχος προσαρμογής σελίδας). Το NamedDestinationCollection παρέχει επαναχρησιμοποιήσιμους, ονομαστικούς στόχους σελίδας.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/outline_item_collection.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto item = std::make_shared<Aspose::Pdf::OutlineItemCollection>(doc.Outlines());
item->Title("Chapter 1");
item->Bold(true);
doc.Outlines().Add(item);
doc.Save("output.pdf");
}Εικόνες και Πόροι
Κάθε Page εκθέτει ένα αντικείμενο Resources(), και το Resources::Images() επιστρέφει το XImageCollection της σελίδας. Το XImage εκθέτει τα Width(), Height() και GetRawImageData() για μια ενσωματωμένη raster εικόνα. Το XImageCollection::Add() ενσωματώνει μια νέα εικόνα και επιστρέφει το όνομα του πόρου.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& images = doc.Pages()[1].Resources().Images();
std::cout << "Images on page 1: " << images.Count() << "\n";
for (const auto& name : images.Names()) {
std::cout << " - " << name << "\n";
}
}Fonts
Aspose::Pdf::Text::Font περιγράφει μια γραμματοσειρά που χρησιμοποιείται σε κειμενικό περιεχόμενο: FontName(), BaseFont(), IsEmbedded() και IsSubset(). Το FontRepository::FindFont(fontName) επιλύει μια γραμματοσειρά με βάση το όνομα, και το FontRepository::OpenFont(fontFilePath) τη φορτώνει απευθείας από ένα αρχείο.
#include <aspose/pdf/font_repository.hpp>
#include <iostream>
int main() {
auto font = Aspose::Pdf::Text::FontRepository::FindFont("Helvetica");
std::cout << "Font: " << font.FontName()
<< " embedded=" << std::boolalpha << font.IsEmbedded() << "\n";
}Ενσωματωμένα Αρχεία
Document::EmbeddedFiles() επιστρέφει ένα EmbeddedFileCollection των FileSpecification συνημμένων. Add() ενσωματώνει ένα νέο αρχείο, FindByName() αναζητά ένα, και Delete() αφαιρεί συνημμένα ατομικά ή όλα μαζί. Κάθε FileSpecification φέρει ένα Name(), Description(), και ένα AFRelationship που ταξινομεί τον σκοπό του συνημμένου.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Attachments: " << doc.EmbeddedFiles().Count() << "\n";
doc.EmbeddedFiles().Delete(); // remove all attachments
doc.Save("output.pdf");
}Συμβουλές και Καλές Πρακτικές
- Θυμηθείτε ότι το
PageCollectionείναι 1-βασισμένο: τοdoc.Pages()[1]είναι η πρώτη σελίδα, όχι τοdoc.Pages()[0]. - Καλέστε το
Optimize()πριν τοSave()σε έγγραφα που έχουν υποστεί πολλαπλούς γύρους εισαγωγής ή διαγραφής σελίδων — καθαρίζει πόρους που δεν αναφέρονται πια. - Επαναχρησιμοποιήστε ένα μόνο στιγμιότυπο συσκευής απόδοσης (
BmpDevice,PngDevice, κ.λπ.) σε πολλαπλές σελίδες αντί να δημιουργείτε νέο ανά σελίδα· μόνο τοResolutionχρειάζεται να ρυθμιστεί εκ των προτέρων. - Πάντα παρέχετε τόσο έναν κωδικό χρήστη όσο και έναν κωδικό ιδιοκτήτη στο
Encrypt()— ένας κενός κωδικός χρήστη επιτρέπει ανοιχτή πρόσβαση ανεξαρτήτως του επιλεγμένου αλγορίθμου. - Διαβάστε τα πεδία
DocumentInfoπριν τα αντικαταστήσετε εάν σκοπεύετε να ενημερώσετε μόνο μία ιδιότητα (π.χ.,Title) — οι μέθοδοι ορισμού αντικαθιστούν την τιμή του πεδίου άμεσα.
Κοινά προβλήματα
| Πρόβλημα | Αιτία | Διόρθωση |
|---|---|---|
Αποτυχία τύπου IndexOutOfRange κατά την πρόσβαση σε σελίδα | Ο κώδικας υπέθεσε αρίθμηση που ξεκινά από το 0 | PageCollection είναι 1-βάση· χρησιμοποιήστε Pages()[1] για την πρώτη σελίδα |
| Η αποδοθείσα raster εικόνα είναι απροσδόκητα μικρή ή κενή | Resolution πολύ χαμηλό, ή η λανθασμένη σελίδα περάστηκε στο Process() | Αυξήστε την τιμή DPI του Resolution και επιβεβαιώστε το ευρετήριο σελίδας |
Το Save() μετά το Encrypt() εξακολουθεί να ανοίγει χωρίς κωδικό σε ορισμένους προβολείς | Ορισμένοι προβολείς αποθηκεύουν στην κρυφή μνήμη ένα μη κρυπτογραφημένο αντίγραφο από προηγούμενο άνοιγμα | Αποθηκεύστε σε νέα διαδρομή αρχείου και ανοίξτε το ξανά για να επιβεβαιώσετε την κρυπτογράφηση |
Τα πεδία DocumentInfo εμφανίζονται κενά μετά το άνοιγμα ενός παραγόμενου PDF | Το εργαλείο παραγωγής δεν έγραψε ποτέ καταχωρήσεις /Info | Ελέγξτε τα Producer() και Creator() για κενές συμβολοσειρές πριν υποθέσετε σφάλμα |
Ο πίνακας που προστέθηκε μέσω Paragraphs().Add(table) εξαφανίζεται μετά το Save() | Το αντικείμενο Table βγήκε εκτός εμβέλειας πριν εκτελεστεί το Save() | Διατηρήστε το Table ζωντανό μέχρι να επιστρέψει το Save() |
FAQ
Η αρίθμηση των σελίδων είναι μηδενική ή μονάδα-βάση;
Από το ένα. doc.Pages()[1] είναι η πρώτη σελίδα στο έγγραφο.
Ποιες ιδιότητες εγγράφου εκθέτει το DocumentInfo;
Title, Author, Creator, Subject, Keywords, Producer, και Trapped, καθώς και γενική πρόσβαση κλειδί/τιμή μέσω Add() και Remove().
Μπορώ να αποδώσω μια σειρά σελίδων σε ένα μόνο TIFF;
Ναι. Το TiffDevice::Process(document, fromPage, toPage, output) αποδίδει ένα εύρος σελίδων σε μία ροή εξόδου πολλαπλών-σελίδων TIFF.
Πώς μπορώ να αφαιρέσω την προστασία με κωδικό πρόσβασης από ένα έγγραφο;
Ανοίξτε το με Document, στη συνέχεια καλέστε Decrypt() και Save() σε μια νέα διαδρομή.
Μπορώ να προσθέσω ένα προσαρμοσμένο πεδίο μεταδεδομένων XMP;
Ναι, μέσω του Document::Metadata(), το οποίο υποστηρίζει Add(key, value) για ζευγάρια κλειδιού/τιμής με χώρο ονομάτων πέρα από το τυπικό λεξικό /Info.
API Reference Σύνοψη
| Κλάση/Μέθοδος | Περιγραφή |
|---|---|
Document | Κύριο αντικείμενο — άνοιγμα, δημιουργία, αποθήκευση, βελτιστοποίηση |
Document.Pages() | Επιστρέφει το PageCollection |
Document.Info() | Επιστρέφει DocumentInfo (τυπικά μεταδεδομένα) |
Document.Metadata() | Επιστρέφει το λεξικό XMP Metadata |
Document.Outlines() | Επιστρέφει το δέντρο σελιδοδεικτών (Outlines) |
Document.EmbeddedFiles() | Επιστρέφει τη συλλογή συνημμένων αρχείων |
Document.Encrypt() / Decrypt() | Εφαρμόστε ή αφαιρέστε την προστασία κωδικού πρόσβασης |
PageCollection | Κοντέινερ σελίδας με δεικτοδότηση από 1 — Add, Insert, Delete |
DocumentInfo | Τυπικά πεδία λεξικού /Info |
Metadata | Λεξικό μεταδεδομένων XMP |
CryptoAlgorithm | Επιλογή κρυπτογράφησης RC4/AES για Encrypt() |
Permissions | Σημαίες ελέγχου πρόσβασης για Encrypt() |
BmpDevice / PngDevice / JpegDevice / TiffDevice | Απόδοση σελίδας σε μορφή raster |
Resolution | Ρύθμιση DPI για συσκευές απόδοσης |
RenderingOptions | Έλεγχοι γραμματοσειράς και παρεμβολής για την απόδοση |
TextAbsorber | Εξάγει απλό κείμενο |
TextFragmentAbsorber / TextFragment | Εξάγει τοποθετημένα τμήματα κειμένου |
TextBuilder / TextParagraph | Γράφει το περιεχόμενο κειμένου σε μια σελίδα |
Outlines / OutlineItemCollection | Δέντρο σελιδοδεικτών και μεμονωμένες καταχωρίσεις |
NamedDestinationCollection | Επαναχρησιμοποιήσιμοι ονομασμένοι στόχοι σελίδας |
Row / Rows / Cell / Cells | Στοιχεία κατασκευής διάταξης πίνακα |
BorderInfo / GraphInfo | Στυλ περιγράμματος και γραμμής για κελιά πίνακα |
Resources / XImage / XImageCollection | Πρόσβαση σε πόρο σελίδας και ενσωματωμένης εικόνας |
Font / FontRepository | Μεταδεδομένα γραμματοσειράς και αναζήτηση |
EmbeddedFileCollection / FileSpecification | Διαχείριση συνημμένων αρχείων |