Archive for the 'PDFOutline' Category

2017/01/09 PDFのしおり(TOC)の内容を取得するじっけん v2

指定のPDFにしおり(TOC: Table Of Contents)がついていたら、その内容を読み取るじっけんです。再帰処理でTOCの階層を追いかけるようにしてみました。

2階層までのTOCのPDFを処理するScriptと処理結果を照合して、同じであることを確認していますが、3階層以上の深さを持つTOCでテストは行っていません。

AppleScript名:PDFのしおり(TOC)の内容を取得するじっけん v2
– Created 2017-01-09 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “Quartz”
–http://piyocast.com/as/archives/4383

property titleList : {}

set my titleList to {}

set aFile to POSIX path of (choose file of type {“com.adobe.pdf”})
tell current application
  set fileURL to my (|NSURL|’s fileURLWithPath:aFile)
  
set aPDFdoc to my (PDFDocument’s alloc()’s initWithURL:fileURL)
end tell

–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

–再帰処理してみた
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)
    
set tmpOut to (anOut’s label()) as string
    
set the end of my titleList to 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

★Click Here to Open This Script 

2017/01/09 PDFのしおり(TOC)の内容を取得するじっけん

指定のPDFにしおり(TOC: Table Of Contents)がついていたら、その内容を読み取るじっけんです。

Cocoa経由でも意外とたいした情報が取得できないところが驚きです。TOCの階層が2階層になっているものを処理の前提条件にしているので、本Scriptの仕様では3階層以上潜っていけません。

単なる実験なので、もう少し何か気の利いた処理ができるとよいでしょう。再帰処理とか。

AppleScript名:PDFのしおり(TOC)の内容を取得するテスト
– Created 2017-01-09 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “Quartz”
–http://piyocast.com/as/archives/4382

set aFile to POSIX path of (choose file of type {“com.adobe.pdf”})
tell current application
  set fileURL to my (|NSURL|’s fileURLWithPath:aFile)
  
set aPDFdoc to my (PDFDocument’s alloc()’s initWithURL:fileURL)
end tell

–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

set outLineStr to parentOL’s label() –numberOfChildren()
set outLineCount to (parentOL’s numberOfChildren()) as number
set titleList to {}

–本当は再帰処理したいが…
repeat with i from 0 to (outLineCount - 1)
  
  
set anOut to (parentOL’s childAtIndex:i)
  
set tmpOut to (anOut’s label()) as string
  
set the end of titleList to {0, tmpOut}
  
set tmpChild to (anOut’s numberOfChildren()) as integer
  
  
if tmpChild is not equal to 0 then
    repeat with ii from 0 to (tmpChild - 1)
      set anOut2 to (anOut’s childAtIndex:ii)
      
set tmpOut2 to (anOut2’s label()) as string
      
set the end of titleList to {1, tmpOut2}
    end repeat
  end if
  
end repeat

return titleList
–>  {{0, “表紙”}, {0, “目次”}, {0, “まえがき”}, {0, “この書籍について”}, {0, “#1 アプリケーションメニュー”}, {1, “アプリケーションメニュー”}, {1, “アプリケーション名称の取得”}, {1, “バージョン情報の取得”}, {1, “アップデートを確認”},….}

★Click Here to Open This Script 

2016/09/07 PDFのしおりを追加

Edama2さんからの投稿Scriptです(ありがとうございますー)。以下、その内容です。

(投稿ここから)
内容は、指定したPDFにしおりを追加します。変更したPDFは同じフォルダに別名保存します。サンプルScript中のしおりデータは、book2_2.0.pdf(最新事情がわかるAppleScript 10大最新技術)用です。

しおりがあると今度は、章だけではなく大見出しも欲しくなり作ってみました。

preview1.png
▲処理前のPDF(Adobe Acrobat Professionalで表示)

pdfindex3.png
▲処理前のPDFのしおり部分(AppleScriptで処理すると一旦削除)

pdfindex4.png
▲処理後のPDF。新規作成したしおり部分。階層構造を持っている

階層表示の一階層しか対応していませんが、もっと深い階層も作れるようにしたかったが、…時間がなくてできませんでした。再帰処理で出来そうな気はするんですが…。

実用的にはもう一階層分あったほうがうれしいです。この辺は好みもあるので自分でもDTPする時に悩みます。

#1 他人のマシン上でも動くAppleScriptを書く
  他人のマシン上でも動くAppleScriptを書く
    準備しよう!
      他人のユーザーアカウント上で動かすための最低条件
      OSAXを極力使わない

メインの処理をrunハンドラでなく、別ハンドラにしているのは、「Objective-Cポインタは保存できません」エラーに対応するためです。

→ AppleScriptのダウンロード(20KB)

リファレンスv2は、ページ数の多さもあり気になった項目から読んでいるので、まだ全部読み終えてませんが主に文法編をよく活用しています。(投稿ここまで)

「AppleScript最新リファレンス」については、書いた本人でも、「あれ、こんなの書いたっけ?」と、自分で読んで発見があります(汗)

プログラムの内容について、自分もひととおり美味しそうなPDF関連のCocoaの機能は試した気になっていたのですが、しおりは試していませんでした。

自分がいつも使っている「AppleScriptのプログラムを書式つきのHTMLに変換」するAppleScriptでお送りいただいたScriptを変換したところ、WordPress側でエラー発生。やむなくダウンロードしていただく形式にしました(なんでだ?!)。

書籍の話に戻りますが……PDFが出来上がったあとでゴニョゴニョを後処理を行うよりも制作フローそのものを見直すべきだとは自分も思っています(MarkdownからPDFを書き出すだけというのは無茶すぎ、、、)。その割に、世間に転がっている情報のウラをとって(実際に確認して)みると、Pandocも割と役立たずで、MarkdownをIDMLに変換できるとかいいつつ、いざInDesignに読ませてみると「互換性がない」エラーに遭遇するやらで、実に「自分で何か作らないとダメ」な雰囲気です。