문서 관리

문서 관리

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을(를) 선택하며, 시각적 충실도가 가장 중요할 때는 (no Mode set) 기본값을 그대로 사용합니다.
  • 워터마크 또는 주석 레이어를 기본적으로 숨기려면 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에 의해 제어됩니다
HTMLSaveOptionsHTML 내보내기 구성: 모드, DPI, 페이지 하위 집합, 리소스 처리
Document.AddLayer / Layers문서에 선택적 콘텐츠 그룹을 만들거나 나열합니다
Page.BeginLayer / EndLayer페이지 콘텐츠를 레이어에 속하도록 표시합니다
Layer옵션 콘텐츠 그룹 — 이름 및 가시성
Document.TaggedContent문서의 논리 구조 트리에 대한 파사드 (Tagged PDF)
TaggedContent문서 제목/언어를 설정하고 구조 트리 루트를 노출합니다
Page.TagContent / TagArtifact마크된 콘텐츠와 구조 요소에서 괄호 그리기 호출
StructElement논리 구조 트리의 노드 — 자식, 대체 텍스트, 언어
Form.ExportJSON / ImportJSONAcroForm 필드 데이터를 JSON 로 직렬화하거나 적용
JSONExportOptionsJSON 내보내기 구성: 들여쓰기, 빈값 생략

참조

 한국어