指定PDFの全ページのURLリンクアノテーションのURLを書き換えるAppleScriptです。
URL Linkアノテーションを添付したPDFに対して、Linkアノテーションのboundsを取得して削除し、同じboundsの異なるURLへのリンクアノテーションを作成して保存します。
Keynote、Pages、NumbersのiWorkアプリケーションにはオブジェクトに対してリンクを付加し、URLを指定することができるようになっていますが、URLスキームはhttpがデフォルトで指定されています。
Pages上でURLスキームを指定できたら、それはそれで使い道がいろいろありそうですが、リクエストを出してもここはhttp(かmailto)以外は有効になる気配がありません。
そこで、URLだけダミーのものをこれらのiWorkアプリケーション上で割り振っておいていったんPDF書き出しを行い、書き出されたPDFのLinkアノテーションをあとでAppleScriptから書き換えることで、任意のURLリンクを埋め込むのと同じことができるようになるだろう、と考えて実験してみました。
ただ、1つのグラフィックオブジェクトに対してKeynote上でリンクを付与してPDF書き出しすると、Keynoteがオブジェクトの領域を細分化してリンクを作成するようです。文字とグラフィックにリンクを指定しただけなのに、やたらと大量のリンクアノテーションが検出されるので、念のためにチェックしてみたらこんな(↓)感じでした。
AppleScript名:指定PDFの全ページからリンクアノテーションのURLを取得してURLを書きかえる |
— Created 2017-06-08 by Takaaki Naganoya — Modified 2018-03-14 by Takaaki Naganoya — 2017, 2018 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "Quartz" property |NSURL| : a reference to current application’s |NSURL| property PDFActionURL : a reference to current application’s PDFActionURL property PDFDocument : a reference to current application’s PDFDocument property PDFAnnotationLink : a reference to current application’s PDFAnnotationLink set aPOSIX to POSIX path of (choose file of type {"com.adobe.pdf"} with prompt "Choose a PDF with Annotation") set linkList to replaceLinkURLFromPDF(aPOSIX, "http://www.apple.com/jp", "applescript://com.apple.scripteditor?action=new&script=display%20dialog%20%22TEST%22") of me on replaceLinkURLFromPDF(aPOSIX, origURL, toURL) set v2 to system attribute "sys2" –> case: macOS 10.12 =12 set aURL to (|NSURL|’s fileURLWithPath:aPOSIX) set aPDFdoc to PDFDocument’s alloc()’s initWithURL:aURL set pCount to aPDFdoc’s pageCount() –PDFのページ(PDFPage)でループ repeat with ii from 0 to (pCount – 1) set tmpPage to (aPDFdoc’s pageAtIndex:ii) –PDFPage set anoList to (tmpPage’s annotations()) as list if anoList is not equal to {missing value} then –指定PDF中にAnotationが存在した –対象PDFPage内で検出されたAnnotationでループ repeat with i in anoList if v2 < 13 then set aType to (i’s type()) as string –to macOS Sierra (10.10, 10.11 & 10.12) else set aType to (i’s |Type|()) as string –macOS High Sierra (10.13) or later end if –Link Annotationの削除と同様のサイズでLink Annotationの新規作成 if aType = "Link" then set tmpURL to (i’s |URL|()’s absoluteString()) as string if tmpURL = origURL then set theBounds to i’s |bounds|() –削除する前にLink Annotationの位置情報を取得 –> {origin:{x:78.65625, y:454.7188}, size:{width:96.96875, height:4.0937}} (tmpPage’s removeAnnotation:i) –PDFPageから指定のLink Annotationを削除 set theLink to (PDFAnnotationLink’s alloc()’s initWithBounds:theBounds) set theAction to (PDFActionURL’s alloc()’s initWithURL:(current application’s |NSURL|’s URLWithString:toURL)) (theLink’s setMouseUpAction:theAction) (tmpPage’s addAnnotation:theLink) log {ii + 1, theBounds, origURL} end if end if end repeat end if end repeat return (aPDFdoc’s writeToFile:aPOSIX) as boolean end replaceLinkURLFromPDF |
More from my site
(Visited 136 times, 1 visits today)
2018年に書いた価値あるScript – AppleScriptの穴 says:
[…] ・指定PDFの全ページからリンクアノテーションのURLを取得してURLを書きかえる PDFのリンク書き換えScriptは、えほんシリーズ(Keynoteで作成)のPDFにScript Linkを埋め込むために試作したScript […]