👼
神話のプログラム言語 Odin libPDFioでPDFを作成
久々に、Odinで何かプログラムでも書こうと思い、PDF作成のプログラムを書いてみました。
利用したツールは以下のpdfio-odinです。
このpdfioライブラリは、Odinプログラミング言語の著者であるKarl Zylinski氏がバインドした物なので安心は出来るかと思います。
環境
まず、動作させている私の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