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 xref3106 1730000000016 00000 n0000004838 00000 n0000005018 00000 n0000005078 00000 n0000005216 00000 n0000005338 00000 n0000005442 00000 n0000005810 00000 n0000006559 00000 n0000006705 00000 n0000008667 00000 n0000008942 00000 n0000009305 00000 n0000025072 00000 n0000025132 00000 n0000025274 00000 n0000025363 00000 n0000025541 00000 n0000025661 00000 n0000025845 00000 n0000026027 00000 n0000026147 00000 n0000026331 00000 n0000026515 00000 n0000026635 00000 n0000026819 00000 n0000026993 00000 n0000027207 00000 n0000027347 00000 n0000027555 00000 n0000027685 00000 n0000027795 00000 n0000027903 00000 n0000028027 00000 n0000028183 00000 n0000028323 00000 n0000028425 00000 n0000028589 00000 n0000028689 00000 n0000028795 00000 n0000028989 00000 n0000029091 00000 n0000029181 00000 n0000029291 00000 n0000029493 00000 n0000029581 00000 n0000029673 00000 n0000029851 00000 n0000029953 00000 n0000030049 00000 n0000030175 00000 n0000030379 00000 n0000030475 00000 n0000030641 00000 n0000030735 00000 n0000030907 00000 n0000031065 00000 n0000031265 00000 n0000031429 00000 n0000031537 00000 n0000031679 00000 n0000031847 00000 n0000031949 00000 n0000032045 00000 n0000032179 00000 n0000032293 00000 n0000032425 00000 n0000032539 00000 n0000032729 00000 n0000032887 00000 n0000032989 00000 n0000033085 00000 n0000033199 00000 n0000033301 00000 n0000033397 00000 n0000033511 00000 n0000033637 00000 n0000033777 00000 n0000033959 00000 n0000034087 00000 n0000034217 00000 n0000034397 00000 n0000034531 00000 n0000034697 00000 n0000034863 00000 n0000035027 00000 n0000035217 00000 n0000035347 00000 n0000035463 00000 n0000035597 00000 n0000035737 00000 n0000035851 00000 n0000035967 00000 n0000036101 00000 n0000036257 00000 n0000036389 00000 n0000036531 00000 n0000036677 00000 n0000036811 00000 n0000036947 00000 n0000037073 00000 n0000037213 00000 n0000037395 00000 n0000037523 00000 n0000037653 00000 n0000037833 00000 n0000037967 00000 n0000038165 00000 n0000038313 00000 n0000038477 00000 n0000038639 00000 n0000038829 00000 n0000038959 00000 n0000039075 00000 n0000039209 00000 n0000039367 00000 n0000039517 00000 n0000039637 00000 n0000039753 00000 n0000039909 00000 n0000040041 00000 n0000040181 00000 n0000040327 00000 n0000040461 00000 n0000040597 00000 n0000040723 00000 n0000040863 00000 n0000041019 00000 n0000041201 00000 n0000041329 00000 n0000041459 00000 n0000041639 00000 n0000041773 00000 n0000041971 00000 n0000042119 00000 n0000042283 00000 n0000042473 00000 n0000042603 00000 n0000042719 00000 n0000042853 00000 n0000043003 00000 n0000043123 00000 n0000043239 00000 n0000043395 00000 n0000043527 00000 n0000043669 00000 n0000043815 00000 n0000043949 00000 n0000044085 00000 n0000044239 00000 n0000044343 00000 n0000044501 00000 n0000044633 00000 n0000044757 00000 n0000044923 00000 n0000045079 00000 n0000045269 00000 n0000045449 00000 n0000045599 00000 n0000045745 00000 n0000045883 00000 n0000046125 00000 n0000046249 00000 n0000046427 00000 n0000046595 00000 n0000046717 00000 n0000046847 00000 n0000047013 00000 n0000047179 00000 n0000047319 00000 n0000047513 00000 n0000047629 00000 n0000003756 00000 ntrailer<</Size 3279/Root 3107 0 R/Info 3105 0 R/ID[<6F3D2DC1BC2A2F32BD748D1B1C5DE43D><285DC488A7DBB544818221AA90614C28>]/Prev 771162>>startxref0%%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
endstreamendobjstartxref568700%%EOF
ひとつ補足しておくとPDFを別名で「保存(最適化)」するとリニア化されたドキュメントとなります。こうしておけばNオペレータの値を読み出すだけでページ数を確認できます。
1件のコメント
ten へ返信する コメントをキャンセル
コメントを投稿するにはログインしてください。
※手を加えるとは、PDFをアクロバットで「再編集したり、注釈を加えたり」することなのですが、処理の程度によっては最適化が保持されます。