Dokumenthantering
Dokumenthantering
Document är ingångspunkten för varje dokumenthanteringsoperation som behandlas här: öppna och spara filer, exportera till HTML, lägga till valfria innehållslager, skapa Tagged PDF och läsa eller skriva AcroForm data. Page och Form nås via Document.Page(n) och Document.Form().
Öppna och spara dokument
pdf.Open läser in en PDF från en filsökväg; pdf.OpenWithPassword gör samma sak för lösenordsskyddade filer. Document.Save skriver resultatet till en ny filsökväg.
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")Exportera till HTML
Document.SaveHTML och Document.WriteHTML konverterar ett dokument till HTML. HTMLSaveOptions.Mode väljer representationen: HTMLModeText (synlig formaterad text över en glyflös rasterbakgrund), HTMLModeNative (sidgrafik som ett inbäddat SVG-lager), eller HTMLModeFlow (omflödesbar HTML med rubriker och stycken i läsordning). Att låta Mode vara odefinierad ger den trogna standarden: en hel sidrastrering med ett transparent markerbart textlager.
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"})Hantera valfria innehållslager
Document.AddLayer(name) skapar en ny Optional Content Group och returnerar en *Layer; Document.Layers() listar varje lager som redan finns. Page.BeginLayer / Page.EndLayer markerar sidinnehåll som tillhör ett lager, och Layer.SetVisible(false) döljer det innehållet.
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")Bygga taggade (tillgängliga) PDF-filer
Document.TaggedContent() returnerar *TaggedContent-fasaden som äger dokumentets logiska strukturträd och sätter katalogmetadata som PDF/UA kräver. Page.TagContent omsluter ett ritningsanrop i markerat innehåll och returnerar en *StructElement för den noden.
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")Grupperande element nestar också under trädroten:
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 })Exportera och importera formulärdata som JSON
Form.ExportJSON serialiserar varje fälttyp och värde till JSON ({"name": {"type": "text", "value": "Jane"}, ...}); Form.ImportJSON applicerar en JSON-payload på ett formulär och returnerar antalet fält som uppdaterades. JSONExportOptions.Indent pretty-printar utskriften.
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)Tips och bästa praxis
- Välj
HTMLModeNativeför vektortunga sidor,HTMLModeFlowför omläsning/mobil läsning, och den trogna standarden (ingenModeangiven) när visuell trohet är viktigast. - Anropa
Layer.SetVisible(false)föreSaveför att dölja vattenstämpel- eller annoteringslager som standard samtidigt som innehållet förblir adresserbart viaLayer-objektet. - Ställ in
TaggedContent.SetTitleochSetLanguageinnan du anroparPage.TagContent, eftersom PDF/UA-valideringen kontrollerar katalognivå-metadata som dessa metoder skriver. - Anropa
StructElement.SetAltpå varjeStructFigure-nod — figurer utan alternativ text misslyckas med PDF/UA-validering. - Använd
JSONExportOptions.Indentför mänskligt läsbar diff av exporterad formulärstatus; utelämna det för kompakt maskin-till-maskin-payload.
Vanliga problem
| Problem | Orsak | Åtgärd |
|---|---|---|
| HTML output har inga valbara textglyphs | HTMLSaveOptions.Mode lämnas på troget standardvärde utan krav på textlager | Ange Mode: pdf.HTMLModeText för ett synligt, stylat textlager |
| HTML export förlorar källfontens utseende | NoFontEmbedding satt till true | Lämna NoFontEmbedding false (standard) så att inbäddade typsnitt omsveps som WOFF @font-face data URLs |
Page.TagContent returnerar ett fel | Anropas innan Document.TaggedContent() initierade strukturträdet | Anropa Document.TaggedContent() (och sätt titel/språk) före det första TagContent-anropet |
ValidatePDFUA rapporterar icke-konforma figurer | Ett StructFigure-element har ingen alt-text | Anropa StructElement.SetAlt på varje figurnod |
Form.ImportJSON uppdaterar färre fält än förväntat | JSON payload-fältnamn matchar inte målformulärets fältnamn; importen är tolerant och hoppar över icke-matchande poster | Bekräfta att exporterade fältnamn matchar målformulärets fältnamn exakt |
FAQ
Vilket HTML-exportläge bör jag använda?
HTMLModeText för den minsta, fullt valbara utmatningen; HTMLModeNative när vektorfidelitet (kurvor, inhemska penseldrag) är viktigare än filstorlek; HTMLModeFlow för en omflödesbar, mobilvänlig läslayout. Lämna Mode oinställt för den trogna raster-plus-transparent-text-standard.
Kan jag exportera endast specifika sidor till HTML?
Ja. Ställ in HTMLSaveOptions.Pages till ett urval av 1-baserade sidnummer, t.ex. pdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []int{1, 3}}}}.
Hur döljer jag ett lager som standard men låter en betraktare slå på det igen?
Anropa Layer.SetVisible(false) innan du sparar. Lagret förblir en adresserbar Optional Content Group; Layer.IsVisible() rapporterar dess aktuella tillstånd.
Inkluderar JSON-formulärexporten fälttyper?
Ja. Varje exporterat fält är ett JSON-objekt med nycklarna type och value, t.ex. {"subscribe": {"type": "checkbox", "value": true}}.
Behöver jag anropa TagContent för varje element, eller kan jag nästla grupper direkt?
Båda. Page.TagContent omsluter ett ritningsanrop och lägger till ett bladstrukturelement. För att gruppera element (tabeller, listor), anropa StructElement.AddChild på trädets rot eller ett föräldraelement för att först bygga nästlingen, och tagga sedan bladinnehållet under.
API Reference Sammanfattning
| Klass/Metod | Beskrivning |
|---|---|
Document.SaveHTML / WriteHTML | Exportera dokumentet till HTML, styrt av HTMLSaveOptions |
HTMLSaveOptions | HTML exportkonfiguration: läge, DPI, sidunderuppsättning, resurs-hantering |
Document.AddLayer / Layers | Skapa eller lista valfria innehållsgrupper i dokumentet |
Page.BeginLayer / EndLayer | Markera sidinnehåll som tillhör ett lager |
Layer | En valfri innehållsgrupp — namn och synlighet |
Document.TaggedContent | Facade för dokumentets logiska strukturträd (Tagged PDF) |
TaggedContent | Ställer in dokumentets titel/språk och exponerar strukturträdets rot |
Page.TagContent / TagArtifact | Klammerritningsanrop i markerat innehåll och strukturelement |
StructElement | En nod i det logiska struktenträdet — barn, alternativ text, språk |
Form.ExportJSON / ImportJSON | Serialisera eller tillämpa AcroForm fältdata som JSON |
JSONExportOptions | JSON exportkonfiguration: indrag, utelämna tomma |