à la lettre

ラカン派精神分析・精神病理学に関するいろいろ

Scan Tailorの処理自動化バッチファイル

Scan Tailor Universalを使って見開き2ページのPDFを1ページずつに分割されたPDFにする作業を自動化するバッチファイル*1を書きました。

引数に与えられたPDFを画像(JPG)に変換して、Scan Tailorの6工程をデフォルト設定でぶん回して得られた画像(TIF)からPDFを出力します。

引数には、目的のPDFファイルを指定(ドラッグ&ドロップでよい)してください。
複数のPDFファイルをドラッグ&ドロップしても機能します。
自動化、といってもそれなりに時間がかかる(学術書1冊20分くらい)ので小さいファイルから試してみてください。

何やってるかわかる方だけ、自己責任で使ってください。
OCR? 自分でかけてください。

以下の3バージョンを作りました。あとは改変などご自由に。

動作のために必要なものは、以下の3つです。

既知の不具合

  • ファイル名に特殊記号が入っていると動作しません。その場合はエラーメッセージが出ます。

Scan Tailorで左右分割するバージョン

@echo off

rem 必要なもの1 Scan Tailor Universal (cli.exeが使えれば他のバージョンでも可、物によっては「Visual C++ 2013 および Visual C++ 再頒布可能パッケージ パッケージの更新プログラム」のインストールが必要です。)
rem 必要なもの2 Ghostscript(Ghostscript 10.0.0 for Windows (64 bit)で動作確認)
rem 必要なもの3 ImageMagick(ImageMagick-7.1.0-52-Q16-HDRI-x64-dll.exeで動作確認)

rem DPIを設定(標準は300。600にすると重いです)
set  DPI=300

rem 作業フォルダ名を準備(複数ファイルについて並列動作を可能にするため)
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
set date2=%year%%month%%day%
set time2=%time: =0%
set hour=%time2:~0,2%
set minute=%time2:~3,2%
set second=%time2:~6,2%
set time3=%hour%%minute%%second%
set WORKDIR=%TEMP%\stauto%date2%-%time3%\

rem 作業フォルダを作成
If not exist %WORKDIR% mkdir %WORKDIR%
If not exist %WORKDIR%lr\ mkdir %WORKDIR%lr\
If not exist %WORKDIR%out\ mkdir %WORKDIR%out\
del %WORKDIR%*.* /q
del %WORKDIR%lr\*.* /q
del %WORKDIR%out\*.* /q

rem 全角スペース、コンマ、セミコロンを含むファイル名の処理(エスケープ文字に置換)
set ARGS=%*
set ARGS=%ARGS:,=$comma$%
set ARGS=%ARGS:;=$semicolon$%
set ARGS=%ARGS: =$fullwidthsp$%

call :main %ARGS%
exit /b

rem ここからメインの処理
:main

:loop

if "%~1"=="" goto :end

rem 全角スペース、コンマ、セミコロンを含むファイル名の処理(エスケープ文字を元に戻す)
set  ARG1=%~1
set  ARG1=%ARG1:$comma$=,%
set  ARG1=%ARG1:$semicolon$=;%
set  ARG1=%ARG1:$fullwidthsp$= %

rem ファイルの存在を確認
if exist "%ARG1%" (
echo %ARG1% の処理を開始します。このウィンドウは閉じないでください。
) else (
echo %ARG1% が存在しないか、ファイル名に処理できない記号等が含まれており、変換できません。何かキーを押してください。
pause
shift
goto loop
)

rem PDFファイルかどうかを確認
if not %~x1==.pdf (
echo %ARG1% はPDFファイルではありません。何かキーを押してください。
pause
shift
goto loop
)

rem 変換開始
echo %ARG1% をJPGファイルに変換します。

rem Ghostscriptでの処理。インストール先にあわせてパスは書き換えること。
"C:\Program Files\gs\gs10.00.0\bin\gswin64c.exe" -q -dNOPAUSE -dBATCH -sDEVICE=jpeg  -r%DPI%x%DPI% -sOutputFile=%WORKDIR%page-%%04d.jpg "%ARG1%"

if %errorlevel% neq 0 (
  echo エラー;Ghostscriptのインストール先を確認してください。
  exit /b
)

echo %ARG1% をScan Tailorで処理します。

rem Scan Tailor Universalのインストール先にあわせてパスは書き換える
rem 横書き文書の場合は、layout-direction=lrにする

"C:\Program Files\Scan Tailor Universal\scantailor-universal-cli.exe" -v --layout-direction=rl --margins-left=10 --margins-right=10 --margins-top=5 --margins-bottom=5 --layout=0 --deskew=auto --content-detection=normal --white-margins=false --color-mode=color_grayscale --dpi=%DPI% --output-dpi=%DPI% --alignment-vertical=original --alignment-horizontal=original --despeckle=cautious --tiff-compression=none --tiff-force-grayscale --start-filter=1 --end-filter=6 %WORKDIR% %WORKDIR%out\

if %errorlevel% neq 0 (
  echo エラー;Scan Tailorのインストール先を確認してください。
  exit /b
)

echo %ARG1% から得られた処理済みのTIFファイルをPDFに変換します。

rem ImageMagickのインストール先にあわせてパスは書き換える

"C:\Program Files\ImageMagick-7.1.0-Q16-HDRI\magick.exe" -compress jpeg %WORKDIR%out\*.tif "%ARG1%.pdf"

if %errorlevel% neq 0 (
  echo エラー;ImageMagickのインストール先を確認してください。
  exit /b
)

del %WORKDIR%*.* /q
del %WORKDIR%out\*.* /q

shift
goto loop

rem 終了処理
:end

echo 終了処理中です。

If exist %WORKDIR%out\ rmdir %WORKDIR%out\ /q
If exist %WORKDIR%lr\ rmdir %WORKDIR%lr\ /q
If exist %WORKDIR% rmdir %WORKDIR% /q

強制的に真ん中で左右分割してからScan Tailorにかけるバージョン

スキャンの具合によってはScan Tailorの左右分割が微妙なので、ImageMagickで強制的に真ん中で左右分割してから処理するバージョンが↓。

@echo off

rem 必要なもの1 Scan Tailor Universal (cli.exeが使えれば他のバージョンでも可、物によっては「Visual C++ 2013 および Visual C++ 再頒布可能パッケージ パッケージの更新プログラム」のインストールが必要です。)
rem 必要なもの2 Ghostscript(Ghostscript 10.0.0 for Windows (64 bit)で動作確認)
rem 必要なもの3 ImageMagick(ImageMagick-7.1.0-52-Q16-HDRI-x64-dll.exeで動作確認)

rem DPIを設定(標準は300。600にすると重いです)
set  DPI=300

rem 作業フォルダ名を準備(複数ファイルについて並列動作を可能にするため)
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
set date2=%year%%month%%day%
set time2=%time: =0%
set hour=%time2:~0,2%
set minute=%time2:~3,2%
set second=%time2:~6,2%
set time3=%hour%%minute%%second%
set WORKDIR=%TEMP%\stauto%date2%-%time3%\

rem 作業フォルダを作成
If not exist %WORKDIR% mkdir %WORKDIR%
If not exist %WORKDIR%lr\ mkdir %WORKDIR%lr\
If not exist %WORKDIR%out\ mkdir %WORKDIR%out\
del %WORKDIR%*.* /q
del %WORKDIR%lr\*.* /q
del %WORKDIR%out\*.* /q

rem 全角スペース、コンマ、セミコロンを含むファイル名の処理(エスケープ文字に置換)
set ARGS=%*
set ARGS=%ARGS:,=$comma$%
set ARGS=%ARGS:;=$semicolon$%
set ARGS=%ARGS: =$fullwidthsp$%

call :main %ARGS%
exit /b

rem ここからメインの処理
:main

:loop

if "%~1"=="" goto :end

rem 全角スペース、コンマ、セミコロンを含むファイル名の処理(エスケープ文字を元に戻す)
set  ARG1=%~1
set  ARG1=%ARG1:$comma$=,%
set  ARG1=%ARG1:$semicolon$=;%
set  ARG1=%ARG1:$fullwidthsp$= %

rem ファイルの存在を確認
if exist "%ARG1%" (
echo %ARG1% の処理を開始します。このウィンドウは閉じないでください。
) else (
echo %ARG1% が存在しないか、ファイル名に処理できない記号等が含まれており、変換できません。何かキーを押してください。
pause
shift
goto loop
)

rem PDFファイルかどうかを確認
if not %~x1==.pdf (
echo %ARG1% はPDFファイルではありません。何かキーを押してください。
pause
shift
goto loop
)

rem 変換開始
echo %ARG1% をJPGファイルに変換します。

rem Ghostscriptでの処理。インストール先にあわせてパスは書き換えること。
"C:\Program Files\gs\gs10.00.0\bin\gswin64c.exe" -q -dNOPAUSE -dBATCH -sDEVICE=jpeg  -r%DPI%x%DPI% -sOutputFile=%WORKDIR%page-%%04d.jpg "%ARG1%"

if %errorlevel% neq 0 (
  echo エラー;Ghostscriptのインストール先を確認してください。
  exit /b
)

rem 左右分割
echo %ARG1% から得られたJPGファイルを左右分割します。

setlocal ENABLEDELAYEDEXPANSION

set numero=0

for %%f in (%WORKDIR%*.jpg) do (
  rem ImageMagickのインストール先にあわせてパスは書き換えること。
  "C:\Program Files\ImageMagick-7.1.0-Q16-HDRI\magick.exe" %%f -crop 50%%x100%% %WORKDIR%lr\cropped-%%d.jpg

  if !errorlevel! neq 0 (
    echo エラー;ImageMagickのインストール先を確認してください。
    exit /b
  ) 

  set pagen=000!numero!
  set pagen=!pagen:~-4,4!
  
  rem 横書き文書の場合は、下記の-1を-0にする
  
  rename %WORKDIR%lr\cropped-1.jpg !pagen!.jpg 
  set /a numero=numero+1
  set pagen=000!numero!
  set pagen=!pagen:~-4,4!
  
  rem 横書き文書の場合は、下記の-0を-1にする
  
  rename %WORKDIR%lr\cropped-0.jpg !pagen!.jpg 
  set /a numero=numero+1
)

endlocal

rem Scan Tailorで処理
echo 左右分割したJPGファイルをScan Tailorで処理します。

rem Scan Tailor Universalのインストール先にあわせてパスは書き換えること
"C:\Program Files\Scan Tailor Universal\scantailor-universal-cli.exe" -v --margins-left=10 --margins-right=10 --margins-top=5 --margins-bottom=5 --layout=1 --deskew=auto --content-detection=normal --white-margins=false --color-mode=color_grayscale --dpi=%DPI% --output-dpi=%DPI% --alignment-vertical=original --alignment-horizontal=original --despeckle=cautious --tiff-compression=none --tiff-force-grayscale --start-filter=1 --end-filter=6 %WORKDIR%lr\ %WORKDIR%out\

if %errorlevel% neq 0 (
  echo エラー;Scan Tailorのインストール先を確認してください。
  exit /b
)

rem 処理ずみのPDFを作成
echo %ARG1% から得られた処理済みのTIFファイルをPDFに変換します。

rem ImageMagickのインストール先にあわせてパスは書き換える

"C:\Program Files\ImageMagick-7.1.0-Q16-HDRI\magick.exe" -compress jpeg %WORKDIR%out\*.tif "%ARG1%.pdf"

if %errorlevel% neq 0 (
  echo エラー;ImageMagickのインストール先を確認してください。
  exit /b
)

del %WORKDIR%*.* /q
del %WORKDIR%lr\*.* /q
del %WORKDIR%out\*.* /q

shift
goto loop

rem 終了処理
:end

echo 終了処理中です。

If exist %WORKDIR%out\ rmdir %WORKDIR%out\ /q
If exist %WORKDIR%lr\ rmdir %WORKDIR%lr\ /q
If exist %WORKDIR% rmdir %WORKDIR% /q

(参考)Scan Tailorをつかわず、真ん中で左右分割したPDFを作るだけのバージョン

Scan Tailorを使わず、ImageMagickで強制的に左右分割してから結合するバージョンが↓。抜群に速いですが、Scan Tailorをかけてないのでページのふちが残ります。

@echo off

rem 必要なもの1 Scan Tailor Universal (cli.exeが使えれば他のバージョンでも可、物によっては「Visual C++ 2013 および Visual C++ 再頒布可能パッケージ パッケージの更新プログラム」のインストールが必要です。)
rem 必要なもの2 Ghostscript(Ghostscript 10.0.0 for Windows (64 bit)で動作確認)
rem 必要なもの3 ImageMagick(ImageMagick-7.1.0-52-Q16-HDRI-x64-dll.exeで動作確認)

rem DPIを設定(標準は300。600にすると重いです)
set  DPI=300

rem 作業フォルダ名を準備(複数ファイルについて並列動作を可能にするため)
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
set date2=%year%%month%%day%
set time2=%time: =0%
set hour=%time2:~0,2%
set minute=%time2:~3,2%
set second=%time2:~6,2%
set time3=%hour%%minute%%second%
set WORKDIR=%TEMP%\stauto%date2%-%time3%\

rem 作業フォルダを作成
If not exist %WORKDIR% mkdir %WORKDIR%
If not exist %WORKDIR%lr\ mkdir %WORKDIR%lr\
If not exist %WORKDIR%out\ mkdir %WORKDIR%out\
del %WORKDIR%*.* /q
del %WORKDIR%lr\*.* /q
del %WORKDIR%out\*.* /q

rem 全角スペース、コンマ、セミコロンを含むファイル名の処理(エスケープ文字に置換)
set ARGS=%*
set ARGS=%ARGS:,=$comma$%
set ARGS=%ARGS:;=$semicolon$%
set ARGS=%ARGS: =$fullwidthsp$%

call :main %ARGS%
exit /b

rem ここからメインの処理
:main

:loop

if "%~1"=="" goto :end

rem 全角スペース、コンマ、セミコロンを含むファイル名の処理(エスケープ文字を元に戻す)
set  ARG1=%~1
set  ARG1=%ARG1:$comma$=,%
set  ARG1=%ARG1:$semicolon$=;%
set  ARG1=%ARG1:$fullwidthsp$= %

rem ファイルの存在を確認
if exist "%ARG1%" (
echo %ARG1% の処理を開始します。このウィンドウは閉じないでください。
) else (
echo %ARG1% が存在しないか、ファイル名に処理できない記号等が含まれており、変換できません。何かキーを押してください。
pause
shift
goto loop
)

rem PDFファイルかどうかを確認
if not %~x1==.pdf (
echo %ARG1% はPDFファイルではありません。何かキーを押してください。
pause
shift
goto loop
)

rem 変換開始
echo %ARG1% をJPGファイルに変換します。

rem Ghostscriptでの処理。インストール先にあわせてパスは書き換えること。
"C:\Program Files\gs\gs10.00.0\bin\gswin64c.exe" -q -dNOPAUSE -dBATCH -sDEVICE=jpeg  -r%DPI%x%DPI% -sOutputFile=%WORKDIR%page-%%04d.jpg "%ARG1%"

if %errorlevel% neq 0 (
  echo エラー;Ghostscriptのインストール先を確認してください。
  exit /b
)

rem 左右分割
echo %ARG1% から得られたJPGファイルを左右分割します。

setlocal ENABLEDELAYEDEXPANSION

set numero=0

for %%f in (%WORKDIR%*.jpg) do (
  rem ImageMagickのインストール先にあわせてパスは書き換えること。
  "C:\Program Files\ImageMagick-7.1.0-Q16-HDRI\magick.exe" %%f -crop 50%%x100%% %WORKDIR%lr\cropped-%%d.jpg

  if !errorlevel! neq 0 (
    echo エラー;ImageMagickのインストール先を確認してください。
    exit /b
  ) 

  set pagen=000!numero!
  set pagen=!pagen:~-4,4!
  
  rem 横書き文書の場合は、下記の-1を-0にする
  
  rename %WORKDIR%lr\cropped-1.jpg !pagen!.jpg 
  set /a numero=numero+1
  set pagen=000!numero!
  set pagen=!pagen:~-4,4!
  
  rem 横書き文書の場合は、下記の-0を-1にする
  
  rename %WORKDIR%lr\cropped-0.jpg !pagen!.jpg 
  set /a numero=numero+1
)

endlocal

echo 左右分割したJPGファイルをPDFに変換します。

rem ImageMagickのインストール先にあわせてパスは書き換える

"C:\Program Files\ImageMagick-7.1.0-Q16-HDRI\magick.exe" -compress jpeg %WORKDIR%lr\*.jpg "%ARG1%.pdf"

if %errorlevel% neq 0 (
  echo エラー;ImageMagickのインストール先を確認してください。
  exit /b
)

del %WORKDIR%*.* /q
del %WORKDIR%lr\*.* /q

shift
goto loop

rem 終了処理
:end

echo 終了処理中です。

If exist %WORKDIR%out\ rmdir %WORKDIR%out\ /q
If exist %WORKDIR%lr\ rmdir %WORKDIR%lr\ /q
If exist %WORKDIR% rmdir %WORKDIR% /q

*1:なぜ今どきバッチファイルか? それはオールドプログラマーだからです。