基本#

ファイルを開く#

ファイルを開くには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("a.pdf") # open a document

注釈

さらに進む

より高度なオプションについては、サポートされているファイルを開く方法ガイド のリストを参照してください。


PDF からテキストを抽出する#

PDF ファイルからすべてのテキストを抽出するには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("a.pdf") # open a document
out = open("output.txt", "wb") # create a text output
for page in doc: # iterate the document pages
    text = page.get_text().encode("utf8") # get plain text (is in UTF-8)
    out.write(text) # write text of page
    out.write(bytes((12,))) # write page delimiter (form feed 0x0C)
out.close()

もちろん、PDFだけでなく、MOBI、EPUB、TXTなどの サポートされているドキュメントファイル形式 でもテキストを抽出できます。

注釈

さらに進む

もし文書に画像ベースのテキストコンテンツが含まれている場合は、後続のテキスト抽出のためにそのページでOCRを使用してください。

tp = page.get_textpage_ocr()
text = page.get_text(textpage=tp)

特定の領域からテキストを抽出する方法や、文書から表を抽出する方法など、さらに多くの例があります。テキストの方法ガイドを参照してください。

Markdown形式でテキストを抽出 することもできます。

APIリファレンス


PDF から画像を抽出する#

PDF すべての画像を抽出するには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("test.pdf") # open a document

for page_index in range(len(doc)): # iterate over pdf pages
    page = doc[page_index] # get the page
    image_list = page.get_images()

    # print the number of images found on the page
    if image_list:
        print(f"Found {len(image_list)} images on page {page_index}")
    else:
        print("No images found on page", page_index)

    for image_index, img in enumerate(image_list, start=1): # enumerate the image list
        xref = img[0] # get the XREF of the image
        pix = pymupdf.Pixmap(doc, xref) # create a Pixmap

        if pix.n - pix.alpha > 3: # CMYK: convert to RGB first
            pix = pymupdf.Pixmap(pymupdf.csRGB, pix)

        pix.save("page_%s-image_%s.png" % (page_index, image_index)) # save the image as png
        pix = None

注釈

さらに進む

特定の領域からテキストを抽出する方法や、文書から表を抽出する方法など、さらに多くの例があります。テキストの方法ガイドを参照してください。

APIリファレンス

ベクトルグラフィックスを抽出#

ドキュメントのページからすべてのベクトルグラフィックスを抽出するには、以下の手順に従います:

doc = pymupdf.open("some.file")
page = doc[0]
paths = page.get_drawings()

これにより、ページ上で見つかったすべてのベクター図形のパスの辞書が返されます。

注釈

さらに進む

次のページを参照してください: 「描画の抽出方法」

APIリファレンス


PDF ファイルの結合#

PDF ファイルを結合するには、以下の手順を実行してください:

import pymupdf

doc_a = pymupdf.open("a.pdf") # open the 1st document
doc_b = pymupdf.open("b.pdf") # open the 2nd document

doc_a.insert_pdf(doc_b) # merge the docs
doc_a.save("a+b.pdf") # save the merged document with a new filename

PDF ァイルと他の種類のファイルを結合する#

Document.insert_file() を使用すると、サポートされているファイルをPDFと結合するメソッドを呼び出すことができます。例えば:

import pymupdf

doc_a = pymupdf.open("a.pdf") # open the 1st document
doc_b = pymupdf.open("b.svg") # open the 2nd document

doc_a.insert_file(doc_b) # merge the docs
doc_a.save("a+b.pdf") # save the merged document with a new filename

注釈

さらに進む

Document.insert_pdf()Document.insert_file() を使用すれば、PDFを簡単に結合できます。開かれたPDF文書がある場合、片方のPDFから別のPDFへページの範囲をコピーすることができます。コピーされたページが配置される位置を選択することができ、ページの順序を元に戻すこともできます。さらに、ページの回転も変更することができます。詳細な説明はこの Wiki の記事に記載されています。

GUIスクリプト join.py では、この方法を使用してファイルのリストを結合し、それぞれの目次セグメントも結合します。スクリプトの見た目は以下のようになっています:

_images/img-pdfjoiner.jpg

APIリファレンス


座標を扱う#

PyMuPDF を使用する際に快適に感じるべき 数学用語 が1つあります - 「座標」 です。オブジェクトの配置や文書空間の理解に役立つ座標系を理解するために、Coordinates セクションを簡単にご覧ください。


PDF ファイルにウォータマークを追加する方法#

PDF ファイルにウォータマークを追加するには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("document.pdf") # open a document

for page_index in range(len(doc)): # iterate over pdf pages
    page = doc[page_index] # get the page

    # insert an image watermark from a file name to fit the page bounds
    page.insert_image(page.bound(),filename="watermark.png", overlay=False)

doc.save("watermarked-document.pdf") # save the document with a new filename

注釈

さらに進む

ウォータマークを追加することは、基本的には各PDFページの底辺に画像を追加するだけです。画像が必要な透明度とアスペクト比を持っていることを確認して、必要な見た目になるようにします。

前述の例では、各ファイル参照から新しい画像が作成されていますが、メモリとファイルサイズを節約するために、この画像データは1回だけ参照されるようにすると、パフォーマンスが向上します - Page.insert_image()のコード例と説明を参照してください。

APIリファレンス


PDF に画像を追加する#

PDFファイルに画像を追加するためには、例えばロゴを追加する場合、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("document.pdf") # open a document

for page_index in range(len(doc)): # iterate over pdf pages
    page = doc[page_index] # get the page

    # insert an image logo from a file name at the top left of the document
    page.insert_image(pymupdf.Rect(0,0,50,50),filename="my-logo.png")

doc.save("logo-document.pdf") # save the document with a new filename

注釈

さらに進む

ウォータマークの例と同様に、できる限り画像を1回だけ参照することで、より効率的な処理を行うようにしてください。詳細は Page.insert_image() のコード例と説明を参照してください。

APIリファレンス


PDF を回転させる#

ページに回転を追加するには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("test.pdf") # open document
page = doc[0] # get the 1st page of the document
page.set_rotation(90) # rotate the page
doc.save("rotated-page-1.pdf")

注釈

APIリファレンス


PDF のトリミング#

定義された矩形 Rect にページをトリミングするには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("test.pdf") # open document
page = doc[0] # get the 1st page of the document
page.set_cropbox(pymupdf.Rect(100, 100, 400, 400)) # set a cropbox for the page
doc.save("cropped-page-1.pdf")

注釈

APIリファレンス


ファイルの添付#

別のファイルをページに添付するには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("test.pdf") # open main document
attachment = pymupdf.open("my-attachment.pdf") # open document you want to attach

page = doc[0] # get the 1st page of the document
point = pymupdf.Point(100, 100) # create the point where you want to add the attachment
attachment_data = attachment.tobytes() # get the document byte data as a buffer

# add the file annotation with the point, data and the file name
file_annotation = page.add_file_annot(point, attachment_data, "attachment.pdf")

doc.save("document-with-attachment.pdf") # save the document

注釈

さらに進む

Page.add_file_annot() でファイルを追加する際には、ファイル名を指定する第三引数には実際のファイルの拡張子を含める必要があります。これがないと、添付ファイルが開けるものとして認識されない可能性があります。例えば、ファイル名が単に「attachment」とだけ指定されている場合、生成されたPDFを見て添付ファイルを開こうとするとエラーが発生するかもしれません。しかし、「attachment.pdf」と指定されている場合、PDFビューアーで有効なファイルタイプとして認識され、開くことができます。

添付ファイルのデフォルトアイコンは「押しピン」ですが、 icon パラメータを設定することでこれを変更することができます。

APIリファレンス


ファイルを埋め込む#

ファイルを文書に埋め込むには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("test.pdf") # open main document
embedded_doc = pymupdf.open("my-embed.pdf") # open document you want to embed

embedded_data = embedded_doc.tobytes() # get the document byte data as a buffer

# embed with the file name and the data
doc.embfile_add("my-embedded_file.pdf", embedded_data)

doc.save("document-with-embed.pdf") # save the document

注釈

さらに進む

ファイルを添付する場合と同様に、 Document.embfile_add() でファイルを追加する際には、ファイル名を指定する第一引数には実際のファイルの拡張子を含める必要があります

APIリファレンス


ページを削除する#

文書からページを削除するには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("test.pdf") # open a document
doc.delete_page(0) # delete the 1st page of the document
doc.save("test-deleted-page-one.pdf") # save the document

複数のページを文書から削除するには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("test.pdf") # open a document
doc.delete_pages(from_page=9, to_page=14) # delete a page range from the document
doc.save("test-deleted-pages.pdf") # save the document

ページを再配置する#

ページを再配置するには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("test.pdf") # open a document
doc.move_page(1,0) # move the 2nd page of the document to the start of the document
doc.save("test-page-moved.pdf") # save the document

注釈

APIリファレンス


ページをコピーする#

ページをコピーするには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("test.pdf") # open a document
doc.copy_page(0) # copy the 1st page and puts it at the end of the document
doc.save("test-page-copied.pdf") # save the document

注釈

APIリファレンス


ページを選択する#

ページを選択するには、以下の手順を実行してください:

import pymupdf

doc = pymupdf.open("test.pdf") # open a document
doc.select([0, 1]) # select the 1st & 2nd page of the document
doc.save("just-page-one-and-two.pdf") # save the document

注釈

さらに進む

PyMuPDF を使用すると、 PDF のページをコピー、移動、削除、または再配置するためのオプションがすべて揃っています。 Document.copy_page() メソッドのように、ページ単位で直感的なメソッドを使用してこれらの操作を行うことができます。

または、 Python のシーケンスとして完全な新しいページレイアウトを準備し、希望するページ番号を希望する順序で含め、必要なページ数だけ繰り返すこともできます。次の例は、 Document.select() を使用した可能性を示しています。

doc.select([1, 1, 1, 5, 4, 9, 9, 9, 0, 2, 2, 2])

以下のように、両面印刷用にPDFを準備しましょう(直接これをサポートしていないプリンターで):

ページ数は len(doc)`( `doc.page_count と同じ)で与えられます。以下のリストは、それぞれ偶数ページと奇数ページの番号を表しています:

p_even = [p in range(doc.page_count) if p % 2 == 0]
p_odd  = [p in range(doc.page_count) if p % 2 == 1]

このスニペットは、それぞれのサブドキュメントを作成し、それらを使用してドキュメントを印刷することができます:

doc.select(p_even) # only the even pages left over
doc.save("even.pdf") # save the "even" PDF
doc.close() # recycle the file
doc = pymupdf.open(doc.name) # re-open
doc.select(p_odd) # and do the same with the odd pages
doc.save("odd.pdf")

詳細については、この ウィキの記事 もご覧ください。

次の例は、すべてのページの順序を逆にするものです(非常に高速: Adobe PDFリファレンス リファレンスの756ページをサブセカンドの時間で処理します)。

lastPage = doc.page_count - 1
for i in range(lastPage):
    doc.move_page(lastPage, i) # move current last page to the front

このスニペットは、PDFを自身と重複させることで、ページ0、1、…、n、0、1、…、nを含むようにします(非常に高速で、ファイルサイズをほとんど増やさずに実現します!):

page_count = len(doc)
for i in range(page_count):
    doc.copy_page(i) # copy this page to after last page

APIリファレンス


空白のページを追加する#

空白のページを追加するには、以下の手順を行います:

import pymupdf

doc = pymupdf.open(...) # some new or existing PDF document
page = doc.new_page(-1, # insertion point: end of document
                    width = 595, # page dimension: A4 portrait
                    height = 842)
doc.save("doc-with-new-blank-page.pdf") # save the document

注釈

さらに進む

以下の方法を使用して、別の事前定義された用紙フォーマットを使ってページを作成します:

w, h = pymupdf.paper_size("letter-l")  # 'Letter' landscape
page = doc.new_page(width = w, height = h)

便利な関数 paper_size() は、40以上の業界標準の用紙フォーマットを選択できます。それらを確認するには、辞書 attr:paperSizes を調べてください。用紙の寸法を取得するために、希望する辞書キーを paper_size() に渡します。大文字と小文字の両方がサポートされています。フォーマット名に「-L」を追加すると、横長バージョンが返されます。

以下は、1ページの空白の PDF: を作成するための3行のコードです。ファイルサイズは460バイトです。

doc = pymupdf.open()
doc.new_page()
doc.save("A4.pdf")

APIリファレンス


ページにテキストコンテンツを挿入する#

Document.insert_page() メソッドを使用すると、新しいページが挿入され、同じ幅と高さのパラメーターが受け入れられます。しかし、このメソッドでは新しいページに任意のテキストを挿入することができ、挿入された行数が返されます。

import pymupdf

doc = pymupdf.open(...)  # some new or existing PDF document
n = doc.insert_page(-1, # default insertion point
                    text = "The quick brown fox jumped over the lazy dog",
                    fontsize = 11,
                    width = 595,
                    height = 842,
                    fontname = "Helvetica", # default font
                    fontfile = None, # any font file name
                    color = (0, 0, 0)) # text color (RGB)

注釈

さらに進む

テキストパラメーターは、UTF-8エンコーディングを想定している(シーケンスの)文字列です。挿入はページの上端から1インチ下であるポイント Point (ポイント) (50, 72) から始まり、左から50ポイントの位置です。挿入されたテキストの行数が返されます。

APIリファレンス


単一のページを分割する#

この方法は、 PDF のページを任意の部分に分割することに関連しています。例えば、Letterフォーマットのページを含む PDF を、4倍の拡大率で印刷したい場合を考えてみましょう。各ページは4つの部分に分割され、それぞれが再びLetterフォーマットの個別の PDF ページになります。

import pymupdf

src = pymupdf.open("test.pdf")
doc = pymupdf.open()  # empty output PDF

for spage in src:  # for each page in input
    r = spage.rect  # input page rectangle
    d = pymupdf.Rect(spage.cropbox_position,  # CropBox displacement if not
                  spage.cropbox_position)  # starting at (0, 0)
    #--------------------------------------------------------------------------
    # example: cut input page into 2 x 2 parts
    #--------------------------------------------------------------------------
    r1 = r / 2  # top left rect
    r2 = r1 + (r1.width, 0, r1.width, 0)  # top right rect
    r3 = r1 + (0, r1.height, 0, r1.height)  # bottom left rect
    r4 = pymupdf.Rect(r1.br, r.br)  # bottom right rect
    rect_list = [r1, r2, r3, r4]  # put them in a list

    for rx in rect_list:  # run thru rect list
        rx += d  # add the CropBox displacement
        page = doc.new_page(-1,  # new output page with rx dimensions
                           width = rx.width,
                           height = rx.height)
        page.show_pdf_page(
                page.rect,  # fill all new page with the image
                src,  # input document
                spage.number,  # input page number
                clip = rx,  # which part to use of input page
            )

# that's it, save output file
doc.save("poster-" + src.name,
         garbage=3,  # eliminate duplicate objects
         deflate=True,  # compress stuff where possible
)

例:

_images/img-posterize.png

注釈

APIリファレンス


単一のページを結合する#

これは、2つまたは4つの元のページを組み合わせた新しい PDF を作成することを意味します(または「2-up」、「4-up」などとも呼ばれます)。これは、ブックレットやサムネイルのような概要を作成するために使用できます。

import pymupdf

src = pymupdf.open("test.pdf")
doc = pymupdf.open()  # empty output PDF

width, height = pymupdf.paper_size("a4")  # A4 portrait output page format
r = pymupdf.Rect(0, 0, width, height)

# define the 4 rectangles per page
r1 = r / 2  # top left rect
r2 = r1 + (r1.width, 0, r1.width, 0)  # top right
r3 = r1 + (0, r1.height, 0, r1.height)  # bottom left
r4 = pymupdf.Rect(r1.br, r.br)  # bottom right

# put them in a list
r_tab = [r1, r2, r3, r4]

# now copy input pages to output
for spage in src:
    if spage.number % 4 == 0:  # create new output page
        page = doc.new_page(-1,
                      width = width,
                      height = height)
    # insert input page into the correct rectangle
    page.show_pdf_page(r_tab[spage.number % 4],  # select output rect
                     src,  # input document
                     spage.number)  # input page number

# by all means, save new file using garbage collection and compression
doc.save("4up.pdf", garbage=3, deflate=True)

例:

_images/img-4up.png

注釈

APIリファレンス


PDF の暗号化と復号化#

バージョン1.16.0から、PDFの暗号化と復号化(パスワードを使用)が完全にサポートされています。以下のことができます:

  • ドキュメントがパスワード保護されているか、(まだ)暗号化されているかを確認する(Document.needs_pass, Document.is_encrypted)。

  • ドキュメントへのアクセス権を取得する(Document.authenticate())。

  • Document.save() または Document.write() を使用して、PDFファイルの暗号化詳細を設定する。

    • 内容の復号化または暗号化

    • パスワードの設定

    • 暗号化方式の設定

    • 権限の詳細設定

注釈

PDF文書には2つの異なるパスワードが存在する場合があります:

  • オーナーパスワード:パスワードを変更したり、暗号化方法を変更したり、権限の詳細を含む完全なアクセス権を提供します。

  • ユーザーパスワード:文書の内容にアクセスするための権限詳細に基づいてアクセスを提供します。存在する場合、ビューアでPDFを開く際にユーザーパスワードを入力する必要があります。

メソッド Document.authenticate() は、使用されるパスワードに基づいて自動的にアクセス権を確立します。

以下のスニペットは新しい PDF を作成し、別々のユーザーパスワードとオーナーパスワードで暗号化します。印刷、コピー、注釈付けの権限が与えられますが、ユーザーパスワードで認証するユーザーに対しては変更は許可されません

import pymupdf

text = "some secret information" # keep this data secret
perm = int(
    pymupdf.PDF_PERM_ACCESSIBILITY # always use this
    | pymupdf.PDF_PERM_PRINT # permit printing
    | pymupdf.PDF_PERM_COPY # permit copying
    | pymupdf.PDF_PERM_ANNOTATE # permit annotations
)
owner_pass = "owner" # owner password
user_pass = "user" # user password
encrypt_meth = pymupdf.PDF_ENCRYPT_AES_256 # strongest algorithm
doc = pymupdf.open() # empty pdf
page = doc.new_page() # empty page
page.insert_text((50, 72), text) # insert the data
doc.save(
    "secret.pdf",
    encryption=encrypt_meth, # set the encryption method
    owner_pw=owner_pass, # set the owner password
    user_pw=user_pass, # set the user password
    permissions=perm, # set permissions
)

注釈

さらに進む

このドキュメントをいくつかのビューア(Nitro Reader 5など)で開くと、これらの設定が反映されます:

_images/img-encrypting.jpg

暗号化パラメータが提供されていない場合、保存時に自動的に復号化されます。

PDFの暗号化方法を保持するには、encryption=pymupdf.PDF_ENCRYPT_KEEP を使用して保存します。また、 doc.can_save_incrementally() == True であれば、増分保存も可能です

暗号化方法を変更する場合は、上記のすべてのオプション(encryptionowner_pwuser_pwpermissions)を指定します。この場合、増分保存はできません。

APIリファレンス


ページからのテーブルの抽出#

表はどのドキュメントの Page (ページ) からも見つけて抽出できます。

import pymupdf
from pprint import pprint

doc = pymupdf.open("test.pdf") # open document
page = doc[0] # get the 1st page of the document
tabs = page.find_tables() # locate and extract any tables on page
print(f"{len(tabs.tables)} found on {page}") # display number of found tables

if tabs.tables:  # at least one table found?
   pprint(tabs[0].extract())  # print content of first table

注釈

APIリファレンス

重要

お好みの場合、テーブル抽出が 可能なpdf2docxのextract tablesメソッド もあります。


ドキュメントからすべての注釈を取得する#

ページ上の注釈 (Annot (注釈)) は、page.annots() メソッドを使用して取得できます。

import pymupdf

for page in doc:
    for annot in page.annots():
        print(f'Annotation on page: {page.number} with type: {annot.type} and rect: {annot.rect}')

注釈

APIリファレンス


PDF からコンテンツを塗りつぶす#

マーキングされた領域に矩形を使用して、ページ上の削除されるべき領域を示すために、赤字が付けられる特別なアノテーションです。領域に矩形をマークした後、その領域は赤字としてマークされ、赤字が適用されると、そのコンテンツは安全に削除されます。

たとえば、ドキュメントから名前「ジェーン・ドー」のすべてのインスタンスを塗りつぶしたい場合は、次のようにします:

import pymupdf

# Open the PDF document
doc = pymupdf.open('test.pdf')

# Iterate over each page of the document
for page in doc:
    # Find all instances of "Jane Doe" on the current page
    instances = page.search_for("Jane Doe")

    # Redact each instance of "Jane Doe" on the current page
    for inst in instances:
        page.add_redact_annot(inst)

    # Apply the redactions to the current page
    page.apply_redactions()

# Save the modified document
doc.save('redacted_document.pdf')

# Close the document
doc.close()

別の例として、ページの領域を塗りつぶすが、定義された領域内の線画(ベクトルグラフィックス)を塗りつぶさないように、パラメータフラグを設定することができます。

import pymupdf

# Open the PDF document
doc = pymupdf.open('test.pdf')

# Get the first page
page = doc[0]

# Add an area to redact
rect = [0,0,200,200]

# Add a redacction annotation which will have a red fill color
page.add_redact_annot(rect, fill=(1,0,0))

# Apply the redactions to the current page, but ignore vector graphics
page.apply_redactions(graphics=0)

# Save the modified document
doc.save('redactied_document.pdf')

# Close the document
doc.close()

警告

文書の塗りつぶし済みバージョンを保存すると、PDF 内の塗りつぶされたコンテンツは 取り戻すことができなくなります 。したがって、文書内の塗りつぶされた領域は、その領域からテキストとグラフィックスを完全に削除します。

注釈

さらに進む

ページに赤字を作成して適用するためのいくつかのオプションがあります。これらのオプションを制御するためのパラメータを理解するためには、完全なAPI詳細についてAPIリファレンスを参照してください。

APIリファレンス


PDF ドキュメントの変換#

PyMuPDF を使用する pdf2docx ライブラリと、PDF から DOCX 形式への簡単なドキュメント変換を提供する python-docx ライブラリをお勧めします。


This software is provided AS-IS with no warranty, either express or implied. This software is distributed under license and may not be copied, modified or distributed except as expressly authorized under the terms of that license. Refer to licensing information at artifex.com or contact Artifex Software Inc., 39 Mesa Street, Suite 108A, San Francisco CA 94129, United States for further information.

Discord logo