GOでPDFレポートの生成

OK。今からGOでPDFを生成します。

目次

Go言語(Golang)でPDFファイルを生成するためのライブラリについて、ここでは簡単なレビューと例を紹介します。Go言語で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言語では、この目的のために際立つライブラリの一つがgopdfで、SignInTechによって開発されています。このライブラリは、外部依存や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操作に強力なライブラリとして、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を使用できます。以下は、新しいPDFを作成し、テキストを追加するGoコードの例です:

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

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

Maroto

  • メンテナ: go-playgroundチーム(https://github.com/go-playground/maroto)。
  • 使用ケース: デザインファーストアプローチを好む開発者(Bootstrapに似た)。
  • Bootstrapにインスパイアされており、HTML/CSSに類似した宣言型スタイルで使いやすくなっています。
  • gofpdfの上に構築されており、作成プロセスを簡略化しながら強力なカスタマイズオプションを維持しています。

Marotoは、PDFを作成するための別の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ファイルを作成および処理するためのもう一つの強力で包括的なライブラリです。 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
  • 依存関係: wkhtmltopdfbrewまたはapt-getでインストールする必要があります。
  • 使用ケース: 動的なHTMLコンテンツ(請求書、レポートなど)からPDFを生成する場合。

特徴:

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

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操作に使用できるコマンドラインツール。
  • PDFドキュメントに関連するバッチ処理や管理タスクに有用です。

pdflib概要

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

主な特徴

  • 検証: PDFファイルがPDF 1.7標準に準拠していることを確認します。
  • 最適化: 冗長なリソースを削除してファイルサイズを減らします。
  • 分割とマージ: 複数ページのPDFを単一ページの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/EndFirst科/pdflib" )

func main() {
   // PDFファイルを検証
   err := pdflib.Validate("example.pdf")
   if err != nil {
     fmt.Println("検証に失敗しました:", err)
   } else {
     fmt.Println("PDFは有効です。")
   }
}

結論

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

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

これらのライブラリのそれぞれは、PDF生成のさまざまなニーズに応える独自の強みを提供し、開発者が特定の要件に基づいてさまざまなツールを選択できるようにしています。

ライブラリのリンク

その他の役に立つリンク