Archive for the 'PDFThumbnailView' Category

2013/04/16 AppleScriptObjCでPDFViewを使ってPDFをプレビュー(4)

AppleScriptObjCでPDFをプレビューするテストプログラムをその後進展させたものです。

ようやく、現在表示中のPDFの選択中のページのインデックス番号(0からはじまる通し番号)を取得できるようになりました。

→ Xcodeプロジェクトのダウンロード

PDF Kit Programming Guideの「PDF Kit Tasks」を参照し、そのとおりにAppleScriptObjCで書いても動かず、延々とデバッグを行い…………………………「document」を「|document|」と修正したところ、何の問題もなく動作しました。

このあたりは、Xcode上でチェックしたり対策してくれないと、なかなか気付きません。

AppleScriptObjC Explorer2を外部からAppleScriptでコントロールして、自動でチェックするようにしたほうがよいかもしれません(XcodeのAppleScript用語辞書の実装はあいかわらずタコなままなので、Xcodeをこづき回しても得るものが少ない。また、AppleScriptの構文色分けを反映しなくなったのは納得できません)。

本サンプルは、選択したPDFをPhotoshopでレンダリングして画像にするための「プレビュー」を目的としており、対象ファイル、対象ページ、レンダリング解像度などを取得してPhotoshopでレンダリングするフローの中で使用する部品として想定しています。実際にはこの部品は(間に合わなかったので)使用せず、もっと簡易な仕様の部品を使いましたが……次回はこの部品の改良版を投入したいところです。

pdf1.png

pdf2.png

AppleScriptObjCファイル名:AppDelegate.applescript

– AppDelegate.applescript
– pdftest2

– Created by Takaaki Naganoya on 2013/04/16.
– Copyright (c) 2012年 Takaaki Naganoya. All rights reserved.


script AppDelegate
  property parent : class “NSObject”
  
property nsurl : class “NSURL”
  
property PDFDocument : class “PDFDocument”
  
  
  property pdfPreviewWin : missing value
  
property pdfView : missing value
  
property pdfThumb : missing value
  
  property pdfPageText : missing value
  
  
  
  on applicationWillFinishLaunching_(aNotification)
    
    pdfView’s setAllowsDragging_(false)
    
pdfView’s setDelegate_(me)
    
    
    pdfThumb’s setMaximumNumberOfColumns_(2)
    
pdfThumb’s setAllowsMultipleSelection_(false)
    
    –書類が変更になった(オープンされた場合)Notificationの処理先ハンドラを登録
    
set noter1 to current application’s NSNotificationCenter’s defaultCenter()
    
noter1’s addObserver_selector_name_object_(me, “pdfChange:”, current application’s PDFViewDocumentChangedNotification, pdfView)
    
    –ページが変更になったNotificationの処理先ハンドラを登録
    
noter1’s addObserver_selector_name_object_(me, “pdfPageChange:”, current application’s PDFViewPageChangedNotification, pdfView)
    
    
    
    –ファイルを選択
    
set aFile to choose file of type “com.adobe.pdf”
    
set aFileString to aFile as Unicode text
    
dispPDFWithHFSpath_(aFileString)
    
    
  end applicationWillFinishLaunching_
  
  
  
  –プレビューウィンドウをセンタリング(見た目以外にとくに意味なし)
  
on applicationDidFinishLaunching_(aNotification)
    
    pdfPreviewWin’s |center|()
    
  end applicationDidFinishLaunching_
  
  
  
  –HFSパスの文字列を渡すとPDFViewに表示する
  
on dispPDFWithHFSpath_(aFileString)
    
    set aFileString to aFileString as Unicode text
    
    tell application “Finder”
      set aFileURL to (URL of file aFileString)
    end tell
    
    set aFileURL to aFileURL as Unicode text
    
set theURL to nsurl’s URLWithString_(aFileURL)
    
    set aPDFdoc to PDFDocument’s alloc()’s initWithURL_(theURL) –allocわすれてた、、、
    
pdfView’s setDocument_(aPDFdoc)
    
  end dispPDFWithHFSpath_
  
  
  on applicationShouldTerminate_(sender)
    return current application’s NSTerminateNow
  end applicationShouldTerminate_
  
  
  –表示ページが変更になった場合にnotificationでこちらを呼び出している
  
on pdfPageChange_(notification)
    
    dispPDFPageNumber()
    
  end pdfPageChange_
  
  
  –ファイルの新規オープン、および表示ページが変更になった場合にnotificationでこちらを呼び出している
  
on pdfChange_(notification)
    
    dispPDFPageNumber()
    
  end pdfChange_
  
  
  –PDFページ数を表示する
  
on dispPDFPageNumber()
    
    set curDoc to pdfView’s |document| –ここが問題の箇所!!!
    
set curPage to pdfView’s currentPage
    
set curPageNumber to curDoc’s indexForPage_(curPage)
    
    pdfPageText’s setStringValue_((curPageNumber + 1) as string)
    
  end dispPDFPageNumber
  
  
end script

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2013/02/09 AppleScriptObjCでPDFViewを使ってPDFをプレビュー(3)

AppleScriptObjCでPDFをプレビューするテストプログラムをその後進展させたものです。

1作目で、PDFのプレビューができるようになり
2作目で、表示中のPDFの選択中のページ(label)が取得できるようになり
この3作目では、PDFに設定されているリンクのクリックを無視するようになりました。

結局、PDFViewのオンラインマニュアルを端から端まで探しても、リンクの無効化などの機能は存在していないようだったので、上位クラスであるNSViewのオンラインマニュアルを探してみました。すると、

nsview1.png

のように、hitTest:でnill(false)を返せばViewへのクリックを無視できることがわかったので、以下のようにPDFViewを継承したクラスを宣言し、Interface Builder上でPDFViewのクラスをこの「clicThPDFView」に変更してみました。

→ Xcodeプロジェクトのダウンロード

AppleScriptObjCファイル名:clickThroughPDFView.applescript
script clicThPDFView
  
  property parent : class “PDFView”
  
  on hitTest_(aPoint)
    
    return false
    
  end hitTest_
  
end script

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

pdfv1.png

すると……

pdfv2.png

このような、目次から各章へのリンクが張られまくっているPDFをオープンして、PDFViewで目次をクリックしても……

pdfv3.png

リンク先には飛ばなくなりました!!! PDFViewへのマウスクリックを無効化することで、PDF内のリンクが反応することを防げるようになったわけです。

ただし、以前心配していたとおり、ページ数の取得にPage(0からはじまるページ数)ではなくlabelを取得しているために、目次ページなどPDFドキュメント制作時にアラビア数字ではないページ数が割り振られている箇所では、そのようなページ数が表示されることが判明。

PDF上のリンクが反応しないようにはできたものの、ページ数の取得については依然として問題を抱えていることがわかりました。PDFのプレビューとページ数設定のUser Interfaceとして利用するためにはあと一歩の改良が必要といったところです。

2013/02/06 AppleScriptObjCでPDFViewを使ってPDFをプレビュー(2)

AppleScriptObjCでPDFをプレビューするテストプログラムをその後進展させたものです。

本コードについては、PDFのファイルを選択した後で、プレビューしつつ対象ページを選ばせて他のアプリケーション(たぶんPhotoshop)に渡してレンダリングさせる……という目論見があったものの、プレビュー対象のページの取得方法が分らずに、時間がなかったのでその時には実戦投入することをあきらめました。

そして、時間のあるときに調べてみて、選択・プレビュー中のページをなんとか取得する方法にたどり着いたので、修正してみました。

pdfprev1.png

–> “Page 0; label = 1\n media (0.0, 0.0) [612.0, 792.0]\n crop (0.0, 0.0) [612.0, 792.0]\n rot 0\n ‘A Adobe\U00ae RGB (1998) Color Imag…’\n”

pdfprev2.png

–> “Page 1; label = 2\n media (0.0, 0.0) [612.0, 792.0]\n crop (0.0, 0.0) [612.0, 792.0]\n rot 0\n ‘A Adobe RGB (1998) Color Image…’\n”

まだ、実用上は問題があります。PDFViewに表示されたPDF上のリンクが生きており、PDF書類内のリンクや外部のWebサイトに張られたリンクが反応してしまうからです。これらをDisableにしてはじめて、プレビュー/処理対象ページ選択用のUIとして使えるのですが…………。

AppleScriptObjCファイル名:AppDelegate.applescript

– AppDelegate.applescript
– pdftest2

– Created by Takaaki Naganoya on 2012/10/23.
– Copyright (c) 2012年 Takaaki Naganoya. All rights reserved.


script AppDelegate
  property parent : class “NSObject”
  
property nsurl : class “NSURL”
  
property PDFDocument : class “PDFDocument”
  
  
  property pdfPreviewWin : missing value
  
property pdfView : missing value
  
property pdfThumb : missing value
  
  property pdfPageText : missing value
  
  
  
  on applicationWillFinishLaunching_(aNotification)
    
    pdfView’s setAllowsDragging_(false)
    
pdfView’s setDelegate_(me)
    
    
    pdfThumb’s setMaximumNumberOfColumns_(2)
    
pdfThumb’s setAllowsMultipleSelection_(false)
    
    –書類が変更になった(オープンされた場合)
    
set noter1 to current application’s NSNotificationCenter’s defaultCenter()
    
noter1’s addObserver_selector_name_object_(me, “pdfChange:”, current application’s PDFViewDocumentChangedNotification, missing value)
    
    –ページが変更になった
    
set noter2 to current application’s NSNotificationCenter’s defaultCenter()
    
noter2’s addObserver_selector_name_object_(me, “pdfChange:”, current application’s PDFViewPageChangedNotification, missing value)
    
    
    –ファイルを選択
    
set aFile to choose file of type “com.adobe.pdf”
    
set aFileString to aFile as Unicode text
    
dispPDFWithHFSpath_(aFileString)
    
    
  end applicationWillFinishLaunching_
  
  
  
  –プレビューウィンドウをセンタリング(見た目以外にとくに意味なし)
  
on applicationDidFinishLaunching_(aNotification)
    
    pdfPreviewWin’s |center|()
    
  end applicationDidFinishLaunching_
  
  
  
  –HFSパスの文字列を渡すとPDFViewに表示する
  
on dispPDFWithHFSpath_(aFileString)
    
    set aFileString to aFileString as Unicode text
    
    tell application “Finder”
      set aFileURL to (URL of file aFileString)
    end tell
    
    set aFileURL to aFileURL as Unicode text
    
set theURL to nsurl’s URLWithString_(aFileURL)
    
    set aPDFdoc to PDFDocument’s alloc()’s initWithURL_(theURL) –allocわすれてた、、、
    
pdfView’s setDocument_(aPDFdoc)
    
  end dispPDFWithHFSpath_
  
  
  on applicationShouldTerminate_(sender)
    return current application’s NSTerminateNow
  end applicationShouldTerminate_
  
  (*
–PDF内のURLなどのリンクをクリックした場合の動作??? これを無視させたかったのだが、、、、
on PDFViewOpenPDF_forRemoteGoToAction_(sender)

return false

end PDFViewOpenPDF_forRemoteGoToAction_
*)

  
  –ファイルの新規オープン、および表示ページが変更になった場合にnotificationでこちらを呼び出している
  
–ここで、選択中のページのノンブルを取得したい(まだできていない)
  
on pdfChange_(sender)
    set curPage to pdfView’s currentPage
    
–set curPageNum to curPage’s indexForPage
    
    set curPage2 to pdfThumb’s selectedPages
    
    set anItem to first item of curPage2
    
    log {anItem}
    
–> “Page 0; label = 1\n media (0.0, 0.0) [612.0, 792.0]\n crop (0.0, 0.0) [612.0, 792.0]\n rot 0\n ‘A Adobe\U00ae RGB (1998) Color Imag…’\n”
    
    set bItem to label of anItem –本当はPage(0からはじまるIndex)を取得したかったのだが、できなかった。なんでだろうねぇ
    
    pdfPageText’s setStringValue_(bItem as string)
    
  end pdfChange_
  
end script

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2012/12/27 AppleScriptObjCでPDFViewを使ってPDFをプレビュー

PDFのファイルを選択して、Photoshopで画像フォーマット変換を行うため、対象ページ数と解像度を指定しなければなりませんでした。そこで、PDF内の各ページのプレビューを行うウィンドウを表示すべく、AppleScriptObjCでPDFプレビュー用の試作品を作ってみました。

pdfview.png

とりあえず、指定したPDFのファイルをプレビューできています。本来なら、これで十分なはずですが……PDFビューで表示しているPDF内のリンクなどをDisableにできていないので、表示中の内容をクリックすると別のページに飛べてしまったりします。

あとは、現在表示中のページ数を取得できるとよいのですが……まだ構造を調べながらいろいろつっついている状態なので、まだできていません。さらに、パスワードが設定されていた場合への対処なども手を打っておく必要があるでしょう。

→ Xcodeプロジェクトのダウンロード

AppleScriptObjCファイル名:AppDelegate.applescript

– AppDelegate.applescript
– pdftest2

– Created by Takaaki Naganoya on 2012/10/23.
– Copyright (c) 2012年 Takaaki Naganoya. All rights reserved.


script AppDelegate
  property parent : class “NSObject”
  
property nsurl : class “NSURL”
  
property PDFDocument : class “PDFDocument”
  
  
  property pdfPreviewWin : missing value
  
property pdfView : missing value
  
property pdfThumb : missing value
  
  property pdfPageText : missing value
  
  
  
  on applicationWillFinishLaunching_(aNotification)
    
    pdfView’s setAllowsDragging_(true)
    
pdfView’s setDelegate_(me)
    
    
    pdfThumb’s setMaximumNumberOfColumns_(2)
    
    
    –書類が変更になった(オープンされた場合)
    
set noter1 to current application’s NSNotificationCenter’s defaultCenter()
    
noter1’s addObserver_selector_name_object_(me, “pdfChange:”, current application’s PDFViewDocumentChangedNotification, missing value)
    
    –ページが変更になった
    
set noter2 to current application’s NSNotificationCenter’s defaultCenter()
    
noter2’s addObserver_selector_name_object_(me, “pdfChange:”, current application’s PDFViewPageChangedNotification, missing value)
    
    
    –ファイルを選択
    
set aFile to choose file of type “com.adobe.pdf”
    
set aFileString to aFile as Unicode text
    
dispPDFWithHFSpath_(aFileString)
    
    
  end applicationWillFinishLaunching_
  
  
  
  –プレビューウィンドウをセンタリング(見た目以外にとくに意味なし)
  
on applicationDidFinishLaunching_(aNotification)
    
    pdfPreviewWin’s |center|()
    
  end applicationDidFinishLaunching_
  
  
  
  –HFSパスの文字列を渡すとPDFViewに表示する
  
on dispPDFWithHFSpath_(aFileString)
    
    set aFileString to aFileString as Unicode text
    
    tell application “Finder”
      set aFileURL to (URL of file aFileString)
    end tell
    
    set aFileURL to aFileURL as Unicode text
    
set theURL to nsurl’s URLWithString_(aFileURL)
    
    set aPDFdoc to PDFDocument’s alloc()’s initWithURL_(theURL) –allocわすれてた、、、
    
pdfView’s setDocument_(aPDFdoc)
    
  end dispPDFWithHFSpath_
  
  
  on applicationShouldTerminate_(sender)
    return current application’s NSTerminateNow
  end applicationShouldTerminate_
  
  
  –ファイルの新規オープン、および表示ページが変更になった場合にnotificationでこちらを呼び出している
  
–ここで、選択中のページのノンブルを取得したい(まだできていない)
  
on pdfChange_(sender)
    set curPage to pdfView’s currentPage
    
–set curPageNum to curPage’s indexForPage
    
    log curPage
  end pdfChange_
  
end script

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に