Go言語でのPDFレポート生成

了解しました。では、GO言語でPDFを生成します!

目次

Go プログラムで PDF 文書のプログラムによる生成は、アプリケーションにおいて重要な機能となり得ます。ここでは、Go プログラミング言語(Golang)で PDF ファイルを生成するための 利用可能なライブラリ を探求し、例を交えて簡潔なレビューを行います。

適切なソリューションは、単純なドキュメント作成の場合と、複雑で高機能な PDF 生成の場合では異なる可能性があります。

go, pdf! はい、この画像は AI によって生成されたものです。モデルは Flux1.Dev です。

ライブラリとツール

gofpdf

GoPdf は、PDF の作成のためのストレートフォワードなライブラリです。 テキスト、画像、図形、テーブルの追加、および複数ページの処理が可能になります。 単純から中程度に複雑な PDF 作成タスクに適しています。

メンテナー: Jung Kurt(開発は終了しましたが、まだ使用されています)。

制約: 更新がないため、既存の使用は継続されていますが、メンテナンスは受けられません。

例:

package main

import (
    "github.com/jung-kurt/gofpdf"
)

func main() {
    pdf := gofpdf.New("P", "mm", "A4", "")
    pdf.AddPage()
    pdf.SetFont("Arial", "B", 16)
    pdf.Cell(40, 10, "Hello World!")
    err := pdf.OutputFileAndClose("hello.pdf")
    if err != nil {
        panic(err)
    }
}

gopdf

メンテナー: signintech(積極的に対応されています)。

Go プログラミング言語において、この目的のために際立っているライブラリの 1 つが、SignInTech によって開発された gopdf です。このライブラリは、外部の依存関係や C ライブラリに頼らず、PDF をプログラムで生成するためのストレートフォワードな方法を提供します。

gopdf は、PDF ドキュメントの作成に特化して設計された純 Go ライブラリです。主に PDF 生成に焦点を当てたシンプルで効率的な API を提供しており、基本的なタスクで使いやすく、より複雑な操作に必要な柔軟性を維持しています。

主な機能:

  • 純 Go 実装: 外部の依存関係や C ライブラリは不要です。
  • シンプルな API: PDF を生成するための使いやすい関数。
  • 効率的なパフォーマンス: 素早く効率的な PDF 作成のために最適化されています。

使用例

gopdf がどのように使用できるかを示すために、単純な PDF ドキュメントを作成する基本的な例を見てみましょう:

package main

import (
    "github.com/signintech/gopdf"
)

func main() {
    // 新しい PDF インスタンスを作成
    pdf := gopdf.New()

    // ページサイズと余白を設定
    pdf.SetPageSize(gopdf.PageSizeA4)
    pdf.AddPage()

    // PDF にテキストを追加
    pdf.SetFont("Arial", "", 12)
    pdf.Write(50, 50, "Hello, World!")

    // PDF をファイルに保存
    err := pdf.SaveToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

この例は、新しい PDF ドキュメントを作成し、それに対してテキストを追加し、それをファイルとして保存する方法を示しています。

gopdf の高度な機能:

  • 画像の追加: AddImage メソッドを使用して、PDF ドキュメントに画像を挿入できます。
  • 図形の描画: ライブラリは、線、長方形、その他の図形を描くための関数を提供します。
  • PDF の保護: アクセスを制限するために、PDF にパスワード保護を設定できます。

pdfcpu

  • メンテナー: PDFCPU チーム(https://github.com/pdfcpu/pdfcpu)。
  • 使用事例: 大規模な PDF マニピュレーションと解析。

Go で PDF を操作するための強力なライブラリの 1 つが pdfcpu です。このライブラリは、API とコマンドラインインターフェース(CLI)の両方を通じて、PDF ファイルの作成、変更、および検査を行うための包括的な機能スイートを提供します。以下では、pdfcpu の説明、使用例、および主要な機能について詳しく見ていきます。

pdfcpu は、暗号化をサポートし、PDF ドキュメントのさまざまな側面を処理するための堅牢なツールを提供する Go ベースの PDF 処理ライブラリです。これは、すべての PDF バージョンと互換性があり、PDF 2.0(ISO-32000-2)のための継続的な改善を含んでいます。このライブラリは、包括的な範囲の PDF 処理機能を提供することを目的としており、単純なケースから複雑なケースまで適しています。

主な機能

  • 暗号化サポート: pdfcpu は暗号化をサポートしており、開発者が効果的に PDF ドキュメントを保護できるようにします。
  • API と CLI: プログラマティックなアクセスのための API と、迅速な操作のためのコマンドラインインターフェース(CLI)の両方を提供します。
  • バッチ処理: 豊富なコマンドラインを介したバッチ処理への強力なサポートにより、一度に複数のファイルを扱うのに効率的です。
  • 互換性: すべての PDF バージョンと互換性があり、PDF 2.0 への基本的なサポートと継続的な改善を含みます。

pdfcpu を始めるには、Go のパッケージ管理システムを使用してインストールする必要があります:

go get github.com/pdfcpu/pdfcpu

基本的なコマンドライン操作

pdfcpu は、さまざまな操作のための多様なコマンドを提供します。以下の例をいくつか示します:

画像から PDF を作成

以下のコマンドを使用して、1 つ以上の画像ファイルを PDF ファイルに変換できます:

pdfcpu img2pdf out.pdf image1.jpg image2.png

このコマンドは、各画像が別々のページにレンダリングされる PDF を作成します。

複数の PDF ファイルを 1 つのドキュメントにマージするには、merge コマンドを使用します:

pdfcpu merge output.pdf file1.pdf file2.pdf

pdfcpu の使用例

より複雑な操作を行うには、pdfcpu が提供する API を使用できます。ここでは、Go コードを使用して新しい PDF を作成し、テキストを追加する方法の例を示します:

package main

import (
    "github.com/pdfcpu/pdfcpu"
    "log"
)

func main() {
    // 新しい PDF ドキュメントを作成
    doc := pdfcpu.NewPDF(0, 0)
    defer doc.Close()

    // ドキュメントにページを追加
    page := doc.AddPage()
    page.SetMediaBox(pdfcpu.MediaBox{
        LLX: 0,
        LLY: 0,
        URX: 612,
        URY: 792,
    })

    // ページにテキストを追加
    content := "Hello, World!"
    font := pdfcpu.NewFont("Helvetica", "")
    page.AddText(content, font, 12, 100, 750)

    // ドキュメントを保存
    err := doc.Save("output.pdf")
    if err != nil {
        log.Fatal(err)
    }
}

この例は、pdfcpu の API を使用して新しい PDF を作成し、ページを追加して、その上にテキストを書く方法を示しています。

Maroto

  • メンテナー: go-playground チーム(https://github.com/go-playground/maroto)。
  • 使用事例: デザインファーストのアプローチを好む開発者(Bootstrap に類似)。
  • Bootstrap に着想を得たもので、HTML/CSS に似た宣言的なスタイルで使いやすいように設計されています。
  • gofpdf を基盤としており、強力なカスタマイズオプションを維持しながら、作成プロセスを簡素化します。

Maroto は、PDF を作成するためのもう 1 つの Go ライブラリですが、低レベルの詳細を抽象化することでプロセスを簡素化するのに焦点を当てています。gofpdf ライブラリの上に構築されており、ドキュメント生成のためのよりユーザーフレンドリーな API を提供します。

Maroto の使用例

ここでは、Maroto を使用して単純な PDF を作成する方法の例を示します:

package main

import (
    "github.com/andreyhoffmann1103/maroto"
)

func main() {
    // 指定された寸法で新しい PDF ドキュメントを作成
    m := maroto.NewPDF(595, 842) // ポイント単位の A4 サイズ

    // 最初のページにテキストを追加
    m.AddText("Hello, Maroto!", 0, 0)

    // PDF をファイルに保存
    err := m.OutputFileAndClose("example.pdf")
    if err != nil {
        panic(err)
    }
}

この例は、1 ページを持つ新しい PDF ドキュメントを作成し、Maroto を使用してその上にテキストを追加する方法を示しています。

Unipdf

UniPDF は、Golang(Go)での PDF ファイルの作成と処理のためのもう 1 つの強力かつ包括的なライブラリです。 PDF ドキュメントの生成、変更、およびコンテンツ抽出の必要がある開発者の間で人気のある、幅広い機能を提供しています。

  • メンテナー: UnidocLib(https://unidoc.io)。
  • 使用事例: 高度な PDF 処理(暗号化、マージ、スクリプティング)。
  • PDF の作成と処理のための強力なライブラリ(純 Go)。
  • リンク、ブックマーク、マージ/分割、暗号化などのインタラクティブな要素を含む広範な機能を提供します。
  • PDF オブジェクト(ディクショナリ、ストリーム)を読み書きするための包括的な API。
  • 堅牢な PDF 生成能力を必要とするアプリケーションに適しています。

UniPDF のインストール

UniPDF を始めるには、ライブラリのインストールが必要です。以下の手順に従ってください:

# 新しいディレクトリを作成:
mkdir go-pdf-generator cd go-pdf-generator
# Go モジュールを初期化:
go mod init go-pdf-generator
# UniPDF ライブラリをインストール:
go get github.com/unidoc/unipdf/v3

これにより、プロジェクトがセットアップされ、必要な依存関係がインストールされます。

基本的な使用例

UniPDF を使用して PDF ドキュメントを作成するシンプルな例を以下に示します:

package main

import (
    "github.com/unidoc/unipdf/v3/core"
    "github.com/unidoc/unipdf/v3/model"
    "github.com/unidoc/unipdf/v3/creator"
)

func main() {
    // 新しい PDF ドキュメントを作成
    pdf := creator.New()

    // PDF にページを追加
    page := pdf.NewPage()

    // ページのコンテンツストリームを設定
    contentStream := model.NewContentStream()
    page.SetContents(contentStream)

    // ページにテキストを追加
    text := "Hello, UniPDF!"
    font := creator.NewStandardFont(creator.FontHelvetica)
    textObject := model.NewText(text, font, 12)
    contentStream.Add(textObject)

    // PDF ドキュメントを保存
    err := pdf.WriteToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

この例は、新しい PDF ドキュメントを作成し、ページを追加して、その上にテキストを書く方法を示しています。 結果として生成されるファイル example.pdf には、テキスト “Hello, UniPDF!” が含まれます。

wkhtmltopdf Wrapper

  • https://github.com/SebastiaanKlippert/go-wkhtmltopdf
  • 依存関係: brew または apt-get を通じて wkhtmltopdf のインストールが必要です。
  • 使用事例: 動的な HTML コンテンツからの PDF 生成(例:請求書、レポート)。

機能:

  • HTML テンプレート(Go の html/template でレンダリング)を PDF に変換します。
  • 余白、ページ方向、ヘッダー/フッターのカスタマイズが可能。
  • ドキュメントのデザインが複雑で、HTML/CSS スタイリングを伴う場合に適しています。
  • wkhtmltopdf をバックエンドとして使用し、HTML コンテンツを PDF 形式に変換します。

go-wkhtmltopdf の使用例

import (
    "bytes"
    "github.com/SebastiaanKlippert/go-wkhtmltopdf"
    "html/template"
)

type PDFService struct {}

func NewPDFService() *PDFService {
    return &PDFService{}
}

func (p PDFService) GeneratePDF(data interface{}) ([]byte, error) {
    var templ *template.Template
    var err error

    if templ, err = template.ParseFiles("pdf-template.html"); err != nil {
        return nil, err
    }

    var body bytes.Buffer
    if err := templ.Execute(&body, data); err != nil {
        return nil, err
    }

    pdfg, err := wkhtmltopdf.NewPDFGenerator()
    if err != nil {
        return nil, err
    }

    page := wkhtmltopdf.NewPageReader(bytes.NewReader(body.Bytes()))
    page.EnableLocalFileAccess.Set(true)

    pdfg.AddPage(page)
    pdfg.MarginLeft.Set(0)
    pdfg.MarginRight.Set(0)
    pdfg.Dpi.Set(300)
    pdfg.PageSize.Set(wkhtmltopdf.PageSizeA4)
    pdfg.Orientation.Set(wkhtmltopdf.OrientationLandscape)

    err = pdfg.Create()
    if err != nil {
        return nil, err
    }

    return pdfg.Bytes(), nil
}

pdflib(EndFirstCorp 製):

  • バリデーション、最適化、分割/マージなどのさまざまな PDF 操作のためのコマンドラインツール。
  • PDF ドキュメントに関連するバッチ処理や管理タスクに有用です。

pdflib の概要

pdflib ライブラリは、Go プログラミング言語のための包括的な PDF プロセッサとして設計されています。PDF のバリデーション、最適化、分割、マージ、コンテンツの抽出、トリミングなど、さまざまな機能をサポートします。このライブラリは PDF 32000-1:2008(PDF 1.7)標準に準拠しており、幅広い PDF ドキュメントとの互換性を保証しています。

主な機能

  • バリデーション: PDF ファイルが PDF 1.7 標準に準拠していることを確認します。
  • 最適化: 冗長なリソースを除去してファイルサイズを削減します。
  • 分割とマージ: 複数ページの PDF を 1 ページの PDF に分割したり、複数の PDF を 1 つにマージしたりできます。
  • 抽出: PDF から画像、フォント、コンテンツ、ページを抽出します。
  • トリミング: PDF ドキュメントのトリミングされたバージョンを作成します。

インストール

pdflib を使用するには、Go のパッケージ管理システムを通じてインストールする必要があります。これを行うには、以下のコマンドを実行します:

go get github.com/EndFirstCorp/pdflib

基本的な使用例 - PDF のバリデーション

pdflib ライブラリを使用して基本的な PDF 操作を実行する方法を示すシンプルな例を以下に示します:

PDF を PDF 1.7 標準に対してバリデーションするには、以下のコードを使用できます:

package main

import ( "fmt" "github.com/EndFirstCorp/pdflib/cmd/pdflib" )

func main() {
   // PDF ファイルのバリデーション
   err := pdflib.Validate("example.pdf")
   if err != nil {
     fmt.Println("Validation failed:", err)
   } else {
     fmt.Println("PDF is valid.")
   }
}

結論

Go で PDF を生成する場合、ライブラリの選択はプロジェクトの複雑さと特定の要件に依存します。以下の推奨事項を提供します:

  • 単純なドキュメント: gofpdf または Maroto を使用してください。これらのライブラリは、ストレートフォワードなタスクのためのシンプルさと使いやすさを提供します。
  • HTML/CSS を伴う複雑なデザイン: wkhtmltopdf Wrapper を利用してください。これは wkhtmltopdf を活用して、複雑な HTML コンテンツとスタイリングを処理します。
  • 高度な PDF 処理: アプリケーションが暗号化、インタラクティブな要素、詳細なフォーマット、包括的な操作機能などの高度な機能が必要な場合は、Unipdf または pdfcpu を選択してください。

これらの各ライブラリは、PDF 生成における異なるニーズに役立つ独自の強みをもち、開発者が特定の要件に基づいて選択するための多様なツールを提供します。

ライブラリのリンク

他の便利なリンク

購読する

システム、インフラ、AIエンジニアリングの新記事をお届けします。