AcroExch.PDPage: CropPage メソッド

TOP > AcroExch.PDPage > CropPage      [...]


説明

該当ページから指定した四隅範囲を残してページから切り取る(=トリミングする)。

 

形式

VARIANT_BOOL CropPage(LPDISPATCH iAcroRect);

 

引数

  1. 第1引数(LPDISPATCH iAcroRect) :
    AcroRectオブジェクトでTop,bottom,Left,Rightを指定する。

 

戻り値

  • -1 : 成功。
  • 0 : 失敗。

 

動作するバージョン

Version Adobe
Acrobat
備考
4
-
Acrobat 4.0    ※Windows 98SE + Excel 2000
5
-

Acrobat 5.0.5
6
-

Acrobat 6.0.3 Pro
7
-
Acrobat 7.0.9 Pro
Acrobat 7.1.4 Pro
8
OK
Acrobat 8.1.2 Pro
9
-
Acrobat 9.3.2 Extended
10
-
Acrobat X (10.1.8) Extended
11
-
Acrobat XI (11.0.04) Extended
  • OK = 動作する。
  • NO = 動作しない。 戻り値が0を返す。
  • - = 未確認。

 






サンプル:ExcelのVBA

 

説明:該当ページから指定した四隅範囲を残してページから切り取る。

  • F8キーでステップ実行しながら動作確認する。
  • 事前に参照設定をする。
  • テストする時は出来るだけテキストを沢山含んだページを対象にする。

 

Sub AcroExch_PDPage_CropPage()

    Dim objAcroApp      As New Acrobat.AcroApp '(TEST用)
    Dim objAcroAVDoc    As New Acrobat.AcroAVDoc '(TEST用)
    Dim objAcroPDDoc    As New Acrobat.AcroPDDoc
    Dim objAcroPDPage   As Acrobat.AcroPDPage
    Dim objAcroRect     As New Acrobat.AcroRect
    Dim lRet            As Long
    
    'Acrobatを起動表示する
    lRet = objAcroApp.Show                  '(TEST用)
    'PDFファイルを開いて表示する
    lRet = objAcroPDDoc.Open("E:¥Test01.pdf")
    '画面にPDFを表示する
    lRet = objAcroAVDoc.Open("E:¥Test01.pdf", "") '(TEST用)
    '2ページ目のPDPageオブジェクトを取得する
    Set objAcroPDPage = objAcroPDDoc.AcquirePage(1)
    '切り取る範囲をポイントで指定する
    objAcroRect.Top = 704       'トップ
    objAcroRect.bottom = 584    '底
    objAcroRect.Left = 468      '左
    objAcroRect.Right = 648     '右
    'ページを
    lRet = objAcroPDPage.CropPage(objAcroRect)
    '★この時点のPDFドキュメント画面を見る。
    
    '保存しないでPDFファイルを閉じる
    lRet = objAcroPDDoc.Close

    'Acrobatを閉じる
    lRet = objAcroApp.Hide      '(TEST用)
    lRet = objAcroApp.Exit      '(TEST用)

    'オブジェクトを強制開放する
    Set objAcroRect = Nothing
    Set objAcroPDPage = Nothing
    Set objAcroPDDoc = Nothing
    Set objAcroAVDoc = Nothing  '(TEST用)
    Set objAcroApp = Nothing    '(TEST用)

End Sub

 

実行結果

(1)以下は実行前のページで右上を対象にする。

実行前

(2)以下がCropPageメソッド実行後にPDFビュアー(Acrobat)で見た結果。これを専門的にはトリミングと言う。

実行後

 

補足

  • F8キーでステップ実行し、各メソッドによりどのような動きをするかよく観察すること。
  • サンプル上の(TEST用)ステートメントはテスト用のロジックで実用時は不要です。
  • 「天地左右3mmづつトリミングされたPDFファイル」の作り方でAcroRectオブジェクトのTop,bottom,Left,Right 指定方法で別のサンプルが「みやさん」コメントにあります。こちらも参考にするとAcroRectオブジェクトの使い方が分かります。
    http://pdf-file.nnn2.com/?p=168&cpage=1#comment-57

 

動作確認環境

  • WindowsXP Pro(+ SP3) +
    Acrobat 8.1.2 Pro + Office 2003 + MicrosoftUpdate

 

戻る

「AcroExch.PDPage: CropPage メソッド」への12件のフィードバック

  1. はじめまして。
    さっきコメントがエラーになってしまったのでチェックでおくらさせてください。

  2. 質問があったのですが、コードを書き込んだせいか、なぜか、エラーになってしまいます。失礼しました。

  3. 中原 さん へ
    当サイトは海外等から大量のスパムが来るので入力の条件は厳しいです。 コードの前に質問をどうぞ。

  4. 返事がおくれて、すみません。
    ワード(エクセルではなく)vbaは多少できるのですが、
    oleというのは、今まで知りませんでした。
    どういうふうに質問してよいかが、わからず、
    もう少し研究してあらためて質問させていただきます。

  5. 中原 さん へ

    OLEと言うとかなり難しく聞こえますが、
    例えで言えば、Word 内にExcelの表を貼り付けることが出来ますよね。
    これもOLEと言う機能の一部です。
    それと同様にVBA内で、別のアプリ(DLLファイル等)の機能を使えるようにしたのがOLEです。

    VBAのプログラミングは既に内部ではOLE機能を使っています。
    それを意識するかしないか、機能を追加するかどうかだけの話なので、サイトに書かれている手順でヤってみる事をオススメします。
    こうしたら、こう出来る、そのやり方をOLEと言う、だけの話です。

    その前にVBAに慣れないといけませんネ。
    当サイトはVBAのサポートまではご遠慮させて頂いています。
    何をしたいのかは不明ですが。

  6. アドバイスありがとうございます。
    実は、「PDFの出力」OLEをワードVBAに取り込み、
    ワードに入力したPDFファイル名から、連続でファイルを開いて印刷していくという
    コードをつくりました。これは上手く動き、とても重宝しています。

    このコードの「PDFの出力」OLEをPDFのトリミング」OLEに変えて、
    動かしたところ、最後の1ファイルだけトリミング処理され、
    残りは処理されていないという結果になっています。
    おそらく
    buf = アクロAVdoc.Close(True)
    の部分に問題と思うのですが、いかがでしょうか?

  7. 中原さんへ
    テスト環境が一時的な不具合で動かないので記憶だけで返答します。

    > AcroAVdoc.Close(True)
    これはファイルに変更があると保存するかを尋ねるダイアログ画面が表示されて、画面を閉じるまでVBAがその部分で一時停止してしまいます。よって使い勝手が悪いです。
    AcroPDdoc.close は保存できません。保存せずに閉じるだけです。

    AcroPDdoc.Save は保存できます。但し引数で最適化の部分がうまく動作しない場合が有りますが、コレを推奨します。

    jso.SaveAs も保存できますが、少し操作で難しい部分が有るので今はオススメしません。

    > ・・最後の1ファイルだけトリミング処理され・・
    保存してから印刷をしている訳ですか。
    OLEオブジェクトの連携がうまく出来てないのでしょう。
    ※ ↑ 誰もが最初によくぶつかる部分です。
    それはロジックを見ないと分からないです。
    保存する前に印刷を先に行えば問題が起きないと思います。
    保存も必要ならば、やはりロジックを見直す必要が有ります。

    VBA ロジックを当サイトのコメントに入れるとエラーになる場合はVBAコメントの前後に日本語を入れて下さい。
    多分、エラーは回避されると想います。(動作未確認

  8. 管理人さん
    AcroPDdoc.Saveは使ってみたのですが、
    引数の設定がどうしてもわかりません。
    省略はできないものでしょうか?

  9. 中原さんへ

    サンプルと同じように

    Const PDSaveFull = &H1 
    Const PDSaveLinearized = &H4 
    Const PDSaveCollectGarbage = &H20

    ‘別名でPDFファイルを保存する 
        lRet = objAcroPDDoc.Save _ 
            (PDSaveFull + PDSaveLinearized + _ 
             PDSaveCollectGarbage, _ 
             "E:¥Test01_T.pdf"

    としてください。
    別名で保存します。
    なお、別名での保存はココの問題が出るかもしれないので C ドライブ以外を推奨します。

  10. 管理人さん
    うまく動きました。
    少しだけ質問させてください。
    ・&H1 &H14 &H20 これはどういう意味ですか
    ・トリミングの数値にどうしても誤差が出るのですが、もっとよい計算方法はありますか

    コードを入れようといろいろ試しているのですが、エラー続きです。
    もう少し短くまとめて、また、試してみます。

  11. 中原さんへ

    >&H1 &H4 &H20
    ヘキサ=数値を16進表記したモノです。
    &H1 -> 10進数では 0x16 + 1 =1
    &H4 -> 10進数では 0x16 + 4 = 4
    &H20 -> 10進数では 2x16 + 0 = 32
    コンピュータ内部の表現を使って定義するのが一般的です。
    Const PDSaveFull = 1
    Const PDSaveLinearized = 4
    Const PDSaveCollectGarbage = 32
    も同じ意味です。
    lRet = objAcroPDDoc.Save (1 + 4 + 32, "E:¥Test01_T.pdf")
    又は
    lRet = objAcroPDDoc.Save (37, "E:¥Test01_T.pdf")
    も結果は同じです。
    この様な表現をする意味を詳細に説明するのはコメントでは無理です。
    コンピューターのCPUを意識したプログラミングが必要になった時に初めて理解できる部分です。
    今は「そうやって定義するものだ」、「1つのルール」と思うだけで結構です。

    >・・トリミングの数値にどうしても誤差が出る・・
    誤差が出る原因は不明です。
    対策としては当初から誤差を意識した設計を行うことだと思います。

    >・・エラー続き・・
    キーボードのF8キーを使ってステップ実行を行い、各変数がどのように変化するかを観察しながらテストをして下さい。

  12. 管理人さん
    誤差に関してはミリの設定値をポイントに変換してそれを又ミリ設定で表示するわけですから、いたしかないかと思っています。
    いろいろと勉強させていただきました。
    ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


出来るだけ早く返答する様には心がけています。
が、遅くなる時もありますのでご了承ください。


SAMURAI Plugin

コメントをする時は出来れば以下もお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れるとエラーになる場合が有ります。その時はコードの前後に <code> ・・・</code> タグを入れてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください