Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード Twitter

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2009-10-08

[][][]PDFのページ数の得る

Acrobat 9 ProのAppleScriptでPDFドキュメントの総ページ数が簡単に得られる。あれ? 昔からそうでしたっけ? pdfinfoとか使っていたのは何故?

set aFile to choose file
tell application "Adobe Acrobat Pro"
	open aFile
	tell document 1
		set my_count to count pages
		display dialog my_count as Unicode text
		close saving no
	end tell
end tell

複数のPDFをドラッグ&ドロップで処理したいならこんな感じ。

(*
count_PDF_pages
PDFドキュメントをドラッグ&ドロップして、PDFの総ページ数をカウントします。

-Mac OS X 10.6.1
-Acrobat 9 Pro

2009-10-08
*)

--------------------------------------------------------●ドラッグ&ドロップされた
on open of theFiles
	set my_count to 0 --全体のカウンタ
	set my_files to my file_kind({"pdf"}, {"PDF "}, theFiles) --ファイルのフィルタリング
	
	tell application "Adobe Acrobat Pro"
		try
			repeat with aFile in my_files
				open aFile
				tell document 1
					set my_count to my_count + (count pages) as integer
					close saving no
				end tell
			end repeat
		on error errMsg number errNum
			display dialog ((name of aFile) as Unicode text) & return & "Error! This file failure." & return & errMsg buttons {"Cancel"}
		end try
		
	end tell
	
	
	display dialog my_count as Unicode text
end open


----------------------------------------------●必要なファイルだけをフィルタして返します
to file_kind(extention_list, type_list, theFiles)
	set my_files to {}
	
	ignoring case
		tell application "Finder"
			repeat with i in theFiles
				if extention_list contains ((name extension of i) as Unicode text) then
					set end of my_files to contents of i
				else if (kind of i) is "フォルダ" as Unicode text then
					set my_files to my_files & my file_kind(extention_list, type_list, every file in folder i)
				else if type_list contains ((file type of i) as Unicode text) then
					set end of my_files to contents of i
				end if
			end repeat
		end tell
	end ignoring
	return my_files
end file_kind

count_PDF_pages.app.zip 直

しかしながら、いちいち開くんだからそれなりに遅いです。Xpdfのpdfinfoコマンドが使える環境ならこんな感じに書けば早いです。やっぱりpdfinfoだ^^

(追記:2010-01-21T00:35:55+0900)ちょっと修正しました

(*
count_PDF_pages_pdfinfo
PDFドキュメントをドラッグ&ドロップして、PDFの総ページ数をカウントします。

-Mac OS X 10.6.1
-pdfinfo 3.02

2009-10-08
2010-01-21	フォルダをドラッグ&ドロップしたときに失敗するのを修正
*)

--------------------------------------------------------●ドラッグ&ドロップされた
on open of theFiles
	set my_count to 0 --全体のカウンタ
	set my_files to my file_kind({"pdf"}, {"PDF "}, theFiles) --ファイルのフィルタリング
	try
		repeat with aFile in my_files
			set aFile to quoted form of POSIX path of (contents of aFile)
			set ans to do shell script ("/usr/local/bin/pdfinfo " & aFile & "| grep ^Pages: | sed -e 's/^Pages: *//;'")--インストールパスは環境
			--set ans to do shell script ("/Applications/pdftk.app/bin/pdfinfo " & aFile & "| grep ^Pages: | sed -e 's/^Pages: *//;'")
			set my_count to my_count + (ans) as integer
		end repeat
	on error errMsg number errNum
		display dialog ((name of aFile) as Unicode text) & return & "Error! This file failure." & return & errMsg buttons {"Cancel"}
	end try
	
	
	display dialog my_count as Unicode text
end open



----------------------------------------------●必要なファイルだけをフィルタして返します
to file_kind(extention_list, type_list, theFiles)
	set my_files to {}
	
	ignoring case
		tell application "Finder"
			repeat with i in theFiles
				if extention_list contains ((name extension of i) as Unicode text) then
					set end of my_files to (contents of i) as alias
				else if (kind of i) is "フォルダ" as Unicode text then
					set my_files to my_files & my file_kind(extention_list, type_list, every file in folder i)
				else if type_list contains ((file type of i) as Unicode text) then
					set end of my_files to (contents of i) as alias
				end if
			end repeat
		end tell
	end ignoring
	return my_files
end file_kind

Mac環境でない場合は、PDFをゴリゴリ読んで調べる方法もある。

Adobe Forums: How can I get a total page count of a...


(追記:2009-10-08T13:43:02+0900)komさんのコメントにありますとおり、mdlsコマンドも使用できるようです(ただしspotlightに捕捉されていれば)。mdlsコマンドについては下記を参照。komさん、ありがとうございました。

mdls


参照

@IT:PDFファイルの文書情報を調べるには

インストール メモ - xpdf 3.01(ちょっと古いです。注意)

AS Hole(AppleScriptの穴) By Piyomaru Software » pdfinfoを使ってPDFのページ数をかぞえる » Blog Archive

AS Hole(AppleScriptの穴) By Piyomaru Software » pdfinfoの結果をparseするv2 » Blog Archive

komkom 2009/10/08 12:48 >やっぱりpdfinfoだ^^

mdls もかわがってやってください。
spotlight のコマンドです。

set ans to do shell script "mdls -name kMDItemNumberOfPages " & "'" & aFile & "'" & "| grep ^kMDItemNumberOfPages | sed -e 's/^kMDItemNumberOfPages = *//;'"

seuzoseuzo 2009/10/08 13:42 mdlsコマンドは知りませんでした。ありがとうございます。
しかしながら、mdlsコマンドってspotlightが収集したデータを使うんでしょうか? spotlightを無効にしているディレクトリ内のファイルは

mdls: could not find /hoge/fuga.pdf.

と言われてしまいます。
man mdlsで調べてみると、10.6環境では-rawオプションもあるみたいです。ですから

set ans to do shell script "mdls -name kMDItemNumberOfPages -raw " & aFile

だけでいけるようです。
(aFileはすでにクオートされています)

komkom 2009/10/09 01:16 >-raw

すみません、勉強不足で。
よくわかってないのに使ってるんです。

いいことを教えてもらって、ありがとございます。

seuzoseuzo 2009/10/09 10:00 あ、書き忘れましたが、mdlsについて、追記させていただきました。

ぴよまるソフトウェアぴよまるソフトウェア 2009/10/09 22:35 へーー、mdlsでページ数が調べられますか〜。ということは、CD-Rのメディア上にあるPDFなんかは調べられないはずですね。やってないけど、たぶん。

Acrobat Proでページ数をかぞえるのは、ずいぶん昔からやってきた技みたいですけど、結局Acrobat Proが必要になってしまうのであまり使っていません。ruby経由でページ数を数えるやつが、いちばん手軽でベストなんじゃないでしょうか。自分で書いたものではないので、ウチのBlogにも掲載していないのですが……便利に使っています(^ー^;

ぴよまるソフトウェアぴよまるソフトウェア 2009/10/09 22:39 しかも、ruby経由で求めるやつは……Mac OS X 10.5以降限定になってしまうものの、1行でページ数を求められたはず(^ー^;;;

仕事で、指定フォルダ以下のPDFの情報をGUI上で表示するツールを作ったのですが(職場限定配布)、その時にはアプリケーションパッケージ内にXpdfのインストーラも入れておいて、起動時にXpdfがインストールされていない場合には問答無用でインストールを行わせるようにしました。

seuzoseuzo 2009/10/10 01:49 ASでcount pagesですんなり取れたので、ちょっとびっくりでした。

>ruby経由でページ数を数えるやつが、いちばん手軽でベストなんじゃないでしょうか。
わたし、ちょっと存知上げないんですが、よかったら教えてください。

ぴよまるソフトウェアぴよまるソフトウェア 2009/10/10 17:40 set aPDF to choose file of type "com.adobe.pdf"
set pNum to pdfCount(aPDF) of me


--指定PDFのページ数をかぞえる
on pdfCount(aPDF)
return ((do shell script ("ruby -e \"require 'osx/cocoa';include OSX;require_framework 'Quartz';print PDFDocument.alloc.initWithURL(NSURL.fileURLWithPath(" & (quoted form of POSIX path of aPDF) & ")).pageCount\"")) as number)
end pdfCount

seuzoseuzo 2009/10/10 18:02 ぴよまるソフトウェアさん、ありがとうございます。
RubyCocoaですね。PDFオブジェクトを作って、pageCountするってことですね。
なるほどー。

# 参照
pdf ファイルからテキストを抜き出す - RubyCocoa メモ
http://sites.google.com/site/rubycocoamemo/Home/pdfkit/pdf-fairukaratekisutowo-baki-chusu

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/seuzo/20091008/1254930176