指定のTOCつきPDFからTOCをrecord in listで取得するAppleScriptです。各TOC項目のページ数、アウトラインレベル、ラベル(ページ名称)を順次取得して配列に出力します。
先日発売したBlogアーカイブ本のTOCを本Scriptで取得すると、以下のようになります(抜粋)。
{{pageIndex:1, outlineLevel:1, outLabel:"表紙"}, {pageIndex:2, outlineLevel:1, outLabel:"商標について"}, {pageIndex:3, outlineLevel:1, outLabel:"本書をご覧になるために"}, ... {pageIndex:34, outlineLevel:1, outLabel:"2011/1"}, {pageIndex:35, outlineLevel:2, outLabel:"リスト同士のdiffをとる"}, {pageIndex:40, outlineLevel:2, outLabel:"日本の月呼称を返す"}, {pageIndex:42, outlineLevel:2, outLabel:"指定の月を1月分リスト化"},...... {pageIndex:450, outlineLevel:1, outLabel:"奥付"}}
あれ? 「本書について」(2P)という記事が掲載もれしているのを、TOC出力から見つけてしまった、、、、、、、、
AppleScript名:PDFのしおり(TOC)の内容を取得する v3 |
— Created 2017-01-09 by Takaaki Naganoya — Modified 2019-04-10 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "Quartz" property |NSURL| : a reference to current application’s |NSURL| property PDFDocument : a reference to current application’s PDFDocument property titleList : {} set my titleList to {} set aFile to POSIX path of (choose file of type {"com.adobe.pdf"}) set fileURL to |NSURL|’s fileURLWithPath:aFile set aPDFdoc to PDFDocument’s alloc()’s initWithURL:fileURL –TOCの読み込み set parentOL to aPDFdoc’s outlineRoot() –あらかじめTOCが存在していないとmissing valueになる if parentOL is equal to missing value then display dialog "本PDFにはTOCが添付されていないため、処理を終了します" with title "No TOC Error:" return end if getChilds(parentOL) of me return (my titleList) –> {{pageIndex:1, outlineLevel:1, outLabel:"表紙"}, {pageIndex:2, outlineLevel:1, outLabel:"商標について"}, {pageIndex:3, outlineLevel:1, outLabel:"本書をご覧になるために"}, {pageIndex:5, outlineLevel:1, outLabel:"まえがき"},…… {pageIndex:33, outlineLevel:1, outLabel:"2011年"}, {pageIndex:34, outlineLevel:1, outLabel:"2011/1"}, {pageIndex:35, outlineLevel:2, outLabel:"リスト同士のdiffをとる"}, {pageIndex:40, outlineLevel:2, outLabel:"日本の月呼称を返す"},…….} –PDFOutlineを再帰で取得する on getChilds(parentOL) set outLineStr to parentOL’s label() set outLineCount to (parentOL’s numberOfChildren()) as number repeat with i from 0 to (outLineCount – 1) set anOut to (parentOL’s childAtIndex:i) –Label (Page Title) set tmpOut to (anOut’s label()) as string –Page Indel Label set tmpInd to (anOut’s destination()’s page()’s label()) as integer –Outline Level set outlevel to 0 copy anOut to aTmpOut repeat set aTmpOut to aTmpOut’s |parent|() if aTmpOut = missing value then exit repeat set outlevel to outlevel + 1 end repeat set the end of my titleList to {pageIndex:tmpInd, outlineLevel:outlevel, outLabel:tmpOut} set tmpChild to (anOut’s numberOfChildren()) as integer if tmpChild is not equal to 0 then getChilds(anOut) of me end if end repeat end getChilds |
More from my site
(Visited 259 times, 1 visits today)