ドキュメント管理
ドキュメント管理
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(文字グリフのないラスタ背景上に可視のスタイルテキスト)、HTMLModeNative(ページグラフィックを1つのインラインSVGレイヤーとして)、または HTMLModeFlow(見出しと段落が読書順に配置されたリフロー可能な HTML)。Mode を未設定のままにすると、忠実なデフォルトが生成されます:透明な選択可能テキストレイヤーを持つフルページラスタです。
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 ファサードを返し、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 ペイロードを適用し、更新したフィールド数を返します。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オブジェクトを介してコンテンツをアドレス指定可能に保ちます。Page.TagContentを呼び出す前にTaggedContent.SetTitleとSetLanguageを設定してください。PDF/UA の検証は、これらのメソッドが書き込むカタログレベルのメタデータをチェックするためです。- すべての
StructFigureノードでStructElement.SetAltを呼び出してください — 代替テキストがない図は PDF/UA の検証に失敗します。 - エクスポートされたフォーム状態の人間が読みやすい差分比較には
JSONExportOptions.Indentを使用し、コンパクトな機械間ペイロードの場合は省略してください。
よくある問題
| 問題 | 原因 | 修正 |
|---|---|---|
| HTML の出力に選択可能なテキスト字形がありません | HTMLSaveOptions.Mode はテキストレイヤー要件がなく、忠実なデフォルトのまま残ります | 可視でスタイルが適用されたテキストレイヤーに Mode: pdf.HTMLModeText を設定します。 |
| HTML エクスポート時に元のフォント外観が失われます | NoFontEmbedding が true に設定されています | NoFontEmbedding を false(デフォルト)のままにしておくと、埋め込みフォントが WOFF @font-face データ URL として再ラップされます |
Page.TagContent はエラーを返します | Document.TaggedContent() が構造ツリーを初期化する前に呼び出されました | 最初の TagContent 呼び出しの前に、Document.TaggedContent() を呼び出し(タイトル/言語を設定)してください |
ValidatePDFUA は非準拠の図を報告しています | StructFigure 要素に代替テキストがありません | すべての figure ノードで StructElement.SetAlt を呼び出してください |
Form.ImportJSON が期待よりも少ないフィールドしか更新しません | JSON のペイロードフィールド名が対象フォームのフィールド名と一致しません。インポートは緩やかに処理し、一致しないエントリはスキップされます | エクスポートされたフィールド名が対象フォームのフィールド名と正確に一致していることを確認してください |
FAQ
どの HTML エクスポートモードを使用すべきですか?
HTMLModeText は最小で完全に選択可能な出力に使用します;HTMLModeNative はファイルサイズよりベクトルの忠実度(曲線、ネイティブストローク)が重要な場合に使用します;HTMLModeFlow は再フロー可能でモバイルフレンドリーな読書レイアウトに使用します。デフォルトの忠実なラスタ+透過テキストを得るには、Mode を設定しないでください。
特定のページだけをHTMLにエクスポートできますか?
はい。HTMLSaveOptions.Pagesを1ベースのページ番号のスライスに設定します。例: pdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []int{1, 3}}}}。
レイヤーをデフォルトで非表示にし、ビューアが再度表示できるようにするにはどうすればよいですか?
保存する前にLayer.SetVisible(false)を呼び出します。レイヤーはアドレス指定可能な Optional Content Group のままで、Layer.IsVisible()が現在の状態を報告します。
JSON フォームのエクスポートにはフィールドタイプが含まれますか?
はい。エクスポートされる各フィールドは type と value キーを持つ JSON オブジェクトで、例: {"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)のFacade |
TaggedContent | 文書のタイトル/言語を設定し、構造ツリーのルートを公開する |
Page.TagContent / TagArtifact | マークされたコンテンツと構造要素におけるブラケット描画呼び出し |
StructElement | 論理構造ツリーのノード — 子要素、代替テキスト、言語 |
Form.ExportJSON / ImportJSON | AcroForm フィールドデータを JSON としてシリアライズまたは適用する |
JSONExportOptions | JSON エクスポート設定: インデント, omit-empty |