11 件 見つかりました。
[2007-01-31-01]に「javascriptによるPDFリンク制御は上書きのみ」などと書いたが、やってみたらできた。また、[2007-01-08-01]にCOMからのリンク作成は無理っぽいなどと書いたが、これもjavascriptを経由しできた。顛末をメモする。WinXP SP3 Acrobat 9.1.3 pro
まずは結論。以下のスクリプトが動いた。
python(PyWin32):
import win32com.client import winerror win32com.client.dynamic.ERRORS_BAD_CONTEXT.append(winerror.E_NOTIMPL) # omajinai doc = win32com.client.Dispatch("AcroExch.App").GetActiveDoc().GetPDDoc() jso = doc.GetJSObject() # <= this requires omajinai link = jso.addLink(0, (70,70,225,50)) link.borderWidth = 3 link.borderColor = (u'RGB', 0, 0, 255) link.setAction("this.pageNum = 2")
var linkRect = [70,70,225,50]; var link1= this.addLink(0, linkRect); link1.borderWidth = 3; link1.borderColor = color.blue; link1.setAction("this.pageNum = 2")
特にスキャンした時など、PDFの回転やページ結合を行う機会が多い。
Acrobatを使えば勿論これらは可能。Acrobat以外でできるか?についてちょい考えた。
定番はpdftk。ページの結合、分割などが可能。回転はできないようだ。GUI for Pdftkなるものもあるようだ。
例えば結合は下記のようにする。
$ pdftk.exe *.pdf cat output out.pdf
PDFファイルの差分を見たいなと思った。
xdocdiffという、TortoiseSVNでWord, Excel, PowerPoint, pdfのdiffを見れるようにするツールがある。これをWinMerge用のプラグインとしてportしたものがあるが、これによって差分が見られるようになるようだ。
実際にやってみたら、うまく動いているようだった。
WinMergeは、TortoiseSVN的にも役立つソフトのようである。
タイトルの通り。Illustratorが悪いのかAcrobatが悪いのかはわからないが、AcrobatがクラッシュするようなPDF中の斜線柄のスウォッチをただの色に変えると現象が生じなくなったので、スウォッチがクラッシュに一役買っていることは間違いないだろう。なんでそうなる場合とそうならない場合があるのだろう?今時間がないのでこれ以上のトラックはやめておく。
私はプレゼン用スライドなど諸書類はIllustratorで準備することが多い。
で、仕事柄以下の様な形式の論文参照テキストオブジェクトを頻繁に用いる。
Itoh et al., Appl. Phys. Lett. 83, 2043 (2003)
この文字列自体は別途作成した論文整理ソフトから容易にクリップボードにコピーしIllustratorにペーストできる。ペースト自体はすぐ終わるが、上で「83」となっているvolume番号は太字で表記したいので、ペーストの度に手作業でここを太字に直す作業が発生する。これが意外と面倒なので、何とかして一発で太字入りテキストオブジェクトを作成したいと思った。
こういうことはJavascript(参考:【Illustrator CS自動化作戦】)とかCOMインターフェースとかIllustrator SDKを用いるのが正攻法で、手間も小さいだろう。でもクリップボードに(ただの文字列ではなく)Illustratorが解釈できるデータを用意し、それをペーストするというアプローチも面白そうだなと思った。開発は面倒そうだが概念的には明瞭で既存のペーストコマンドから実現できるし、またIllustratorに頼らずIllustratorのオブジェクトが作れれば、今後何かと便利かもしれない。
古くはAICBという形式が使われていたようだが、現在はPDF形式がメインのようである。というわけでPDF形式が良さそうだが、勉強すべき事項は多く、しばらくはトライ&エラーの体当たりな開発が必要そうだ。そこでとりあえず、PDF形式でのペーストを行うためだけのプログラムを書いた。これはクリップボードにコピーしたテキスト形式のデータを、PDF形式として無理矢理解釈しているだけである。これを用いて、メモ帳相手にひたすら手書きPDFを作成しながらIllustratorペーストした際にどのようになるかを調べれば、だんだん形式への理解も深まるのではと思う。たぶん。
#include <windows.h> #include <tchar.h> static HGLOBAL PrepareClipboardTextData(char* buf){ HGLOBAL hMem = GlobalAlloc(GHND | GMEM_SHARE, lstrlenA(buf)); if(!hMem) return NULL; char* buf2 = (char*)GlobalLock(hMem); lstrcpyA(buf2, buf); GlobalUnlock(hMem); return hMem; } UINT ConvertClipboardTextIntoPDF(){ try{ if(!OpenClipboard(NULL)) return 1; const UINT cf_pdf = RegisterClipboardFormat(TEXT("Portable Document Format")); if(cf_pdf == 0) throw 2; char* buf = (char*)GetClipboardData(CF_TEXT); if(!buf) throw 3; HGLOBAL hMem = PrepareClipboardTextData(buf); if(!hMem) throw 4; if(!SetClipboardData(cf_pdf, hMem)) throw 5; } catch(UINT i) { CloseClipboard(); return i; } CloseClipboard(); return 0; } int WINAPI _tWinMain(HINSTANCE /* hInstance */, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */){ const UINT err = ConvertClipboardTextIntoPDF(); if(err){ MessageBox(NULL, TEXT("failed"), TEXT("hiConvertClipboardTextIntoPDF"), MB_ICONEXCLAMATION); } return 0; }
[2007-01-18-01]や[2007-01-19-01]に書いたがやっぱりリンク付きPDFは便利(プレゼンなどで)。
Javascriptでもいじれるみたいだが、残念ながら上書きのみのようで、完全に制御するにはSDKでプラグイン作るレベルまで行かないとダメのようだ。
しかし実際にリンクを貼る作業をIllustrator上でどうやって実現すればいいのだろう?
現在の妄想:
__HILINK__(ファイル名、しおり名)といったテキストオブジェクトを、ファイル名やしおり名へのリンクに変換するようにすれば良いのでは?ととりあえず思ってる。クリッカブルな領域は、縦横比に捕われず自由変形できるテキストオブジェクトが占める領域で指定するようにすればどうだろう。
何であれ理解にあたっては実際にやってみるのが一番。
PDFの仕様を理解しようとして手書きPDF入門というページを見つけた(web archive内)
http://web.archive.org/web/20041204131320/http://www.kobu.com/docs/pdf/pdfxhand.htm
Acrobatの機能として、ページのイメージのサムネール画像の作成・埋め込みがサポートされているが、単体のラスタ画像ファイルでこれを作成したい場合にはどうすればよいか。
外部プログラムでこれらを行うものがいくつかある。
Xpdfに付属する pdftoppm でPDFのページイメージをppmにできる。
pdftoppm.exe -f 3 -l 5 adachi.pdf -r 50 myimgとして、3ページから5ページの画像が50dpiで myimg-000003.ppm とかの名前で出力される。ppmはそれなりに一般的な画像形式のようだが手元のwwwブラウザでは表示できなかった。
convert.exe -resample 50x50% mydoc.pdf hoge.pngなどとして全ページのイメージを出力できる。(指定したページのみの場合はどうするのだろう?)
Dim app, avdoc, pddoc, pdpage, point, rect Set app = CreateObject("AcroExch.App") Set avdoc = app.GetActiveDoc Set pddoc = avdoc.GetPDDoc Set pdpage = pddoc.AcquirePage(0) Set point = pdpage.GetSize() Set rect = CreateObject("AcroExch.Rect") rect.Left = 0 rect.Right = point.X rect.Top = 0 rect.Bottom = point.Y pdpage.CopyToClipboard rect, 0, 0, 100
PDFのサムネール表示は全体を俯瞰するのに便利。手元のAcrobat 7 Standardでは「ページ」というナビゲーションタブでこれが見られる(Foxit Readerを2分ほど使ってみたが、同様の機能はなかった)。特に私は口頭発表でPDFを用いるため、ページの順序を考えたり、聞き手の方々に全体を示しつつ指示のあったページに素早く移動する際にこれが活躍する。この時のサムネール画像の解像度について考えたことをメモする。
まず、PDFにはページのデータとは別にサムネール用のラスタ画像ファイルを内包する仕様が用意されている。これを持っていないPDFをAcrobatでサムネール表示する際には、Acrobatがその都度サムネール画像を作成し描画する。これが一番解像度の良い表示となるが、当然ながら描画にあたってはそれなりの時間がかかってしまう。
この欠点を克服するのが「サムネール画像の埋め込み」というものである。「ページ」のオプションメニューからこれを選択すると、ラスタイメージがPDFの仕様に従ってファイルに埋め込まれ、サムネール表示にあたっての描画の負担はかなり軽減される。だが解像度はサムネール画像なしの場合よりも悪い。かつ、その解像度を指定するオプションも見当たらなかった。
私は発表用のスライドはIllustrator CSで1枚ずつ作成し、後でこれを結合している。Illustratorのオプションとしてサムネール画像を作成というのがあるが、この場合の解像度はかなり悪い。
またPDFキャビネットもPDFのサムネール表示をすることが可能である。これは既存のサムネール画像とは別の機構で表示してくれるようで、その解像度はそれほど悪くなく、かつ内容はどこかにキャッシュするらしく、表示のたび再描画してる気配は見えない。
まとめる。解像度の大小は以下の通り:
埋め込みサムネール画像なし > PDFキャビネットの表示 > Acrobat 7 Standardによる埋め込みサムネール画像 > Illustrator CSによる埋め込みサムネール画像
埋め込みサムネール画像なし | |
PDFキャビネットの表示 | |
Acrobat 7 Standardによる埋め込みサムネール画像 | |
Illustrator CSによる埋め込みサムネール画像 |
Acrobat Developer Centerから文書やらツールキットやらに辿れる。何でもある。文書はAcrobat 7.0.5 SDKを試しに入れてみたら大量に付属していたので、個々にかき集める前にSDKにインストールを行うと良さそう。
本家ではないが、Adobe Acrobat 7.0例文辞典なんてすごいページもあった。