Python で PDF ファイルを操作する
皆さんは PDF が何であるかをよく知っているはずです。実際、これらは最も重要で広く使用されているデジタル メディアの 1 つです。 PDF の略 ポータブルドキュメントフォーマット 。使用します .pdf 拡大。ソフトウェア ハードウェアやオペレーティング システムに依存せず、ドキュメントを確実に提示および交換するために使用されます。
発明者 アドビ PDF は現在、国際標準化機構 (ISO) によって維持されているオープン標準です。 PDF には、フィールド オーディオ ビデオおよびビジネス ロジックのリンクとボタンを含めることができます。
この記事では、次のようなさまざまな操作を行う方法を学びます。
- PDFからテキストを抽出する
- PDF ページの回転
- PDF の結合
- PDFの分割
- PDF ページに透かしを追加する
インストール: 簡単なPythonスクリプトを使ってみよう!
サードパーティのモジュール pypdf を使用します。
pypdf は、PDF ツールキットとして構築された Python ライブラリです。次のことが可能です。
- 文書情報の抽出(タイトル著者…)
- 文書をページごとに分割する
- ドキュメントをページごとに結合する
- ページのトリミング
- 複数のページを 1 つのページに結合する
- PDF ファイルの暗号化と復号化
- などなど!
pypdf をインストールするには、コマンド ラインから次のコマンドを実行します。
pip install pypdfこのモジュール名では大文字と小文字が区別されるため、 そして は小文字で、それ以外はすべて大文字です。このチュートリアル/記事で使用されているすべてのコードと PDF ファイルは利用可能です ここ 。
1. PDFファイルからテキストを抽出する
Python# importing required classes from pypdf import PdfReader # creating a pdf reader object reader = PdfReader ( 'example.pdf' ) # printing number of pages in pdf file print ( len ( reader . pages )) # creating a page object page = reader . pages [ 0 ] # extracting text from page print ( page . extract_text ())上記のプログラムの出力は次のようになります。
20
PythonBasics
S.R.Doty
August272008
Contents
1Preliminaries
4
1.1WhatisPython?...................................
..4
1.2Installationanddocumentation....................
.........4 [and some more lines...]
上記のコードをいくつかの部分に分けて理解してみましょう。
reader = PdfReader('example.pdf')
- ここでオブジェクトを作成します PDFリーダー pypdf モジュールのクラスを開き、PDF ファイルへのパスを渡し、PDF リーダー オブジェクトを取得します。
print(len(reader.pages))
- ページ プロパティは PDF ファイルのページ数を示します。たとえば、この場合は 20 です (出力の最初の行を参照)。
pageObj = reader.pages[0]
- 次に、次のオブジェクトを作成します。 ページオブジェクト pypdf モジュールのクラス。 PDFリーダーオブジェクトには機能があります ページ[] これはページ番号 (インデックス 0 から始まる) を引数として受け取り、ページ オブジェクトを返します。
print(pageObj.extract_text())
- ページオブジェクトには機能があります 抽出テキスト() PDF ページからテキストを抽出します。
注記: PDF ファイルは、印刷して読みやすい方法でテキストをレイアウトするのに最適ですが、ソフトウェアがプレーンテキストに解析するのは簡単ではありません。そのため、pypdf は PDF からテキストを抽出するときに間違いを犯す可能性があり、一部の PDF をまったく開けない場合もあります。残念ながら、これに関してできることはあまりありません。 pypdf は、特定の PDF ファイルの一部を単に処理できない可能性があります。
2. PDF ページの回転
# importing the required classes from pypdf import PdfReader PdfWriter def PDFrotate ( origFileName newFileName rotation ): # creating a pdf Reader object reader = PdfReader ( origFileName ) # creating a pdf writer object for new pdf writer = PdfWriter () # rotating each page for page in range ( len ( reader . pages )): pageObj = reader . pages [ page ] pageObj . rotate ( rotation ) # Add the rotated page object to the PDF writer writer . add_page ( pageObj ) # Write the rotated pages to the new PDF file with open ( newFileName 'wb' ) as newFile : writer . write ( newFile ) def main (): # original pdf file name origFileName = 'example.pdf' # new pdf file name newFileName = 'rotated_example.pdf' # rotation angle rotation = 270 # calling the PDFrotate function PDFrotate ( origFileName newFileName rotation ) if __name__ == '__main__' : # calling the main function main ()
ここでは、最初のページがどのように表示されるかを確認できます。 回転_例.pdf 回転後は (右の画像) のようになります。
上記のコードに関連する重要な点は次のとおりです。
- 回転するには、まず元の PDF の PDF リーダー オブジェクトを作成します。
writer = PdfWriter()
- 回転されたページは新しい PDF に書き込まれます。 PDF への書き込みには、次のオブジェクトを使用します。 PDFライター pypdf モジュールのクラス。
for page in range(len(pdfReader.pages)):
pageObj = pdfReader.pages[page]
pageObj.rotate(rotation)
writer.add_page(pageObj)
- ここで、元の PDF の各ページを繰り返し処理します。ページオブジェクトを取得するには、 .ページ[] PDFリーダークラスのメソッド。ここでページを回転させます。 回転() ページオブジェクトクラスのメソッド。次に、次を使用して PDF ライター オブジェクトにページを追加します。 追加() PDF ライター クラスのメソッドに、回転されたページ オブジェクトを渡します。
newFile = open(newFileName 'wb')
writer.write(newFile)
newFile.close()
- 次に、PDF ページを新しい PDF ファイルに書き込む必要があります。まず、新しいファイル オブジェクトを開き、次のコマンドを使用して PDF ページをそこに書き込みます。 書く() PDF ライター オブジェクトのメソッド。最後に、元の PDF ファイル オブジェクトと新しいファイル オブジェクトを閉じます。
3. PDF ファイルの結合
Python # importing required modules from pypdf import PdfWriter def PDFmerge ( pdfs output ): # creating pdf file writer object pdfWriter = PdfWriter () # appending pdfs one by one for pdf in pdfs : pdfWriter . append ( pdf ) # writing combined pdf to output pdf file with open ( output 'wb' ) as f : pdfWriter . write ( f ) def main (): # pdf files to merge pdfs = [ 'example.pdf' 'rotated_example.pdf' ] # output pdf file name output = 'combined_example.pdf' # calling pdf merge function PDFmerge ( pdfs = pdfs output = output ) if __name__ == '__main__' : # calling the main function main ()
上記のプログラムの出力は結合された PDF です。 結合例.pdf 結合して得られる 例.pdf そして 回転_例.pdf 。
- このプログラムの重要な側面を見てみましょう。
pdfWriter = PdfWriter() - マージには事前に構築されたクラスを使用します PDFライター pypdfモジュールの。
ここでオブジェクトを作成します PDFライター PDFライタークラスの
# appending pdfs one by one
for pdf in pdfs:
pdfWriter.append(pdf)
- 次に、各 PDF のファイル オブジェクトを PDF ライター オブジェクトに追加します。 追加() 方法。
# writing combined pdf to output pdf file
with open(output 'wb') as f:
pdfWriter.write(f)
- 最後に、次を使用して PDF ページを出力 PDF ファイルに書き込みます。 書く PDF ライター オブジェクトのメソッド。
4. PDFファイルの分割
Python # importing the required modules from pypdf import PdfReader PdfWriter def PDFsplit ( pdf splits ): # creating pdf reader object reader = PdfReader ( pdf ) # starting index of first slice start = 0 # starting index of last slice end = splits [ 0 ] for i in range ( len ( splits ) + 1 ): # creating pdf writer object for (i+1)th split writer = PdfWriter () # output pdf file name outputpdf = pdf . split ( '.pdf' )[ 0 ] + str ( i ) + '.pdf' # adding pages to pdf writer object for page in range ( start end ): writer . add_page ( reader . pages [ page ]) # writing split pdf pages to pdf file with open ( outputpdf 'wb' ) as f : writer . write ( f ) # interchanging page split start position for next split start = end try : # setting split end position for next split end = splits [ i + 1 ] except IndexError : # setting split end position for last split end = len ( reader . pages ) def main (): # pdf file to split pdf = 'example.pdf' # split page positions splits = [ 2 4 ] # calling PDFsplit function to split pdf PDFsplit ( pdf splits ) if __name__ == '__main__' : # calling the main function main ()
出力は 3 つの新しい PDF ファイルになります。 スプリット 1 (ページ 01) スプリット 2(ページ 23) スプリット 3(ページ 4 ~末尾) 。
上記の Python プログラムでは、新しい関数やクラスは使用されていません。単純なロジックと反復を使用して、渡されたリストに従って渡された PDF の分割を作成しました。 分割 。
5. PDF ページにウォーターマークを追加する
Python # importing the required modules from pypdf import PdfReader PdfWriter def add_watermark ( wmFile pageObj ): # creating pdf reader object of watermark pdf file reader = PdfReader ( wmFile ) # merging watermark pdf's first page with passed page object. pageObj . merge_page ( reader . pages [ 0 ]) # returning watermarked page object return pageObj def main (): # watermark pdf file name mywatermark = 'watermark.pdf' # original pdf file name origFileName = 'example.pdf' # new pdf file name newFileName = 'watermarked_example.pdf' # creating pdf File object of original pdf pdfFileObj = open ( origFileName 'rb' ) # creating a pdf Reader object reader = PdfReader ( pdfFileObj ) # creating a pdf writer object for new pdf writer = PdfWriter () # adding watermark to each page for page in range ( len ( reader . pages )): # creating watermarked page object wmpageObj = add_watermark ( mywatermark reader . pages [ page ]) # adding watermarked page object to pdf writer writer . add_page ( wmpageObj ) # writing watermarked pages to new file with open ( newFileName 'wb' ) as newFile : writer . write ( newFile ) # closing the original pdf file object pdfFileObj . close () if __name__ == '__main__' : # calling the main function main ()
オリジナルの PDF ファイル (左) と透かし入りの PDF ファイル (右) の最初のページは次のようになります。
- すべてのプロセスはページ回転の例と同じです。唯一の違いは次のとおりです。
wmpageObj = add_watermark(mywatermark pdfReader.pages[page])
- ページ オブジェクトは、次を使用して透かし入りのページ オブジェクトに変換されます。 add_watermark() 関数。
- 理解してみましょう add_watermark() 関数:
reader = PdfReader(wmFile)
pageObj.merge_page(reader.pages[0])
return pageObj
- まず、PDF リーダー オブジェクトを作成します。 透かし.pdf 。渡されたページオブジェクトに使用します マージページ() 関数を使用して、ウォーターマーク PDF リーダー オブジェクトの最初のページのページ オブジェクトを渡します。これにより、渡されたページ オブジェクトに透かしが重ねられます。
そしてここで、Python で PDF ファイルを操作するためのこの長いチュートリアルが終わります。
独自の PDF マネージャーを簡単に作成できるようになりました。
参考文献:
- https://automatetheboringstuff.com/chapter13/
- https://pypi.org/project/pypdf/
GeeksforGeeks が好きで貢献したい場合は、write.geeksforgeeks.org を使用して記事を書くか、記事を [email protected] にメールで送信することもできます。 GeeksforGeeks のメイン ページにあなたの記事が掲載されているのを見て、他のオタクを助けてください。
間違った点を見つけた場合、または上記のトピックについてさらに詳しい情報を共有したい場合は、コメントを書いてください。