Evernoteに格納できるようにPDFを分割する

プレミアムを使用すれば月の使用容量は500MBまでに拡張されるが、それでも
1ノート20MBの制限はある。
そのためEvernoteに格納するには、20MB以下に分割しなければならない。
ScanSnapで雑誌をスキャンしたファイルはまとめてしまったので、
ほとんど20MBを超えている。
時間がかかるのはまだいいが、GUIで1つ1つ分割してもいいのだがメンドウだ。。。
なので、コマンドを使って分割したい。

  • 方針
    • ページ取得→半分のページ数を求める→半分に分割。
    • これでも20MBを超えるならまた半分にする。


pdftkを使用すれば、ページ数の取得も分割もコマンドで実行できるようだ。


pdftkコマンドの入手

pdftkからダウンロード
今回はWindows版をダウンロード

ページ数の取得

pdftk PDFファイル名 dumpdata

NumberOfPagesの項目がページ数

InfoKey: Creator
InfoValue: "PFU ScanSnap Manager 3.2.10"
InfoKey: Producer
InfoValue: Adobe PDF Scan Library 1.1.1
InfoKey: ModDate
InfoValue: D:20061210111221+09'00'
InfoKey: CreationDate
InfoValue: D:20061210111221+09'00'
PdfID0: deef52232142ca40b22924ee53da130
PdfID1: ac4f3de60dbeb469f8bcf6055241a2
NumberOfPages: 164
---->8 省略 8<----

分割

pdftk オリジナルのPDFファイル名 cat ページ範囲 output 分割したPDFファイル名

バッチファイル

div2pdfというバッチファイルを作成した。
これでカレントディレクトリにあるpdfファイルをファイル名_1.pdf、ファイル名_2.pdf
に 2分割できる。

@echo off
for /F  %%i in ('dir /b *.pdf') DO CALL :GET_PAGE_NUM %%~ni
GOTO :END

:GET_PAGE_NUM
REM %1 ファイル名(拡張子なし)
for /F "tokens=2 delims=:" %%i in ('pdftk %1.pdf dumpdata^|findstr NumberOfPages') DO CALL :DIV %1 %%i
GOTO :EOF

:DIV
REM %1 ファイル名(拡張子なし)
REM %2 ページ数

SET /A HALF=%2/2
SET /A LAST_HALF=%HALF%+1

call pdftk %1.pdf cat 1-%HALF% output %1_1.pdf
call pdftk %1.pdf cat %LAST_HALF%-end output %1_2.pdf

GOTO :EOF


:END

実行例

[C:\Documents and Settings\orangeclover\デスクトップ\pdf]dir /b
HogeWorld200506.pdf
HogeWorld200602.pdf
HogeWorld200604.pdf

[C:\Documents and Settings\orangeclover\デスクトップ\pdf]div2pdf
div2pdf HogeWorld200506.pdf total:188 half:94
div2pdf HogeWorld200602.pdf total:186 half:93
div2pdf HogeWorld200604.pdf total:162 half:81

[C:\Documents and Settings\orangeclover\デスクトップ\pdf]dir /b
HogeWorld200506.pdf
HogeWorld200506_1.pdf
HogeWorld200506_2.pdf
HogeWorld200602.pdf
HogeWorld200602_1.pdf
HogeWorld200602_2.pdf
HogeWorld200604.pdf
HogeWorld200604_1.pdf
HogeWorld200604_2.pdf

その他

  • 20MB以下になってじゃないか!

→もう1回実行すればいいじゃないかな。

Evernoteに入れるならファイル名なんて気にしないくていいじゃないかな。

5.関数/サブルーチン (4)コマンド、バッチの復帰値 〜コマンドが正常終了したか確認したい〜 【コマンドプロンプト、バッチファイルを使わなきゃならなくなった人向けのメモ】


コマンド、バッチファイルの復帰値を確認したい


%ERRORLEVEL%を参照する


正常の場合は0
異常の場合は1〜255
ただし、コマンドによっては常に0を返すものもある。

正常の例

D:\MyDoc\work\#blog\test>dir
 ドライブ D のボリューム ラベルは データ です
 ボリューム シリアル番号は 94BB-7973 です

 D:\MyDoc\work\#blog\test のディレクトリ

2009/10/14  07:21    <DIR>          .
2009/10/14  07:21    <DIR>          ..
2009/10/14  07:21                 0 test.txt
               1 個のファイル                   0 バイト
               2 個のディレクトリ  323,922,767,872 バイトの空き領域

D:\MyDoc\work\#blog\test>echo %ERRORLEVEL%
0

異常の例1

D:\MyDoc\work\#blog\test>dir notexistfile
 ドライブ D のボリューム ラベルは データ です
 ボリューム シリアル番号は 94BB-7973 です

 D:\MyDoc\work\#blog\test のディレクトリ

ファイルが見つかりません

D:\MyDoc\work\#blog\test>echo %ERRORLEVEL%
1

異常の例2

D:\MyDoc\work\#blog\test>notexistcommand
'notexistcommand' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

D:\MyDoc\work\#blog\test>echo %ERRORLEVEL%
9009




関連あるかもしれない記事


バッチファイルのパラメータ

%0はバッチファイルのファイル名となる。

C言語と同じ。Javaをやってる人は違和感があるかも。
arg1.bat

@echo off
echo %0
D:\MyDoc\work\#blog\コマンドプロンプト>arg1.bat
arg1.bat

バッチファイルで使用できるパラーメータは%0〜%9まで

arg2.bat

@echo off
echo %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11

%10は使えないので、%1と0の文字列と解釈されてしまう。
(コマンドパラメータが1〜11だと気づかないw)

D:\MyDoc\work\#blog\コマンドプロンプト>arg2.bat a b c d e f g h i j k 
a b c d e f g h i a0 a1

10個以上パラメータを使いたい場合

%*を使用することで全部表示することはできる。
arg3.bat

echo %*
D:\MyDoc\work\#blog\コマンドプロンプト>arg3.bat a b c d e f g h i j k
a b c d e f g h i j k

%*で表示できるけど・・・
いや、そうじゃなくて個別に10個以上パラメータを使いたいたいんだよ

個別に10個以上パラメータを使いたい場合

この場合は、shiftを使ってコマンドパラメータをずらしていく

arg4.bat

:top
if {%1}=={} goto :EOF
echo %1
shift
goto :top
D:\MyDoc\work\#blog\コマンドプロンプト>arg4.bat a b c d e f g h i j k
a
b
c
d
e
f
g
h
i
j
k


5.関数/サブルーチン (1)バッチファイルの呼び出し 〜体育館の裏に呼び出されました。。。〜 【コマンドプロンプト、バッチファイルを使わなきゃならなくなった人向けのメモ】


goto文ばかり使っていると訳分からなくなるので、バッチファイルを分割する。
その場合、バッチからバッチファイルを呼び出すときにはcall文を使用する。


呼び出すバッチファイルと呼び出されるバッチファイルが同じディレクトリにある場合は、ファイル名だけで
呼び出される。
拡張子は、あってもなくてもいいが、何を呼び出してるかを区別するために拡張子は書いた方がいいだろう。
カレントディレクトリにない場合は、環境変数PATHに設定すれば、ファイル名だけで呼び出される。
PATHにも設置されていない場合は、絶対パスで呼び出す。


拡張子を省略できるのは環境変数PATHEXTに設定されているものである。

D:\MyDoc\work\#blog\コマンドプロンプト\call\familyA>set pathext
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH

実行環境

ディレクトリ構成
D:\MyDoc\work\#blog\コマンドプロンプト\call>tree /F
省略
├─familyA
│      child1.bat
│      child2.CMD
│      parent.bat
│
├─familyB
│      cousin.bat
│
└─familyC
        friend.bat
各バッチの内容
call child1.bat
call child1
call child2.cmd
call child2
call cousin.bat
call D:\MyDoc\work\#blog\コマンドプロンプト\call\familyC\friend.bat
  • child1.bat
@echo 私は子供です。長男です。
  • child2.CMD
@echo 私は子供です。次男です。
  • cousin.bat
@echo 私はいとこです。
  • friend.bat
@echo 私は友達です。
環境変数
Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\MyDoc\work\#blog\コマンドプロンプト\call\familyB

実行結果

D:\MyDoc\work\#blog\コマンドプロンプト\call\familyA>parent.bat

D:\MyDoc\work\#blog\コマンドプロンプト\call\familyA>call child1.bat
私は子供です。長男です。

D:\MyDoc\work\#blog\コマンドプロンプト\call\familyA>call child1
私は子供です。長男です。

D:\MyDoc\work\#blog\コマンドプロンプト\call\familyA>call child2.cmd
私は子供です。次男です。

D:\MyDoc\work\#blog\コマンドプロンプト\call\familyA>call child2
私は子供です。次男です。

D:\MyDoc\work\#blog\コマンドプロンプト\call\familyA>call cousin.bat
私はいとこです。

D:\MyDoc\work\#blog\コマンドプロンプト\call\familyA>call D:\MyDoc\work\#blog\コマンドプロンプト\call\familyC\friend.bat
私は友達です。




関連あるかもしれない記事


4.基本文法 (4)forでループ処理 〜回って回って回るぅ〜 【コマンドプロンプト、バッチファイルを使わなきゃならなくなった人向けのメモ】


if文とgoto文を使わず、for文を使うことができる

c:\>for /L %i in (0,1,9) do @echo %i
0
1
2
3
4
5
6
7
8
9


バッチファイルを作成するときは、%iではなく%%iにする必要がある。

for /L %%i in (0,1,9) do @echo %%i




関連あるかもしれない記事

4.基本文法 (3)ループ処理〜もう一度最初から始めるんです。 もう一度。 もう一度。〜 【コマンドプロンプト、バッチファイルを使わなきゃならなくなった人向けのメモ】

指定回数分繰り返す、こういうことが1番コンピュータにやって欲しいことだろう。
サクッとバッチファイルを作成したいものだ。


if文とgoto文を組み合わせて使う。
悪名高きgoto文、指定したラベルに移動するもの。
goto文を乱用するとあっちゃこっちゃに移動してわけわからなくなるので注意。

バッチファイル

@echo off
setlocal
if {%1}=={} goto USAGE
set /A count=0
:TOP
if %count% GEQ %1 goto END
echo %count%


REM 繰り返し実行したい処理

set /A count=%count%+1
goto :TOP

:USAGE
echo 回数を指定してください
endlocal
:END


比較演算子の意味は以下。

  • EQU:等しい
  • NEQ:等しくない
  • LSS:より小さい
  • LEQ:以下
  • GTR:より大きい
  • GEQ:以上

4.基本文法 (2)if文の注意事項 〜\Microsoft の使い方が誤っています。〜 【コマンドプロンプト、バッチファイルを使わなきゃならなくなった人向けのメモ】

通常は以下の書き方が多いと思う。

IF "%ARG1%"=="%ARG2%"

しかしこの場合値に 「"」が含まれるとエラーになってしまう。

例えば、バッチのパラメータに空白を含むディレクトリを
指定するために、「"」「"」(ダブルクォート)でくくった場合など。


なので以下のように書くようにしている。

  IF {%ARG1%}=={%ARG2%} 
NGなパターンのバッチファイル
IF "%1"=="%2" (
  echo equal.
) ELSE (
  echo not equal.
)

%1,%2はコマンドパラーメターを表す特別な変数

NGなパターンの実行結果
c:\>D:\MyDoc\work\#blog\コマンドプロンプト\if-error.bat "C:\Documents and Settings\orangeclover" "C:\Documents and Settings\orangeclover"
and の使い方が誤っています。

c:\>IF ""C:\Documents and Settings\orangeclover""==""C:\Documents and Settings\orangeclover"" (
OKなパターンのバッチファイル
IF {%1}=={%2} (
  echo equal.
) ELSE (
  echo not equal.
)
OKなパターンの実行結果
c:\>D:\MyDoc\work\#blog\コマンドプロンプト\if-{}.bat "C:\Documents and Settings\orangeclover" "C:\Documents and Settings\orangeclover"

c:\>IF {"C:\Documents and Settings\orangeclover"} == {"C:\Documents and Settings\orangeclover"} (echo equal. )  ELSE (echo not equal. )
equal.


「{」「}」の代わりに「'」「'」でくくる手もあるが、'09などのディレクトリもよくある。
「{」「}」もディレクトリ名に使えるのので完全ではないが、「"」「"」と「 '」「'」よりかは
「{」「}」の方が確立が低いと思う。


しかし、これでも罠が残っていた。
Windows Server 2003 x64版でテスト用にPATHを設定しようと以下のようなバッチを
組んでいた。



if {%1} == {%2} (
    setlocal
    set PATH=%NORMAL_TEST_HOME%\bin;%PATH%
    endlocal
) else (
    set PATH=%ERROR_TEST_HOME%\bin;%PATH%
)

これが動かないのである。

Microsoft の使い方が誤っています。

なんじゃそりゃ

C:\>test.bat a b
\Microsoft の使い方が誤っています。

C:\>test.bat a a
\Microsoft の使い方が誤っています。


x64版だと32bitモジュールはC:\Program Files (x86)に含まれるている。
そのため環境変数が以下のようになっている

C:\>set PATH=C:\Program Files (x86)\Microsoft Visual Studio 8\VC\BIN\amd64;C:\Program Files (x86)\Mi
crosoft Visual Studio 8\VC\PlatformSDK\bin\win64\amd64;C:\Program Files (x86)\Microsoft Visual Studi
〜省略〜

そうするとPATHに含まれている「(」「)」を誤認してしまうのだ。。。

回避として、IF文を2つにしたけど。。。


エラーにある通りだ。

「(」「)」を含むディレクトリをデフォルトにして、set PATHができないなんて
ホント 「Microsoft の使い方が誤っています。」だよ。







関連あるかもしれない記事