[delphi-users:4515] Acrobatでしおりを追加する 方法

251 views
Skip to first unread message

123456

unread,
Sep 8, 2016, 6:50:51 AM9/8/16
to delphi...@freeml.com
こんばんはyukiと申します。
いつも参考にさせていただいています。

delphiでpdfファイルにしおりをつけたいのですが、うまくいかない箇所がありどなたかご教示を賜りたくmailさせていただきました。

環境は、Windows10 pro + delphi7 pro で、acrobatはacrobat 8 proです。
Mr.Xray様の
(h)ttp://mrxray.on.coocan.jp/Delphi/plSamples/724_Acrobat_TAcroApp.htm
を参考に
vbaで書かれたサンプル、'しおりを追加する (createChild)'
(h)ttp://pdf-file.nnn2.com/?p=787
をdelphiに書き直してみたのですが、
しおりを階層なしで追加するところまでは上手くいくのですが、
階層構造の作成のところで
[EOleSysErrorクラスの例外]種類が一致しません
とエラーになってしまいます。
少し長いのですがコードは下記です。

大変恐縮ですが、よろしくお願いします。

usesにComObjを追加して、
procedure TForm1.Button1Click(Sender: TObject);
const
PDSaveIncremental = $00000000;
var
i:integer;
AFile : String;
App :OleVariant;
AVDoc :OleVariant;
PDDoc :OleVariant;
lRet:WordBool;
JSObj: OleVariant;
RootBM: OleVariant;
objBookMark:array of OleVariant;
begin
AFile := ExtractFilePath(ParamStr(0)) + 'test.pdf';
App := CreateOleObject('AcroExch.App');
AVDoc := CreateOleObject('AcroExch.AVDOC');
PDDoc := CreateOleObject('AcroExch.PDDOC');
lRet := App.CloseAllDocs;
//PDF文書を開く
lRet := AVDoc.Open(AFile, '');
//AcroPDDocオブジェクトを取得
PDDoc := AVDoc.GetPDDoc;
//Showメソッドを実行
App.Show;
//JavaScriptオブジェクトを取得
JSObj:=PDDoc.GetJSObject;
if not VarIsNull(JSObj) then begin
//しおりのルート設定
RootBM := JSObj.bookmarkRoot;

RootBM.createChild('1.Test1', 'this.pageNum=0', 0);
RootBM.createChild('1.1 Test1-1', 'this.pageNum=1', 1);
RootBM.createChild('1.2 Test1-2', 'this.pageNum=2', 2);
RootBM.createChild('2.Test2', 'this.pageNum=3', 3);
RootBM.createChild('2.1 Test2-1', 'this.pageNum=4', 4);
RootBM.createChild('2.1.1 Test2-1-1', 'this.pageNum=5', 5);

{ *** コメントアウト部分がエラーになる。 

//ルートしおり直下のchildを取得、それぞれを参照する
//オブジェクトを設定
setlength(objBookMark, VarArrayHighBound(RootBM.Children,1));
for i:=0 to VarArrayHighBound(RootBM.Children,1)-1 do begin
objBookMark[i] := RootBM.Children(0); //[EOleSysErrorクラスの例外]種類が一致しません
end;

//階層構造を作成
objBookMark[0].insertChild( objBookMark[1], 0 );
objBookMark[0].insertChild( objBookMark[2], 1 );
objBookMark[3].insertChild( objBookMark[4], 0 );
objBookMark[4].insertChild( objBookMark[5], 0 );

for i:=0 to VarArrayHighBound(RootBM.Children,1)-1 do begin
objBookMark[i] := Unassigned;
end;
}

RootBM := Unassigned;
end;

//PDFファイルを保存して閉じる
lRet := PDDoc.Save(PDSaveIncremental, AFile);

AVDoc.Close(1);
PDDoc.Close;
App.CloseAllDocs;
AVDoc := Unassigned;
PDDoc := Unassigned;
App.Hide;
App.Exit;
App := Unassigned;
end;


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
☆世界初☆17種類以上のお茶がワンタッチで楽しめる
ネスレのカプセル式お茶マシン「スペシャル.T」を今なら無料でお試し!
あなたの想像を超えるお茶の世界を♪♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=pl7gt
------------------------------------------------------[freeml byGMO]--

auemura

unread,
Sep 8, 2016, 10:34:25 PM9/8/16
to delphi...@freeml.com
acrobatのほうの定義がどうなってるのか判らないんで勘ですが
RootBM.Children をVBAのサンプルのようにいったんVariantの変数で受けてからループで配列の中身を取り出すようにしてみたらどうですか?


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
今までダイエットに失敗してきたあなた
必見です!!やせる事に特化した専門店
ミスパリダイエットセンター☆彡☆彡
今なら、5,000円で体験実施中♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=plDNP
------------------------------------------------------[freeml byGMO]--

123456

unread,
Sep 9, 2016, 12:06:46 AM9/9/16
to delphi...@freeml.com
auemura様

yukiです。
ありがとうございました。
ご助言のように、BM:Variantとして

{
setlength(objBookMark, VarArrayHighBound(RootBM.Children,1));
for i:=0 to VarArrayHighBound(RootBM.Children,1)-1 do begin
objBookMark[i] := RootBM.Children(i);
end;
}
の部分を

BM:=RootBM.Children;
setlength(objBookMark, VarArrayHighBound(BM,1));
for i:=0 to VarArrayHighBound(BM,1)-1 do begin
objBookMark[i] := BM[i];
end;
//階層構造を作成
objBookMark[0].insertChild( objBookMark[1], 0 );
objBookMark[0].insertChild( objBookMark[2], 1 );
objBookMark[3].insertChild( objBookMark[4], 0 );
//objBookMark[4].insertChild( objBookMark[5], 0 ); //ここでエラー

for i:=0 to VarArrayHighBound(RootBM.Children,1)-1 do begin
objBookMark[i] := Unassigned;
end;
とすることで、階層構造を作ることができそうです。
(本当は、objBookMark[4].insertChildのところでつまずくのですが、
ゆっくり原因を考えてみようと思います。)

とても助かりました。ありがとうございました。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
お酒も健康も大切。そんな方から選ばれています。
しじみの栄養を毎日手軽に摂れるように、そう考えて開発されました。
しじみの良さを引き出した「しじみ習慣」。
まずは、10日間無料でお試しください。全国送料無料。
http://ad.freeml.com/cgi-bin/sa.cgi?id=plEVh
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages