Βασικά Στοιχεία Εγγράφου, Σελίδας και Απόδοσης

Βασικά Στοιχεία Εγγράφου, Σελίδας και Απόδοσης

Βασικά στοιχεία εγγράφου, σελίδας και απόδοσης

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 κατά την πρόσβαση σε σελίδαΟ κώδικας υπέθεσε αρίθμηση που ξεκινά από το 0PageCollection είναι 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Διαχείριση συνημμένων αρχείων

Δείτε επίσης

 Ελληνικά