11 件 見つかりました。

CHALOW Search - hiChangeLog ChangeLog INDEX

1 2 [ 次へ ]

Acrobatを用いて外部プロセスからPDFにリンクを設定 [COM][python][PyWin32][PDF]

[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")

javascript: (コンソールにペーストして全部選択しCtrl+Enterすれば実行できる)
var linkRect = [70,70,225,50];
var link1= this.addLink(0, linkRect);
link1.borderWidth = 3;
link1.borderColor = color.blue;      
link1.setAction("this.pageNum = 2")

--

Acrobatには豊富なjavascript APIが提供されている。COMインターフェースもあるが、これよりも充実している。
Adobe - Acrobat Developer Center - JavaScript for Acrobat
Adobe - Acrobat Developer Center - Interapplication Communication <= COM
Acrobatを完全操作するにはJavaScriptオブジェクト(JavaScriptAPI)を覚えないとダメ!?

Adobe Acrobat 7.0例文辞典にも文例が豊富。

さてCOMによるAcrobatの操作のためには、上記理由により、COMからのjavascript呼出しが勘所となる。このためのJSObjectなるインターフェースが用意されており、VBによる例文が上のリンク中"Developing Applications Using Interapplication Communication"に出ている。(C/C++からの利用方法は多少異なるようである。JS オブジェクトを C / C++ から利用する方法についてなるそのものズバリの記述もあるがこちらは試してない。

あとはこれをpythonから呼ぶだけだが、GetJSObjectメソッドは、戻り値がちょっと特殊でLPDISPATCH*となっており、そのままではエラーが出て実行できない。回避のためには、ERRORS_BAD_CONTEXTに上記の通り値をappendしてやればよい。[python-win32] COM, Acrobat and JavaScript

PDFの回転やページ結合を行うツールについて [PDF]

特にスキャンした時など、PDFの回転やページ結合を行う機会が多い。
Acrobatを使えば勿論これらは可能。Acrobat以外でできるか?についてちょい考えた。

定番はpdftk。ページの結合、分割などが可能。回転はできないようだ。GUI for Pdftkなるものもあるようだ。
例えば結合は下記のようにする。

$ pdftk.exe *.pdf cat output out.pdf

回転はRotPDFが簡潔で使いよい。
回転はImageMagickでもできたけど、解像度が落ちた。オプションの渡し方次第かもしらんが、面倒なので調べない。

PDFの差分 [PDF][subversion]

PDFファイルの差分を見たいなと思った。
xdocdiffという、TortoiseSVNでWord, Excel, PowerPoint, pdfのdiffを見れるようにするツールがある。これをWinMerge用のプラグインとしてportしたものがあるが、これによって差分が見られるようになるようだ。

実際にやってみたら、うまく動いているようだった。

WinMergeは、TortoiseSVN的にも役立つソフトのようである。

Illustrator CSで作成した斜線柄スウォッチを含むPDFをAcrobat 7.0.9 Standardで拡大表示させるとAcrobatがクラッシュする場合があった [PDF][Illustrator]

タイトルの通り。Illustratorが悪いのかAcrobatが悪いのかはわからないが、AcrobatがクラッシュするようなPDF中の斜線柄のスウォッチをただの色に変えると現象が生じなくなったので、スウォッチがクラッシュに一役買っていることは間違いないだろう。なんでそうなる場合とそうならない場合があるのだろう?今時間がないのでこれ以上のトラックはやめておく。

Illustratorにペーストを行うため、PDF形式のデータをクリップボードに用意する [PDF][Illustrator][Windowsプログラミング]

私はプレゼン用スライドなど諸書類は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;
}

IllustratorでPDFを作る際にリンクを貼るためにはどうすれば良いだろう? [Illustrator][PDF][Windowsプログラミング]

[2007-01-18-01][2007-01-19-01]に書いたがやっぱりリンク付きPDFは便利(プレゼンなどで)。
Javascriptでもいじれるみたいだが、残念ながら上書きのみのようで、完全に制御するにはSDKでプラグイン作るレベルまで行かないとダメのようだ。

しかし実際にリンクを貼る作業をIllustrator上でどうやって実現すればいいのだろう?
現在の妄想:

__HILINK__(ファイル名、しおり名)
といったテキストオブジェクトを、ファイル名やしおり名へのリンクに変換するようにすれば良いのでは?ととりあえず思ってる。クリッカブルな領域は、縦横比に捕われず自由変形できるテキストオブジェクトが占める領域で指定するようにすればどうだろう。

作成途中でどこにどんなページが来るかわかりっこないので、リンク先はファイル名で指定するしかない。で、PDFを連結する際に元ファイル名がそのページのしおりになるようにすれば、このリンクが有効となる。

リンクの実装と管理、PDF連結、サムネイル表示を一手に引き受けるプログラムを用意すればファイル名を考える煩わしさから解放されるけど、ちょっとしんどそう。ただ、画像データに対しいちいちファイル名を考えて与え、管理もファイル名で行うのはいただけないと日頃思っているので、余裕があればなんとかしたい。

PDFの仕様と手書きPDF入門 [PDF]

何であれ理解にあたっては実際にやってみるのが一番。
PDFの仕様を理解しようとして手書きPDF入門というページを見つけた(web archive内)
http://web.archive.org/web/20041204131320/http://www.kobu.com/docs/pdf/pdfxhand.htm

PDFのサムネール画像の作成方法 [PDF][COM][VBScript(WSH)][画像ファイル]

Acrobatの機能として、ページのイメージのサムネール画像の作成・埋め込みがサポートされているが、単体のラスタ画像ファイルでこれを作成したい場合にはどうすればよいか。

外部プログラムでこれらを行うものがいくつかある。

Xpdfに付属する pdftoppm でPDFのページイメージをppmにできる。

pdftoppm.exe -f 3 -l 5 adachi.pdf -r 50 myimg
として、3ページから5ページの画像が50dpiで myimg-000003.ppm とかの名前で出力される。ppmはそれなりに一般的な画像形式のようだが手元のwwwブラウザでは表示できなかった。

またImageMagickの convert でも
convert.exe -resample 50x50% mydoc.pdf hoge.png
などとして全ページのイメージを出力できる。(指定したページのみの場合はどうするのだろう?)

Ghostscriptの使用が多分最も正統派なのだろうが、それはPDF Hacksを参照。

手元のAcrobat 7 Standardはアドバンスドメニューから「すべての画像を書き出し」というメニューがあった。

またAcrobatがあればCOM経由で以下のようにもできる。拡張子をvbsなどとして保存し、ダブルクリックすれば開いてる文書の最初のページがクリップボードにコピーされる。
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のサムネール表示とその画像の解像度について [PDF][Illustrator][画像ファイル]

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キャビネットの表示PDFキャビネットの表示
Acrobat 7 Standardによる埋め込みサムネール画像Acrobat 7 Standardによる埋め込みサムネール画像
Illustrator CSによる埋め込みサムネール画像Illustrator CSによる埋め込みサムネール画像


画像ファイルを指定した埋め込みが最もflexibleと思うのだが、AcrobatのメニューのみならずAPI(もちろんJavaScript、COMインターフェースも)にもそういったものは無かった。まあAPIの方には PDDocCreateThumbs なる関数が用意されているのでこれを駆使すれば同等のことができると思うのだけれど。

ならばサムネール画像を埋め込むソフトはあるかと思いきや、以下しか発見できなかった。複数ページに一気に埋め込むのは面倒な感じである。
http://www.coolpdf.com/pdfthumbnail.html

調べてる最中に、いっそ自前でこういうソフトを作ってしまおうかとも考えたが、PDFの仕様を理解する時間がとれないのでとりあえず保留。

AcrobatとPDFとその操作について調べたことをメモ [PDF][Windowsプログラミング]

Acrobat Developer Centerから文書やらツールキットやらに辿れる。何でもある。文書はAcrobat 7.0.5 SDKを試しに入れてみたら大量に付属していたので、個々にかき集める前にSDKにインストールを行うと良さそう。

本家ではないが、Adobe Acrobat 7.0例文辞典なんてすごいページもあった。

1 2 [ 次へ ]

ChangeLog INDEX
Powered by chalow