Python でベクターグラフィックスを操作する

Aspose.PDF for Python (.NET 経由) 提供する グラフィックアブソーバー PDF ページにすでに存在するベクターグラフィックにアクセスして操作するためのクラスです。itsと呼んでください。 visit 任意のページのメソッドを使用して、パス、図形、その他のグラフィカル演算子を抽出し、必要に応じてそれらの要素を移動、削除、またはコピーできます。

このページは、新しい図形を一から描くのではなく、既存のPDFに埋め込まれているベクター描画要素を調べたり変更したりする必要がある場合に使用します。

グラフィックの抽出

抽出はすべてのベクターグラフィックスタスクの出発点です。 GraphicsAbsorber ページのコンテンツストリームを読み取り、ページ参照、位置、未処理演算子を使用して各グラフィック要素を公開します。

  1. PDF ドキュメントを開きます。
  2. を作成 グラフィックアブソーバー インスタンス。
  3. コール visit ターゲットページに入力する elements.
  4. 反復処理 elements 位置とオペレーター数を検査します。
import aspose.pdf as ap
import sys
from os import path

def using_graphics_absorber(infile: str):
    with ap.Document(infile) as document:
        with ap.vector.GraphicsAbsorber() as graphics_absorber:
            page = document.pages[1]
            graphics_absorber.visit(page)
            for element in graphics_absorber.elements:
                print(f"Page Number: {element.source_page.number}")
                print(f"Position: ({element.position.x}, {element.position.y})")
                print(f"Number of Operators: {element.operators.length}")

GraphicsAbsorber の一部です aspose.pdf.vector 名前空間であり、PDF コンテンツストリームのベクターグラフィックと相互作用するように特別に設計されています。

グラフィックの移動

抽出後、新しい設定を行います position 各要素で同じページに再配置します。更新内容をまとめてください suppress_update / resume_update バッチコンテンツストリーム書き込みの呼び出しを 1 回の操作にまとめ、重複した再描画を回避します。

  1. PDF ドキュメントを開きます。
  2. を作成 GraphicsAbsorber そして電話 visit ターゲットページに。
  3. コール suppress_update コンテンツストリームの書き込みを一時停止します。
  4. を更新 position 各要素の。
  5. コール resume_update すべての変更を一度にコミットできます。
  6. 変更した文書を保存します。
import aspose.pdf as ap
import sys
from os import path

def move_graphics(infile: str, outfile: str):
    with ap.Document(infile) as document:
        with ap.vector.GraphicsAbsorber() as graphics_absorber:
            page = document.pages[1]
            graphics_absorber.visit(page)
            graphics_absorber.suppress_update()
            for element in graphics_absorber.elements:
                position = element.position
                element.position = ap.Point(position.x + 150, position.y - 10)
            graphics_absorber.resume_update()
        document.save(outfile)

グラフィックを削除する

ページから特定のベクター要素を削除するには、位置または境界矩形でフィルタリングしてから削除します。Aspose.PDF for Python には、要素をインラインで削除するか、先に収集するかに応じて 2 つの方法があります。

方法 1: 長方形の境界を使用してインラインを削除する

このアプローチでは、各要素の位置を長方形と照合し、以下を呼び出します。 element.remove() ループのすぐ内側にあります。簡潔なコードが必要で、削除したセットを後で調べる必要がない場合に使用します。

  1. PDF ドキュメントを開きます。
  2. を作成 GraphicsAbsorber そして電話 visit ターゲットページに。
  3. ターゲットを定義 四角形.
  4. コール suppress_update コンテンツストリームの書き込みを一時停止します。
  5. 繰り返し elements、呼び出し remove() 位置が長方形の内側にある各要素について。
  6. コール resume_update 削除をコミットします。
  7. 変更した文書を保存します。
import aspose.pdf as ap
import sys
from os import path

def remove_graphics_method_1(infile: str, outfile: str):
    with ap.Document(infile) as document:
        with ap.vector.GraphicsAbsorber() as graphics_absorber:
            page = document.pages[1]
            graphics_absorber.visit(page)
            rectangle = ap.Rectangle(70, 248, 170, 252, True)
            graphics_absorber.suppress_update()
            for element in graphics_absorber.elements:
                if rectangle.contains(element.position, False):
                    element.remove()
            graphics_absorber.resume_update()
        document.save(outfile)

方法 2: 最初に要素を集めてから削除する

この方法では、一致する要素が a に集められます。 グラフィック要素コレクション コレクションをに渡します page.delete_graphics。削除を実行する前に、削除する内容を確認したり記録したりする必要がある場合に使用します。

  1. PDF ドキュメントを開きます。
  2. を作成 GraphicsAbsorber そして電話 visit ターゲットページに。
  3. ターゲットの長方形を定義します。
  4. 繰り返し elements そして、一致する要素を a に追加します GraphicElementCollection.
  5. コール page.contents.suppress_update コンテンツストリームの書き込みを一時停止します。
  6. コール page.delete_graphics コレクションと一緒に。
  7. コール page.contents.resume_update 削除をコミットします。
  8. 変更した文書を保存します。
import aspose.pdf as ap
import sys
from os import path

def remove_graphics_method_2(infile: str, outfile: str):
    with ap.Document(infile) as document:
        with ap.vector.GraphicsAbsorber() as graphics_absorber:
            page = document.pages[1]
            rectangle = ap.Rectangle(70, 248, 170, 252, True)
            graphics_absorber.visit(page)
            removed_elements_collection = ap.vector.GraphicElementCollection()
            for element in graphics_absorber.elements:
                if rectangle.contains(element.position, False):
                    removed_elements_collection.add(element)
            page.contents.suppress_update()
            page.delete_graphics(removed_elements_collection)
            page.contents.resume_update()
        document.save(outfile)

別のページへのグラフィックの追加

あるページから抽出されたベクター要素は、同じドキュメントの他のページに配置できます。要素を 1 つずつ追加する方法と、コレクション全体を 1 回の呼び出しで渡す方法の 2 つがあります。

方法 1: 要素を個別に追加する

このメソッドは、目的のページに配置する前に個々の要素をフィルタリングしたり変換したりするなど、要素ごとに制御する必要がある場合に使用します。

  1. PDF ドキュメントを開きます。
  2. を作成 GraphicsAbsorber そして電話 visit ソースページにあります。
  3. ドキュメントに新しい宛先ページを追加します。
  4. コール page_2.contents.suppress_update コンテンツストリームの書き込みを一時停止します。
  5. コール element.add_on_page(page_2) 各要素について。
  6. コール page_2.contents.resume_update すべての追加をコミットします。
  7. 変更した文書を保存します。
import aspose.pdf as ap
import sys
from os import path

def add_to_another_page_method_1(infile: str, outfile: str):
    with ap.Document(infile) as document:
        with ap.vector.GraphicsAbsorber() as graphics_absorber:
            page_1 = document.pages[1]
            page_2 = document.pages.add()
            graphics_absorber.visit(page_1)
            page_2.contents.suppress_update()
            for element in graphics_absorber.elements:
                element.add_on_page(page_2)
            page_2.contents.resume_update()
        document.save(outfile)

方法 2: コレクション全体を一度に追加する

この方法は、手動で繰り返すことなく、抽出されたすべての要素を 1 回の操作でページにコピーする場合に使用します。

  1. PDF ドキュメントを開きます。
  2. を作成 GraphicsAbsorber そして電話 visit ソースページにあります。
  3. ドキュメントに新しい宛先ページを追加します。
  4. コール page_2.contents.suppress_update コンテンツストリームの書き込みを一時停止します。
  5. コール page_2.add_graphics フルで elements コレクション。
  6. コール page_2.contents.resume_update すべての追加をコミットします。
  7. 変更した文書を保存します。
import aspose.pdf as ap
import sys
from os import path

def add_to_another_page_method_2(infile: str, outfile: str):
    with ap.Document(infile) as document:
        with ap.vector.GraphicsAbsorber() as graphics_absorber:
            page_1 = document.pages[1]
            page_2 = document.pages.add()
            graphics_absorber.visit(page_1)
            page_2.contents.suppress_update()
            page_2.add_graphics(graphics_absorber.elements, None)
            page_2.contents.resume_update()
        document.save(outfile)

関連トピック