ささきしき

チラシ

【化石】複数PDFのページ数だけを調べてtxt出力

とりあえずWindows環境限定です。

ぱっと検索したかぎり「VBAでやる」とか「アプリケーションを使う」とかいろいろあったんですが、クソ面倒なのばっか『複数の』PDFファイルを調べて『TXTで出力』するのはお目にかかれず、結局パッチワークでなんとかしてしまった、という話。備忘録。

準備するもの

  • Node
    • fs, path, child_process モジュールを使いますので、つまりそういう感じ。
  • PDFtk

実際のコード

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周り差し替えれば他の環境でも動くでしょ(てきとう)。

<!-- 他にも何かあったら書く -->