PDFファイルのページ数を調べよう
だ〜れも覚えていないでしょうが、5年ほど前にPDFのページを調べるファンクションを書いています。最終的にはリニア化されたPDFファイルにも対応したすぐれものです。ただ、使いドコロが限られるという…
そんなスクリプトでも時折カウント出来ないファイルというものに遭遇するのですが、どういった経緯でカウント不能になるのかが皆目わからずにほうったらかし状態でした。
まあ、そうそう引っかかることはありませんので問題にならなかったというものあるのですが、先日ちょいとファンクション走らせてnullが返ったブツに心当たりがあって調べてみた次第です。
まずは、利用するスクリプトです。
alert (getPageLength(new File(File.openDialog ('select pdf'))));
function getPageLength(f){
var tg = /<<\/Count\s(\d+)/;
var count = /<<\/Type\/Page\/Parent/;
var count_2 = /\/Type\s\/Page\s/;
var count_3 = /\/StructParents\s\d+.*\/Type\/Page>>/;
var tg2 = /<<\/Linearized\s.+\/N\s(\d+)\/T\s.+>>/;
var tg3 = /\/Type\/Pages/;
var tg4 = /\/Count\s(\d+)/;
var len = 0;
var num = 0;
if(f.open('r')){
while(!f.eof){
wd = f.readln();
if (tg.test(wd)) return RegExp.$1 - 0;
if (tg2.test(wd)) return RegExp.$1 - 0;
if (count.test(wd)) len++;
if (count_2.test(wd)) len++;
if (count_3.test(wd)) len++;
if (tg3.test(wd)){
wd = f.readln();
if (tg4.test(wd)){
num = RegExp.$1 - 0;
if (len<num) len = num;
}
}
}
}
if(len>0) return len;
return null;
}
再掲なんですが、動作も軽快ですし便利です。下の例はIllustrator Scripting Guide.pdfをエディタで開いた頭の部分です。リニア化されている為にxrefが頭の方にあります。また、Linearrized情報が付加されていますのでページ数はNコマンドの値を読み出すだけで抽出できます。
%PDF-1.6
%âãÏÓ
3106 0 obj
<</Linearized 1/L 833417/O 3109/E 47747/N 65/T 771175/H [ 3756 1082]>>
endobj
xref
3106 173
0000000016 00000 n
0000004838 00000 n
0000005018 00000 n
0000005078 00000 n
0000005216 00000 n
0000005338 00000 n
0000005442 00000 n
0000005810 00000 n
0000006559 00000 n
0000006705 00000 n
0000008667 00000 n
0000008942 00000 n
0000009305 00000 n
0000025072 00000 n
0000025132 00000 n
0000025274 00000 n
0000025363 00000 n
0000025541 00000 n
0000025661 00000 n
0000025845 00000 n
0000026027 00000 n
0000026147 00000 n
0000026331 00000 n
0000026515 00000 n
0000026635 00000 n
0000026819 00000 n
0000026993 00000 n
0000027207 00000 n
0000027347 00000 n
0000027555 00000 n
0000027685 00000 n
0000027795 00000 n
0000027903 00000 n
0000028027 00000 n
0000028183 00000 n
0000028323 00000 n
0000028425 00000 n
0000028589 00000 n
0000028689 00000 n
0000028795 00000 n
0000028989 00000 n
0000029091 00000 n
0000029181 00000 n
0000029291 00000 n
0000029493 00000 n
0000029581 00000 n
0000029673 00000 n
0000029851 00000 n
0000029953 00000 n
0000030049 00000 n
0000030175 00000 n
0000030379 00000 n
0000030475 00000 n
0000030641 00000 n
0000030735 00000 n
0000030907 00000 n
0000031065 00000 n
0000031265 00000 n
0000031429 00000 n
0000031537 00000 n
0000031679 00000 n
0000031847 00000 n
0000031949 00000 n
0000032045 00000 n
0000032179 00000 n
0000032293 00000 n
0000032425 00000 n
0000032539 00000 n
0000032729 00000 n
0000032887 00000 n
0000032989 00000 n
0000033085 00000 n
0000033199 00000 n
0000033301 00000 n
0000033397 00000 n
0000033511 00000 n
0000033637 00000 n
0000033777 00000 n
0000033959 00000 n
0000034087 00000 n
0000034217 00000 n
0000034397 00000 n
0000034531 00000 n
0000034697 00000 n
0000034863 00000 n
0000035027 00000 n
0000035217 00000 n
0000035347 00000 n
0000035463 00000 n
0000035597 00000 n
0000035737 00000 n
0000035851 00000 n
0000035967 00000 n
0000036101 00000 n
0000036257 00000 n
0000036389 00000 n
0000036531 00000 n
0000036677 00000 n
0000036811 00000 n
0000036947 00000 n
0000037073 00000 n
0000037213 00000 n
0000037395 00000 n
0000037523 00000 n
0000037653 00000 n
0000037833 00000 n
0000037967 00000 n
0000038165 00000 n
0000038313 00000 n
0000038477 00000 n
0000038639 00000 n
0000038829 00000 n
0000038959 00000 n
0000039075 00000 n
0000039209 00000 n
0000039367 00000 n
0000039517 00000 n
0000039637 00000 n
0000039753 00000 n
0000039909 00000 n
0000040041 00000 n
0000040181 00000 n
0000040327 00000 n
0000040461 00000 n
0000040597 00000 n
0000040723 00000 n
0000040863 00000 n
0000041019 00000 n
0000041201 00000 n
0000041329 00000 n
0000041459 00000 n
0000041639 00000 n
0000041773 00000 n
0000041971 00000 n
0000042119 00000 n
0000042283 00000 n
0000042473 00000 n
0000042603 00000 n
0000042719 00000 n
0000042853 00000 n
0000043003 00000 n
0000043123 00000 n
0000043239 00000 n
0000043395 00000 n
0000043527 00000 n
0000043669 00000 n
0000043815 00000 n
0000043949 00000 n
0000044085 00000 n
0000044239 00000 n
0000044343 00000 n
0000044501 00000 n
0000044633 00000 n
0000044757 00000 n
0000044923 00000 n
0000045079 00000 n
0000045269 00000 n
0000045449 00000 n
0000045599 00000 n
0000045745 00000 n
0000045883 00000 n
0000046125 00000 n
0000046249 00000 n
0000046427 00000 n
0000046595 00000 n
0000046717 00000 n
0000046847 00000 n
0000047013 00000 n
0000047179 00000 n
0000047319 00000 n
0000047513 00000 n
0000047629 00000 n
0000003756 00000 n
trailer
<</Size 3279/Root 3107 0 R/Info 3105 0 R/ID[<6F3D2DC1BC2A2F32BD748D1B1C5DE43D><285DC488A7DBB544818221AA90614C28>]/Prev 771162>>
startxref
0
%%EOF
3278 0 obj
<</B 2560/E 2528/Filter/FlateDecode/I 2585/L 2544/Length 968/O 2512/S 2383>>stream
・
・
・
ところが、このファイルに少し手を加えると構造が一変します。
%PDF-1.6
%âãÏÓ
3394 0 obj
<>stream
・
・
・
この様にリニア化情報が消えてオブジェクトストリームがすぐに始まります。精査してみると全てのオブジェクトがFlateストリームの中に入ってしまい、通常Flateストリームの外にあるCountやPages等の情報まで全てがFlateストリームでラップされてしまいます。今回のものは何をやったかというと注釈を加えただけなんですが、こういった処理はPDFファイルの構造を一変させてしまうようですね。同じPDF1.6でもぜ〜んぶFlateストリームの中に隠れちゃいます。下の例はお尻の部分ですがxrefまでストリームに隠れて見えません。これでは調べようが無いですねw
endstream
endobj
startxref
568700
%%EOF
ひとつ補足しておくとPDFを別名で「保存(最適化)」するとリニア化されたドキュメントとなります。こうしておけばNオペレータの値を読み出すだけでページ数を確認できます。
1件のコメント
コメントを残す
コメントを投稿するにはログインしてください。
※手を加えるとは、PDFをアクロバットで「再編集したり、注釈を加えたり」することなのですが、処理の程度によっては最適化が保持されます。