Διαχείριση Εγγράφων

Διαχείριση Εγγράφων

Διαχείριση Εγγράφων

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
HTMLSaveOptionsHTML διαμόρφωση εξαγωγής: λειτουργία, DPI, υποσύνολο σελίδων, διαχείριση πόρων
Document.AddLayer / LayersΔημιουργία ή καταγραφή Προαιρετικών Ομάδων Περιεχομένου στο έγγραφο
Page.BeginLayer / EndLayerΣημειώστε το περιεχόμενο της σελίδας ως ανήκον σε στρώση
LayerΜια Προαιρετική Ομάδα Περιεχομένου — όνομα και ορατότητα
Document.TaggedContentΔιεπαφή για το λογικό δέντρο δομής του εγγράφου (Tagged PDF)
TaggedContentΟρίζει τον τίτλο/γλώσσα του εγγράφου και αποκαλύπτει τη ρίζα του δέντρου δομής
Page.TagContent / TagArtifactΚλήσεις σχεδίασης αγκυλών σε επισημασμένο περιεχόμενο και στοιχεία δομής
StructElementΈνας κόμβος στο λογικό δέντρο δομής — παιδιά, εναλλακτικό κείμενο, γλώσσα
Form.ExportJSON / ImportJSONΣειριοποιήστε ή εφαρμόστε τα δεδομένα πεδίου AcroForm ως JSON
JSONExportOptionsJSON διαμόρφωση εξαγωγής: εσοχή, παράλειψη κενών

Δείτε επίσης

 Ελληνικά