Διαχείριση Εγγράφων
Διαχείριση Εγγράφων
Document είναι το σημείο εισόδου για κάθε λειτουργία διαχείρισης εγγράφων που καλύπτεται εδώ: άνοιγμα και αποθήκευση αρχείων, εξαγωγή σε HTML, προσθήκη προαιρετικών επιπέδων περιεχομένου, δημιουργία Tagged PDF, και ανάγνωση ή εγγραφή δεδομένων AcroForm. Τα Page και Form προσεγγίζονται μέσω Document.Page(n) και Document.Form().
Άνοιγμα και Αποθήκευση Εγγράφων
pdf.Open φορτώνει ένα PDF από διαδρομή αρχείου· pdf.OpenWithPassword κάνει το ίδιο για αρχεία προστατευμένα με κωδικό. Document.Save γράφει το αποτέλεσμα σε νέα διαδρομή αρχείου.
doc, err := pdf.Open("input.pdf")
if err != nil {
panic(err)
}
_, err = pdf.OpenWithPassword("locked.pdf", "userpassword")
if err != nil {
panic(err)
}
err = doc.Save("output.pdf")Εξαγωγή σε HTML
Document.SaveHTML και Document.WriteHTML μετατρέπουν ένα έγγραφο σε HTML. HTMLSaveOptions.Mode επιλέγει την αναπαράσταση: HTMLModeText (ορατό μορφοποιημένο κείμενο πάνω σε raster φόντο χωρίς γλύφους), HTMLModeNative (γραφικά σελίδας ως ένα ενσωματωμένο επίπεδο SVG), ή HTMLModeFlow (επαναδιαρρέον HTML με επικεφαλίδες και παραγράφους στη σειρά ανάγνωσης). Η μη ρύθμιση του Mode παράγει το πιστό προεπιλεγμένο: ένα πλήρες raster σελίδας με διαφανές επιλέξιμο επίπεδο κειμένου.
doc, _ := pdf.Open("input.pdf")
// Faithful mode (default)
doc.SaveHTML("out.html")
// Visible-text mode
doc.SaveHTML("out.html", pdf.HTMLSaveOptions{Mode: pdf.HTMLModeText})
// Multi-file output: external resources plus one HTML file per page
doc.SaveHTML("site/doc.html", pdf.HTMLSaveOptions{
Mode: pdf.HTMLModeNative, ResourceDir: "assets", SplitPages: true,
})
// Page subset, custom raster DPI and title
doc.SaveHTML("part.html", pdf.HTMLSaveOptions{Pages: []int{1, 3}, DPI: 96, Title: "Report"})Διαχείριση Προαιρετικών Επιπέδων Περιεχομένου
Document.AddLayer(name) δημιουργεί μια νέα Προαιρετική Ομάδα Περιεχομένου και επιστρέφει ένα *Layer; Document.Layers() καταγράφει κάθε στρώση που είναι ήδη παρούσα. Page.BeginLayer / Page.EndLayer σημειώνουν το περιεχόμενο της σελίδας ως ανήκον σε μια στρώση, και Layer.SetVisible(false) κρύβει αυτό το περιεχόμενο.
doc := pdf.NewDocumentFromFormat(pdf.PageFormatA4)
layer := doc.AddLayer("Watermark")
page, _ := doc.Page(1)
page.BeginLayer(layer)
page.AddText("DRAFT", pdf.TextStyle{Font: pdf.FontHelveticaBold, Size: 48},
pdf.Rectangle{LLX: 150, LLY: 400, URX: 450, URY: 460})
page.EndLayer()
layer.SetVisible(false)
doc.Save("layered.pdf")Δημιουργία Ετικετοποιημένων (Προσβάσιμων) PDF
Document.TaggedContent() επιστρέφει το *TaggedContent facade που κατέχει το λογικό δέντρο δομής του εγγράφου και ορίζει τα μεταδεδομένα καταλόγου που απαιτεί το PDF/UA. Page.TagContent περικλείει μια κλήση σχεδίασης σε σημειωμένο περιεχόμενο και επιστρέφει ένα *StructElement για αυτόν τον κόμβο.
doc := pdf.NewDocumentFromFormat(pdf.PageFormatA4)
tc := doc.TaggedContent()
tc.SetTitle("Quarterly Report")
tc.SetLanguage("en-US")
page, _ := doc.Page(1)
page.TagContent(tc.Root(), pdf.StructH1, func() error {
return page.AddText("Quarterly Report", pdf.TextStyle{Font: pdf.FontHelveticaBold, Size: 24},
pdf.Rectangle{LLX: 50, LLY: 760, URX: 545, URY: 800})
})
fig, _ := page.TagContent(tc.Root(), pdf.StructFigure, func() error {
return page.AddImage("chart.png", pdf.Rectangle{LLX: 50, LLY: 540, URX: 300, URY: 680})
})
fig.SetAlt("Bar chart of Q3 sales by region") // required for figures
doc.Save("accessible.pdf")Τα στοιχεία ομαδοποίησης επίσης εμφωλεύονται κάτω από τη ρίζα του δέντρου:
doc := pdf.NewDocumentFromFormat(pdf.PageFormatA4)
tc := doc.TaggedContent()
page, _ := doc.Page(1)
tbl := tc.Root().AddChild(pdf.StructTable)
row := tbl.AddChild(pdf.StructTR)
cell := row.AddChild(pdf.StructTD)
page.TagContent(cell, pdf.StructP, func() error { return nil })Εξαγωγή και εισαγωγή δεδομένων φόρμας ως JSON
Form.ExportJSON σειριοποιεί κάθε τύπο πεδίου και τιμή σε JSON ({"name": {"type": "text", "value": "Jane"}, ...}); Form.ImportJSON εφαρμόζει ένα JSON payload σε μια φόρμα και επιστρέφει τον αριθμό των πεδίων που ενημέρωσε. JSONExportOptions.Indent εκτυπώνει όμορφα το αποτέλεσμα.
doc, _ := pdf.Open("filled.pdf")
data, _ := doc.Form().ExportJSON(pdf.JSONExportOptions{Indent: true})
// Fill a template from a JSON payload; discard the applied-field count.
template, _ := pdf.Open("template.pdf")
_, _ = template.Form().ImportJSON(data)Συμβουλές και βέλτιστες πρακτικές
- Επιλέξτε
HTMLModeNativeγια σελίδες με έντονα διανύσματα,HTMLModeFlowγια ανάγνωση επαναρροής/κινητών, και την πιστή προεπιλογή (χωρίςModeορισμένο) όταν η οπτική πιστότητα είναι το πιο σημαντικό. - Καλείστε το
Layer.SetVisible(false)πριν τοSaveγια να κρύψετε το υδατογράφημα ή τις στρώσεις σχολιασμού εξ ορισμού, ενώ διατηρείτε το περιεχόμενο προσβάσιμο μέσω του αντικειμένουLayer. - Ορίστε το
TaggedContent.SetTitleκαι τοSetLanguageπριν καλέσετε τοPage.TagContent, καθώς η επικύρωση PDF/UA ελέγχει τα μεταδεδομένα επιπέδου καταλόγου που γράφουν αυτές οι μέθοδοι. - Καλείστε το
StructElement.SetAltσε κάθε κόμβοStructFigure— τα σχήματα χωρίς εναλλακτικό κείμενο αποτυγχάνουν στην επικύρωση PDF/UA. - Χρησιμοποιήστε το
JSONExportOptions.Indentγια ανθρώπινα αναγνώσιμη σύγκριση (diff) της εξαγόμενης κατάστασης φόρμας· παραλείψτε το για συμπαγή φορτία μηχανής-προς-μηχανή.
Συνηθισμένα προβλήματα
| Πρόβλημα | Αιτία | Διόρθωση |
|---|---|---|
| Η έξοδος HTML δεν έχει επιλέξιμα γλύφα κειμένου | HTMLSaveOptions.Mode αφήνεται στο πιστό προεπιλεγμένο χωρίς απαίτηση στρώσης κειμένου | Ορίστε Mode: pdf.HTMLModeText για ένα ορατό, μορφοποιημένο επίπεδο κειμένου |
| Η εξαγωγή HTML χάνει την εμφάνιση της πηγαίας γραμματοσειράς | NoFontEmbedding ορίζεται σε true | Αφήστε το NoFontEmbedding false (προεπιλογή) ώστε οι ενσωματωμένες γραμματοσειρές να επανασυσκευαστούν ως WOFF @font-face data URLs |
Page.TagContent επιστρέφει σφάλμα | Κλήθηκε πριν το Document.TaggedContent() αρχικοποιήσει το δέντρο δομής | Καλέστε το Document.TaggedContent() (και ορίστε τίτλο/γλώσσα) πριν την πρώτη κλήση του TagContent |
Το ValidatePDFUA αναφέρει μη-συμβατά σχήματα | Ένα στοιχείο StructFigure δεν έχει κείμενο alt | Καλέστε το StructElement.SetAlt σε κάθε κόμβο figure |
Το Form.ImportJSON ενημερώνει λιγότερα πεδία από ό,τι αναμενόταν | Τα ονόματα πεδίων του payload του JSON δεν ταιριάζουν με τα ονόματα πεδίων της φόρμας-στόχου· η εισαγωγή είναι επιεικής και παραλείπει τα μη αντιστοιχισμένα στοιχεία | Επιβεβαιώστε ότι τα εξαγώμενα ονόματα πεδίων ταιριάζουν ακριβώς με τα ονόματα πεδίων της φόρμας προορισμού |
FAQ
Ποια λειτουργία εξαγωγής HTML πρέπει να χρησιμοποιήσω;
HTMLModeText για το μικρότερο, πλήρως επιλέξιμο αποτέλεσμα· HTMLModeNative όταν η πιστότητα του διανύσματος (καμπύλες, εγγενείς γραμμές) είναι πιο σημαντική από το μέγεθος του αρχείου· HTMLModeFlow για μια ρεφλοούμενη, φιλική προς τα κινητά διάταξη ανάγνωσης. Αφήστε το Mode ακαθορισμένο για την πιστή προεπιλογή raster-plus-transparent-text.
Μπορώ να εξάγω μόνο συγκεκριμένες σελίδες στο HTML;
Ναι. Ορίστε το HTMLSaveOptions.Pages σε ένα slice αριθμών σελίδων που ξεκινά από το 1, π.χ. pdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []int{1, 3}}}}.
Πώς μπορώ να κρύψω ένα στρώμα από προεπιλογή, αλλά να επιτρέψω στον θεατή να το ενεργοποιήσει ξανά;
Καλέστε το Layer.SetVisible(false) πριν αποθηκεύσετε. Το στρώμα παραμένει μια προσβάσιμη Optional Content Group· το Layer.IsVisible() αναφέρει την τρέχουσα κατάσταση του.
Η εξαγωγή φόρμας JSON περιλαμβάνει τύπους πεδίων;
Ναι. Κάθε εξαγόμενο πεδίο είναι ένα αντικείμενο JSON με κλειδιά type και value, π.χ. {"subscribe": {"type": "checkbox", "value": true}}.
Πρέπει να καλέσω το TagContent για κάθε στοιχείο, ή μπορώ να ενσωματώσω ομάδες απευθείας;
Και τα δύο. Το Page.TagContent τυλίγει μια κλήση σχεδίασης και προσθέτει ένα στοιχείο δομής φύλλου. Για ομαδοποίηση στοιχείων (πίνακες, λίστες), καλέστε το StructElement.AddChild στη ρίζα του δέντρου ή σε γονικό στοιχείο για να δημιουργήσετε πρώτα τη ιεραρχία, και έπειτα επισημάνετε το περιεχόμενο φύλλου από κάτω.
API Reference Περίληψη
| Κλάση/Μέθοδος | Περιγραφή |
|---|---|
Document.SaveHTML / WriteHTML | Εξαγωγή του εγγράφου σε HTML, ελέγχεται από HTMLSaveOptions |
HTMLSaveOptions | HTML διαμόρφωση εξαγωγής: λειτουργία, DPI, υποσύνολο σελίδων, διαχείριση πόρων |
Document.AddLayer / Layers | Δημιουργία ή καταγραφή Προαιρετικών Ομάδων Περιεχομένου στο έγγραφο |
Page.BeginLayer / EndLayer | Σημειώστε το περιεχόμενο της σελίδας ως ανήκον σε στρώση |
Layer | Μια Προαιρετική Ομάδα Περιεχομένου — όνομα και ορατότητα |
Document.TaggedContent | Διεπαφή για το λογικό δέντρο δομής του εγγράφου (Tagged PDF) |
TaggedContent | Ορίζει τον τίτλο/γλώσσα του εγγράφου και αποκαλύπτει τη ρίζα του δέντρου δομής |
Page.TagContent / TagArtifact | Κλήσεις σχεδίασης αγκυλών σε επισημασμένο περιεχόμενο και στοιχεία δομής |
StructElement | Ένας κόμβος στο λογικό δέντρο δομής — παιδιά, εναλλακτικό κείμενο, γλώσσα |
Form.ExportJSON / ImportJSON | Σειριοποιήστε ή εφαρμόστε τα δεδομένα πεδίου AcroForm ως JSON |
JSONExportOptions | JSON διαμόρφωση εξαγωγής: εσοχή, παράλειψη κενών |