📑
pdfcpuライブラリを使ったGo言語でのPDF操作
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ツールとしても利用可能です。
実装例
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 つのファイルに結合
このコードでは以下のような処理を行っています。
- 入力された各PDFファイルの検証
- ファイルの読み込みに失敗した場合、PDFの形式が無効な場合はスキップ
- 有効なPDFファイルのみを結合対象として選別
- 選別されたPDFファイルの結合
Cloud Runを使用したPDF結合機能
現在業務で行っている開発では、このライブラリを使用して Cloud Run上でPDFの結合を行っています。
具体的には、以下のような内容です。
-
処理の開始
- バックエンドのサーバーアプリケーションが Cloud Pub/Subにメッセージを送信
(メッセージに結合対象のPDFファイルのURIのリストが含まれている) - Cloud Run が Pub/Subトリガーで起動し、処理を開始
- バックエンドのサーバーアプリケーションが Cloud Pub/Subにメッセージを送信
-
Cloud Run上での処理内容
- Cloud Storageから対象のPDFファイルを取得
- 各PDFファイルの形式を検証(無効なファイルはスキップ)
- 有効なPDFファイルのみ結合
- 結合後のファイルをCloud Storageに保存し、URIをデータベースに記録
-
Cloud Run上でのエラーハンドリング
- 無効なPDFファイルはログに記録してスキップ(処理は継続)
- 処理全体の失敗時にはリトライする(Cloud Pub/Subのリトライポリシーを利用)
- 重要なエラーはCloud Loggingに送信
まとめ
pdfcpuは、Go言語で完結する軽量なPDF処理ライブラリです。
依存関係が少なく、Goプロジェクトへの導入が容易です。
PDFの結合などシンプルなコードで実現でき、Cloud Runなどの実行環境にも無理なく組み込むことができます。
PDF操作が必要になった際は、ぜひこのライブラリを使用してみてください!
Discussion