Edited at

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

More than 1 year has passed since last update.

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

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