0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バッチファイルでPDFに日本語を追加(windows11 cpdfを使用)

Posted at

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学期_試験問題 と入ります。

PDFファイル名上書き(Drop).bat
@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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?