문서 관리
문서 관리
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 (페이지 그래픽을 하나의 인라인 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)은(는) 새로운 Optional Content Group을 생성하고 *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을(를) 선택하며, 시각적 충실도가 가장 중요할 때는 (noModeset) 기본값을 그대로 사용합니다. - 워터마크 또는 주석 레이어를 기본적으로 숨기려면
Layer.SetVisible(false)을(를)Save보다 먼저 호출하고,Layer객체를 통해 콘텐츠를 주소 지정 가능하게 유지합니다. TaggedContent.SetTitle와SetLanguage을(를)Page.TagContent를 호출하기 전에 설정하십시오. 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은(는) 그리기 호출을 감싸고 leaf 구조 요소를 추가합니다. 요소를 그룹화(표, 목록 등)하려면, 먼저 트리 루트 또는 상위 요소에서 StructElement.AddChild을(를) 호출해 중첩을 구축한 다음, 그 아래에 leaf 콘텐츠에 태그를 지정하십시오.
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 내보내기 구성: 들여쓰기, 빈값 생략 |