とりあえずWindows環境限定です。
ぱっと検索したかぎり「VBAでやる」とか「アプリケーションを使う」とかいろいろあったんですが、クソ面倒なのばっか『複数の』PDFファイルを調べて『TXTで出力』するのはお目にかかれず、結局パッチワークでなんとかしてしまった、という話。備忘録。
準備するもの
- Node
- fs, path, child_process モジュールを使いますので、つまりそういう感じ。
- PDFtk
- https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
- "the PDF Tool Kit"の略。今回の主役
- 今回使ったバージョンは
2.02
- Win8まで動作検証済なのはおいしい
- Free版にCLIモードがついてくる
実際のコード
c:\bin
にファイルを置いて動かしていますので、パス回しとかそんな感じになります。
//list.txt folder/pdf1.pdf folder/pdf2.pdf folder/pdf3.pdf folder/pdf4.pdf :
//NumberOfPages.js const execSync = require('child_process').execSync; const fs = require('fs'); const path = require('path'); const list = fs.readFileSync(path.resolve(__dirname, 'list.txt'), 'utf8').trim().split(/\r?\n/); const allIndex = list.length; let currentIndex = 0; const parentDir = path.resolve('path/to/pdf-dir/'); const pdftk = path.resolve('../Program Files (x86)/PDFtk/bin/pdftk.exe'); const output = path.resolve(__dirname, 'output.txt'); fs.writeFileSync(output, '', 'utf8'); let result = ''; list.forEach(file => { const filePath = path.join(parentDir, file); const execResult = execSync(`"${pdftk}" "${filePath}" dump_data | findstr NumberOfPages`).toString(); const NumberOfPages = execResult.match(/NumberOfPages: (\d{1,})/)[1]; result += `${file}\t${NumberOfPages}\r\n` console.log(`${++currentIndex}/${allIndex}`); }); fs.writeFileSync(output, result, 'utf8');
# cmd C:¥bin> node NumberOfPages.js
// (example)_output.txt folder/pdf1.pdf 9 folder/pdf2.pdf 11 folder/pdf3.pdf 10 folder/pdf4.pdf 22 :
補足
シングルプロセスで同期処理なので遅いっちゃ遅い。 マルチプロセスに非同期で飛ばせば所要時間は減るかもしれんが、そこまでして攻めたい話でもないので富豪プログラミングである。 適当にexec周り差し替えれば他の環境でも動くでしょ(てきとう)。
<!-- 他にも何かあったら書く -->