Dokumentenverwaltung
Dokumentenverwaltung
Document ist der Einstiegspunkt für jede hier behandelte Dokumentenverwaltungs-Operation: Öffnen und Speichern von Dateien, Exportieren nach HTML, Hinzufügen optionaler Inhaltsebenen, Erstellen von Tagged PDF und Lesen oder Schreiben von AcroForm-Daten. Page und Form werden über Document.Page(n) bzw. Document.Form() erreicht.
Öffnen und Speichern von Dokumenten
pdf.Open lädt ein PDF von einem Dateipfad; pdf.OpenWithPassword tut dasselbe für passwortgeschützte Dateien. Document.Save schreibt das Ergebnis in einen neuen Dateipfad.
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")Exportieren nach HTML
Document.SaveHTML und Document.WriteHTML konvertieren ein Dokument nach HTML. HTMLSaveOptions.Mode wählt die Darstellung aus: HTMLModeText (sichtbarer formatierter Text über einem glyph-losen Raster-Hintergrund), HTMLModeNative (Seitengrafiken als eine inline SVG-Ebene) oder HTMLModeFlow (fließbarer HTML mit Überschriften und Absätzen in Lesereihenfolge). Wenn Mode nicht gesetzt ist, entsteht die getreue Vorgabe: ein ganzseitiges Raster mit einer transparenten, auswählbaren Textebene.
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"})Verwalten optionaler Inhaltsebenen
Document.AddLayer(name) erstellt eine neue Optional Content Group und gibt ein *Layer zurück; Document.Layers() listet alle bereits vorhandenen Ebenen auf. Page.BeginLayer / Page.EndLayer kennzeichnen Seiteninhalt als zu einer Ebene gehörend, und Layer.SetVisible(false) blendet diesen Inhalt aus.
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")Erstellung von getaggten (barrierefreien) PDFs
Document.TaggedContent() gibt die *TaggedContent Fassade zurück, die den logischen Strukturbaum des Dokuments besitzt und setzt die Katalog-Metadaten, die PDF/UA erfordert. Page.TagContent umschließt einen Zeichenaufruf in markiertem Inhalt und gibt ein *StructElement für diesen Knoten zurück.
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")Gruppierende Elemente verschachteln sich ebenfalls unter der Baumwurzel:
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 })Exportieren und Importieren von Formulardaten als JSON
Form.ExportJSON serialisiert jeden Feldtyp und Wert nach JSON ({"name": {"type": "text", "value": "Jane"}, ...}); Form.ImportJSON wendet eine JSON Nutzlast auf ein Formular an und gibt die Anzahl der aktualisierten Felder zurück. JSONExportOptions.Indent formatiert die Ausgabe leserlich.
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)Tipps und bewährte Verfahren
- Wählen Sie
HTMLModeNativefür vektorreiche Seiten,HTMLModeFlowfür Reflow-/Mobile-Lesung und die treue Standardeinstellung (keinModegesetzt), wenn die visuelle Treue am wichtigsten ist. - Rufen Sie
Layer.SetVisible(false)vorSaveauf, um Wasserzeichen- oder Anmerkungsebenen standardmäßig zu verbergen, während der Inhalt über dasLayer-Objekt adressierbar bleibt. - Setzen Sie
TaggedContent.SetTitleundSetLanguage, bevor SiePage.TagContentaufrufen, da die PDF/UA-Validierung die katalogbasierten Metadaten prüft, die diese Methoden schreiben. - Rufen Sie
StructElement.SetAltfür jedenStructFigure-Knoten auf — Abbildungen ohne Alternativtext bestehen die PDF/UA-Validierung nicht. - Verwenden Sie
JSONExportOptions.Indentfür menschenlesbare Unterschiede des exportierten Formularzustands; lassen Sie es bei kompakten Maschinen-zu-Maschinen-Payloads weg.
Häufige Probleme
| Problem | Ursache | Lösung |
|---|---|---|
| HTML Ausgabe hat keine auswählbaren Textglyphen | HTMLSaveOptions.Mode bleibt bei getreuer Standardeinstellung ohne Anforderung einer Textebene | Setze Mode: pdf.HTMLModeText für eine sichtbare, formatierte Textebene |
| Export von HTML verliert das ursprüngliche Schriftbild | NoFontEmbedding auf true gesetzt | Lassen Sie NoFontEmbedding false (Standard), damit eingebettete Schriften als WOFF @font-face-Daten-URLs neu verpackt werden |
Page.TagContent gibt einen Fehler zurück | Aufgerufen, bevor Document.TaggedContent() den Strukturbaum initialisiert hat | Rufen Sie Document.TaggedContent() auf (und setzen Sie Titel/Sprache) vor dem ersten Aufruf von TagContent |
ValidatePDFUA meldet nicht konforme Abbildungen | Ein StructFigure-Element hat keinen Alt-Text | Rufen Sie StructElement.SetAlt für jeden Abbildungsknoten auf |
Form.ImportJSON aktualisiert weniger Felder als erwartet | JSON-Payload-Feldnamen stimmen nicht mit den Feldnamen des Zielformulars überein; der Import ist nachsichtig und überspringt nicht passende Einträge | Bestätigen Sie, dass exportierte Feldnamen exakt mit den Zielformularfeldnamen übereinstimmen |
FAQ
Welchen HTML-Exportmodus sollte ich verwenden?
HTMLModeText für die kleinste, vollständig auswählbare Ausgabe; HTMLModeNative, wenn die Vektortreue (Kurven, native Striche) wichtiger ist als die Dateigröße; HTMLModeFlow für ein nachflussfähiges, mobilfreundliches Leselayout. Lassen Sie Mode unverändert für die originalgetreue Raster-plus-transparenten-Text-Standard.
Kann ich nur bestimmte Seiten nach HTML exportieren?
Ja. Setzen Sie HTMLSaveOptions.Pages auf einen Ausschnitt von 1-basierten Seitenzahlen, z.B. pdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []int{1, 3}}}}.
Wie kann ich eine Ebene standardmäßig ausblenden, aber dem Betrachter erlauben, sie wieder einzuschalten?
Rufen Sie Layer.SetVisible(false) vor dem Speichern auf. Die Ebene bleibt eine adressierbare Optional Content Group; Layer.IsVisible() gibt ihren aktuellen Zustand zurück.
Enthält der JSON-Formularexport Feldtypen?
Ja. Jedes exportierte Feld ist ein JSON-Objekt mit den Schlüsseln type und value, z.B. {"subscribe": {"type": "checkbox", "value": true}}.
Muss ich TagContent für jedes Element aufrufen, oder kann ich Gruppen direkt verschachteln?
Beides. Page.TagContent umschließt einen Zeichenaufruf und fügt ein Blatt-Strukturelement hinzu. Für Gruppierungselemente (Tabellen, Listen) rufen Sie StructElement.AddChild an der Baumwurzel oder einem Elternelement auf, um die Verschachtelung zuerst aufzubauen, und kennzeichnen anschließend den darunter liegenden Blattinhalt.
API Reference Zusammenfassung
| Klasse/Methode | Beschreibung |
|---|---|
Document.SaveHTML / WriteHTML | Exportieren Sie das Dokument nach HTML, gesteuert von HTMLSaveOptions |
HTMLSaveOptions | HTML Exportkonfiguration: Modus, DPI, Seitenauswahl, Ressourcenverwaltung |
Document.AddLayer / Layers | Erstellen oder Auflisten optionaler Inhaltsgruppen im Dokument |
Page.BeginLayer / EndLayer | Markieren Sie Seiteninhalt als zu einer Ebene gehörig |
Layer | Eine optionale Inhaltsgruppe — Name und Sichtbarkeit |
Document.TaggedContent | Fassade für den logischen Strukturbaum des Dokuments (Tagged PDF) |
TaggedContent | Setzt Dokumenttitel/Sprache und stellt die Wurzel des Strukturbaums bereit |
Page.TagContent / TagArtifact | Aufrufe zum Zeichnen von Klammern in markiertem Inhalt und Strukturelementen |
StructElement | Ein Knoten im logischen Strukturbaum — Kinder, Alternativtext, Sprache |
Form.ExportJSON / ImportJSON | Serialisieren oder Anwenden von AcroForm-Felddaten als JSON |
JSONExportOptions | JSON Exportkonfiguration: Einrückung, leere weglassen |