cpdf.exeをつかって入れますが、落とし穴がいくつか
ありましたので記事にしてみました。誰も書いていないようなので。
1.2バイト文字で出るエラーを回避する
load-ttf で正しいTTFフォントを指定しているにも関わらず、文字列の先頭が2バイト文字で始まる場合、エラーで入らない場合が有ります。
理由はわかりません。
最初の1文字が1バイト文字の場合は入りますので、文字列の先頭に空白を挟みます。
いろいろいじってたら、たまたま見つけました。
set "TEXT_TO_ADD= !result!"
わかりずらいですが、ADD= と !result!の間の半角スペースがそれです。
あきらかにバグと思われますので、今のバージョンだけかな?と思います。(2025/3/28 windows64bit版)
新しいバージョンは修正されていると良いですねえ・・
2.回転情報が有る場合、勝手に回転して入る、を回避する
その向きで合わせて作っている場合、大きなお世話ですよね。
これは -prerotate で防げます。
-prerotate は、「ページの回転情報を、スタンプやテキスト追加の前にあらかじめ適用する」事でページの回転による位置のズレを防ぐためのオプションです。
-add-text や -combine-pages といった、何かをページに追加するコマンドと一緒に使います。
-prerotate を使った場合の動作
・回転後の、見た目通りのページの向きを基準に「左上」や「中央」を判断する。
・期待通りの位置にテキストを配置する。
という事らしいです。
3.他
read_encoding_table: format 12 not known
というエラーでますけど、無視でいいそうです(Geminiの回答では)
4.参考例
参考は、Windowsでうごくバッチファイルで、
デスクトップにこのファイルをおいて、Drug&DropでPDFファイルを投げ込みます。
するとファイル名の最後の_より前部分の文字が左下に追加されます。
例えば 2学期_試験問題_最終.pdf
をなげこむと
右下に 2学期_試験問題 と入ります。
@echo off
setlocal enabledelayedexpansion
rem --- 設定項目 (ここを編集して使用します) ---
REM cpdf.exe のフルパス (例: "C:\tools\cpdf\cpdf.exe")
REM 定義時にはダブルクォーテーションを付けない。(使用時に囲む)
set CPDF_PATH=C:\pdftool\cpdf.exe
REM 使用するTrueTypeフォントファイル(.ttf)
rem TTCは動かない
REM ◆HGRSMP.TTFは丸ゴシック(windows自前)
REM set FONT_FILE=C:\Windows\Fonts\HGRSMP.TTF
REM ◆NotoSansJP-Regular.ttfはゴシック
REM set FONT_FILE=C:\pdftool\NotoSansJP-Regular.ttf
REM ◆NotoSerifJP-Regular.ttfは明朝
set FONT_FILE=C:\pdftool\NotoSerifJP-Regular.ttf
REM テキストを配置するオフセット値 (左下からのX,Yのマージ-ン)
set OFFSET_XY="22 18"
REM フォントサイズ (ポイント単位)
set FONT_SIZE=9.5
REM 文字色 (例: "black", "red", "0 0 0" (RGB黒), "1 0 0" (RGB赤))
set TEXT_COLOR=black
REM --- 設定項目ここまで ---
REM ファイルがドロップされたかチェック
if "%~1"=="" (
echo PDFファイルをこのバッチファイルにドラッグ&ドロップしてください。
goto :eof_with_pause
)
REM --- 変数の設定 ---
REM 入力・出力PDFファイル名 (入力と出力のファイルを変えたい場合はこの辺を直す)
set "INPUT_PDF=%~1"
set "OUTPUT_PDF=%~1"
REM 拡張子を除いたファイル名を取得
set "BASENAME=%~n1"
REM ファイル名から追加する文字列を生成 (_の前の部分)
set "result="
set "rest=!BASENAME!"
:loop
for /f "tokens=1* delims=_" %%a in ("!rest!") do (
set "first=%%a"
set "rest=%%b"
)
if defined rest (
if defined result (
set "result=!result!_!first!"
) else (
set "result=!first!"
)
goto loop
)
REM ループ完了後、生成された文字列をTEXT_TO_ADDに設定 先頭に半角スペースを意図的に入れてる。
REM cpdfの仕様として、文字の最初が全角だった場合エラーで止まる為。
set "TEXT_TO_ADD= !result!"
REM --- 実行前のチェックと情報表示 ---
echo cpdf.exeのパス: "%CPDF_PATH%"
echo 処理対象PDF: "!INPUT_PDF!"
echo 追加するテキスト: "!TEXT_TO_ADD!"
if "!TEXT_TO_ADD!" == " " (echo. & echo 処理を中止します & echo. & goto :eof_with_pause )
echo.
echo 処理を開始します...
echo.
REM --- cpdfコマンドの実行 ---
REM 安全のため、一度一時ファイルに出力してから元のファイルに上書きします。
REM PDFの情報が回転0では無い場合、-prerotate が無いと勝手に回転して文字が追加されます。
set "TEMP_OUTPUT_PDF=%~dpn1_temp%~x1"
"%CPDF_PATH%" -load-ttf A="%FONT_FILE%" -font A -bottomright %OFFSET_XY% -font-size %FONT_SIZE% -color "%TEXT_COLOR%" -prerotate -add-text "!TEXT_TO_ADD!" "!INPUT_PDF!" -o "!TEMP_OUTPUT_PDF!"
REM エラーチェック
if errorlevel 1 (
echo Error: PDFの処理中にエラーが発生しました。
if exist "!TEMP_OUTPUT_PDF!" del "!TEMP_OUTPUT_PDF!"
goto :eof_with_pause
)
REM 正常終了した場合、一時ファイルを元のファイル名にリネーム(上書き)
if exist "!TEMP_OUTPUT_PDF!" (
move /Y "!TEMP_OUTPUT_PDF!" "!OUTPUT_PDF!" > nul
echo.
echo 処理が完了しました。ファイルが上書きされました。
echo "!OUTPUT_PDF!"
echo.
) else (
echo Error: 出力PDFファイルが作成されませんでした。
)
:eof_with_pause
pause
endlocal