👼

神話のプログラム言語 Odin libPDFioでPDFを作成

に公開

久々に、Odinで何かプログラムでも書こうと思い、PDF作成のプログラムを書いてみました。
利用したツールは以下のpdfio-odinです。
このpdfioライブラリは、Odinプログラミング言語の著者であるKarl Zylinski氏がバインドした物なので安心は出来るかと思います。
https://github.com/karl-zylinski/pdfio-odin

環境

まず、動作させている私のPC環境は以下の通りです。

  • OS: Windows11
  • Odin dev-2026-01-nightly
  • Microsoft visual C++ 2022

libPDFioライブラリの設定

Odin実行フォルダが存在する場所から、sharedフォルダまで移動します。
以下のようにgitコマンドを使用して、ライブラリを取ってだけです。

$> cd E:/odin_folder/shared/
$> git clone https://github.com/karl-zylinski/pdfio-odin

OdinでPDFプログラムの作成

以下の様にプロジェクトフォルダ直下に、sample_pdfフォルダを作成し、その中に、以下の様なmain.odinファイルを作成します。

sample_pdf/main.odin
package main

// pdfioを使ったPDF生成サンプル
import "core:fmt"
import "core:os"
import pdfio "shared:pdfio-odin"

main :: proc() {
  // PDFファイルの作成
  pdf := pdfio.FileCreate("japanese_test.pdf", "1.7", nil, nil, nil, nil)
  if (pdf == nil) {
    fmt.println("Failed to create PDF file")
    os.exit(1)
  }
  defer pdfio.FileClose(pdf)

  // フォントの読み込み(日本語フォントを使用)
  font := pdfio.FileCreateFontObjFromFile(pdf, "NotoSansJP-Regular.ttf", true)
  if (font == nil) {
    fmt.println("Failed to create font object")
    os.exit(1)
  }

  // 画像の読み込み
  image := pdfio.FileCreateImageObjFromFile(pdf, "king.png", true)

  // 辞書の作成
  dict := pdfio.DictCreate(pdf)
  rect := pdfio.rect_t{0.0, 0.0, 595.0, 842.0}
  pdfio.DictSetRect(dict, "MediaBox", &rect)  // ページサイズの設定(A4サイズ)
  pdfio.PageDictAddFont(dict, "Font1", font)  // フォントの登録
  pdfio.PageDictAddImage(dict, "Image1", image)  // 画像の登録
  // ページの作成
  page := pdfio.FileCreatePage(pdf, dict)
  defer pdfio.StreamClose(page)

  // コンテンツの書き込み
  pdfio.ContentTextBegin(page)
  // 文字の描画
  pdfio.ContentSetTextFont(page, "Font1", 18.0)
  pdfio.ContentTextMoveTo(page, 50.0, 842.0 - 100.0)
  pdfio.ContentTextShow(page, true, "こんにちは、PDFioの世界へ!")
  // 画像の描画
  width := pdfio.ImageGetWidth(image) / 2.0   // 画像の幅を半分に縮小
  height := pdfio.ImageGetHeight(image) / 2.0 // 画像の高さを半分に縮小
  pdfio.ContentDrawImage(page, "Image1", 50.0, 842.0 - (height + 200), width, height)

  pdfio.ContentTextEnd(page)
}

注意する点は、pdfioライブラリは低水準のライブラリであるため、ディクショナリの紐づけを正確に行う必要があります。また、描画は、ContentTextBeginからContentTextEndの間で、描画を行う必要があります。

後は、事前に、sample_pdfフォルダ内に、GoogleのNotoSansJP-Regular.ttfフォントと画像ファイルを配置し、且つ、shared/pdfio-odin内のpdfio.dll、zlib.dllを予め配置します。(DLLファイルは、PATHが設定されていない場合に参照出来ないからです。)

sample_pdfフォルダの構成
sample_pdf -+- main.odin
            +- NotoSansJP-Regular.ttf
            +- king.png
            +- pdfio1.dll
            +- zlib.dll

実行

$> cd ./pdf_sample/
$> odin run .

実行すると、japanese_test.pdfファイルが新規に作成されます。これを、ダブルクリックして表示すると、下記の様に表示されます。

おわりに

以前、NimでもPDF作成を行いましたが、NimPDFと異なり、辞書(ディクショナリの紐づけ)を怠ると表示さえしませんので注意が必要。

Discussion