📑

pdfcpuライブラリを使ったGo言語でのPDF操作

に公開

pdfcpuライブラリとは

https://github.com/pdfcpu/pdfcpu

pdfcpuは、Goで実装されたPDF処理ライブラリです。
PDFファイルの検証、結合、分割など、基本的な処理をサポートしています。

pdfcpu is a PDF processing library written in Go that supports encryption and offers both an API and a command-line interface (CLI).

Goのみで実装されており、依存ライブラリが最小限に抑えられているため、導入がしやすいことも特徴です。
README の記載によると、メンテナンスも継続的に行われているようです。

また、ライブラリとしてだけでなく、CLIツールとしても利用可能です。
https://pkg.go.dev/github.com/pdfcpu/pdfcpu/pkg/cli

実装例

PDFファイルの結合処理

以下は、複数のPDFファイルを1つのファイルに結合する例です。

import (
    "bytes"
    "io"
    "github.com/pdfcpu/pdfcpu/pkg/api"
)

func concatPDF(pdfReaders []io.Reader) (*bytes.Buffer, error) {
    // PDFファイルを読み込んで検証
    var validReaders []io.ReadSeeker
    for _, reader := range pdfReaders {
        // バッファにコピー
        var buf bytes.Buffer
        if _, err := io.Copy(&buf, reader); err != nil {
            continue // 読み込みに失敗したファイルはスキップ
        }

        // PDFファイルの検証
        sectionReader := io.NewSectionReader(bytes.NewReader(buf.Bytes()), 0, int64(buf.Len()))
        if err := api.Validate(sectionReader, nil); err != nil {
            continue // 無効なPDFはスキップ
        }

        // 有効なPDFを追加
        validReaders = append(validReaders, sectionReader)
    }

    // 有効なPDFが1つ以下の場合は結合しない
    if len(validReaders) < 2 {
        return nil, nil
    }

    // PDFファイルの結合
    var result bytes.Buffer
    if err := api.MergeRaw(validReaders, &result, false, nil); err != nil {
        return nil, err
    }

    return &result, nil
}

上記の処理で使用しているpdfcpuライブラリの機能は以下です。

  • api.Validate(): PDFファイルの形式が正しいかを検証
  • api.MergeRaw(): 複数のPDFファイルを 1 つのファイルに結合

このコードでは以下のような処理を行っています。

  1. 入力された各PDFファイルの検証
  2. ファイルの読み込みに失敗した場合、PDFの形式が無効な場合はスキップ
  3. 有効なPDFファイルのみを結合対象として選別
  4. 選別されたPDFファイルの結合

Cloud Runを使用したPDF結合機能

現在業務で行っている開発では、このライブラリを使用して Cloud Run上でPDFの結合を行っています。
具体的には、以下のような内容です。

  1. 処理の開始

    • バックエンドのサーバーアプリケーションが Cloud Pub/Subにメッセージを送信
      (メッセージに結合対象のPDFファイルのURIのリストが含まれている)
    • Cloud Run が Pub/Subトリガーで起動し、処理を開始
  2. Cloud Run上での処理内容

    • Cloud Storageから対象のPDFファイルを取得
    • 各PDFファイルの形式を検証(無効なファイルはスキップ)
    • 有効なPDFファイルのみ結合
    • 結合後のファイルをCloud Storageに保存し、URIをデータベースに記録
  3. Cloud Run上でのエラーハンドリング

    • 無効なPDFファイルはログに記録してスキップ(処理は継続)
    • 処理全体の失敗時にはリトライする(Cloud Pub/Subのリトライポリシーを利用)
    • 重要なエラーはCloud Loggingに送信

まとめ

pdfcpuは、Go言語で完結する軽量なPDF処理ライブラリです。
依存関係が少なく、Goプロジェクトへの導入が容易です。
PDFの結合などシンプルなコードで実現でき、Cloud Runなどの実行環境にも無理なく組み込むことができます。

PDF操作が必要になった際は、ぜひこのライブラリを使用してみてください!

Discussion