Belge Yönetimi

Belge Yönetimi

Document burada ele alınan her belge yönetimi işlemi için giriş noktasıdır: dosyaları açma ve kaydetme, HTML’a dışa aktarma, isteğe bağlı içerik katmanları ekleme, Etiketli PDF oluşturma ve AcroForm verilerini okuma veya yazma. Page ve Form, Document.Page(n) ve Document.Form() aracılığıyla erişilir.


Belgeleri Açma ve Kaydetme

pdf.Open bir dosya yolundan PDF yükler; pdf.OpenWithPassword şifre korumalı dosyalar için aynı işlemi yapar. Document.Save sonucu yeni bir dosya yoluna yazar.

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’a Dışa Aktarma

Document.SaveHTML ve Document.WriteHTML bir belgeyi HTML’a dönüştürür. HTMLSaveOptions.Mode temsili seçer: HTMLModeText (glif içermeyen bir raster arka plan üzerinde görünen biçimlendirilmiş metin), HTMLModeNative (sayfa grafikleri tek bir satır içi SVG katmanı olarak), veya HTMLModeFlow (başlıklar ve paragraflar okuma sırasına göre düzenlenmiş yeniden akışkan HTML). Mode ayarlanmadan bırakılırsa, tam sayfa raster ve şeffaf seçilebilir metin katmanı içeren sadık varsayılan üretilir.

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"})

İsteğe Bağlı İçerik Katmanlarını Yönetme

Document.AddLayer(name) yeni bir Opsiyonel İçerik Grubu oluşturur ve bir *Layer döndürür; Document.Layers() zaten mevcut olan her katmanı listeler. Page.BeginLayer / Page.EndLayer sayfa içeriğini bir katmana ait olarak işaretler ve Layer.SetVisible(false) o içeriği gizler.

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")

Etiketli (Erişilebilir) PDF’ler Oluşturma

Document.TaggedContent(), belgenin mantıksal yapı ağacına sahip olan *TaggedContent arayüzünü döndürür ve katalog meta verilerini PDF/UA gerektirdiği şekilde ayarlar. Page.TagContent, işaretli içerikte bir çizim çağrısını parantez içine alır ve o düğüm için bir *StructElement döndürür.

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")

Elemanları gruplayarak ağaç kökünün altında da iç içe yerleştirir:

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 })

Form Verilerini JSON olarak Dışa Aktarma ve İçe Aktarma

Form.ExportJSON, her alan türünü ve değerini JSON ({"name": {"type": "text", "value": "Jane"}, ...}) içine serileştirir; Form.ImportJSON, bir forma JSON yükünü uygular ve güncellediği alan sayısını döndürür. JSONExportOptions.Indent, çıktıyı güzel bir şekilde biçimler.

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)

İpuçları ve En İyi Uygulamalar

  • Vektör ağırlıklı sayfalar için HTMLModeNative, yeniden akış/mobil okuma için HTMLModeFlow ve görsel doğruluğun en çok önem taşıdığı durumlarda sadık varsayılanı (hiç Mode ayarlanmamış) seçin.
  • Varsayılan olarak filigran veya açıklama katmanlarını gizlemek için Layer.SetVisible(false) öğesini Save öğesinden önce çağırın ve içeriği Layer nesnesi aracılığıyla adreslenebilir tutun.
  • TaggedContent.SetTitle ve SetLanguage öğelerini Page.TagContent çağırmadan önce ayarlayın; çünkü PDF/UA doğrulaması bu yöntemlerin yazdığı katalog düzeyindeki meta verileri kontrol eder.
  • Her StructFigure düğümünde StructElement.SetAlt öğesini çağırın — alternatif metni olmayan şekiller PDF/UA doğrulamasında başarısız olur.
  • Dışa aktarılan form durumunun insan tarafından okunabilir farkını almak için JSONExportOptions.Indent kullanın; kompakt makine-makine yükleri için ise atlayın.

Yaygın Sorunlar

SorunNedenÇözüm
HTML çıktısında seçilebilir metin glifleri yokHTMLSaveOptions.Mode metin katmanı gereksinimi olmadan sadık varsayılan olarak bırakıldıGörünür, stillendirilmiş bir metin katmanı için Mode: pdf.HTMLModeText ayarlayın.
HTML dışa aktarımı, kaynak font görünümünü yitirirNoFontEmbedding true olarak ayarlandıNoFontEmbedding false (varsayılan) bırakın, böylece gömülü fontlar WOFF @font-face veri URL’leri olarak yeniden paketlenir
Page.TagContent bir hata döndürürDocument.TaggedContent() yapı ağacını başlatmadan önce çağrıldıİlk TagContent çağrısından önce Document.TaggedContent()‘ı (ve başlık/dil ayarlayarak) çağırın
ValidatePDFUA uyumsuz figürleri rapor ederBir StructFigure öğesinin alt metni yokHer figür düğümünde StructElement.SetAlt‘ı çağırın
Form.ImportJSON beklenenden daha az alan güncellerJSON yük verisi alan adları hedef form alan adlarıyla eşleşmiyor; içe aktarım hoşgörülüdür ve eşleşmeyen girişleri atlarDışa aktarılan alan adlarının hedef form alan adlarıyla tam olarak eşleştiğini doğrulayın

FAQ

HTML ihracat modundan hangisini kullanmalıyım?

HTMLModeText en küçük, tamamen seçilebilir çıktı için; HTMLModeNative vektör doğruluğunun (eğriler, yerel darbeler) dosya boyutundan daha önemli olduğu durumlarda; HTMLModeFlow yeniden akışa uygun, mobil dostu bir okuma düzeni için. Mode ayarını bırakın, böylece gerçekçi raster-artı-saydam-metin varsayılanı kullanılır.

Yalnızca belirli sayfaları HTML’a dışa aktarabilir miyim?

Evet. HTMLSaveOptions.Pages‘ı 1 tabanlı sayfa numaralarının bir dilimine ayarlayın, ör. pdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []int{1, 3}}}}.

Bir katmanı varsayılan olarak nasıl gizlerim ancak bir görüntüleyicinin tekrar açmasını sağlarım?

Layer.SetVisible(false)‘ı kaydetmeden önce çağırın. Katman, adreslenebilir bir Optional Content Group olarak kalır; Layer.IsVisible() mevcut durumunu rapor eder.

JSON form dışa aktarımı alan türlerini içeriyor mu?

Evet. Dışa aktarılan her alan, type ve value anahtarlarına sahip bir JSON nesnesidir, ör. {"subscribe": {"type": "checkbox", "value": true}}.

Her öğe için TagContent’ı çağırmam gerekiyor mu, yoksa grupları doğrudan iç içe yerleştirebilir miyim?

Her ikisi de. Page.TagContent, bir çizim çağrısını sarar ve bir yaprak yapı öğesi ekler. Öğeleri gruplamak (tablolar, listeler) için, önce ağaç kökü ya da bir üst öğe üzerinde StructElement.AddChild‘ı çağırarak iç içe yapıyı oluşturun, ardından altındaki yaprak içeriği etiketleyin.


API Reference Özet

Sınıf/YöntemAçıklama
Document.SaveHTML / WriteHTMLBelgeyi HTML’ye dışa aktar, HTMLSaveOptions tarafından kontrol edilir
HTMLSaveOptionsHTML dışa aktarma yapılandırması: mod, DPI, sayfa alt kümesi, kaynak yönetimi
Document.AddLayer / LayersBelge üzerinde İsteğe Bağlı İçerik Grupları oluşturun veya listeleyin
Page.BeginLayer / EndLayerSayfa içeriğini bir katmana ait olarak işaretle
Layerİsteğe Bağlı İçerik Grubu — ad ve görünürlük
Document.TaggedContentBelgenin mantıksal yapı ağacı için bir arayüz (Etiketli PDF)
TaggedContentBelge başlığını/dilini ayarlar ve yapı ağacının kökünü ortaya çıkarır
Page.TagContent / TagArtifactİşaretli içerik ve yapı öğelerinde köşeli parantez çizim çağrıları
StructElementMantıksal yapı ağacındaki bir düğüm — çocuklar, alternatif metin, dil
Form.ExportJSON / ImportJSONAcroForm alan verilerini JSON olarak serileştir veya uygula
JSONExportOptionsJSON dışa aktarma yapılandırması: girinti, omit-empty

Ayrıca Bakınız

 Türkçe