著者| Chen Xi
ソース|初期のPython
序文
この記事は主に以下を含みます:
OSモジュールの包括的なアプリケーション
globモジュールの包括的なアプリケーション
PyPDF2モジュールの操作
基本的な操作
多くの場合、PyPDF2インポートモジュールのコードは次のとおりです。
from PyPDF2 import PdfFileReader, PdfFileWriter
2つのメソッドがここにインポートされます。
PdfFileReaderはリーダーとして理解できます
PdfFileWriterはライターとして理解できます
次に、これらの2つのツールの不思議をいくつかのケースを通してさらに理解します。使用されるサンプルファイルは、5つの請求書のPDFです。
各請求書のPDFは、2つのページで構成されています。
マージ
最初の仕事は、5つの請求書PDFを10ページにマージすることです。ここで、読者と作家はどのように連携すべきですか?
ロジックは次のとおりです。
リーダーはすべてのPDFを1回読み取ります
リーダーは、読み取ったコンテンツをライターに渡します。
ライターが出力を新しいPDFに統合
ここで重要な知識のポイントもあります。リーダーは、読み取ったコンテンツをページごとにライターに配信することしかできません。
したがって、ロジックの最初と2番目のステップは実際には独立したステップではありませんが、リーダーがPDFを読んだ後、PDFのすべてのページをループし、ページごとにライターに渡します。最後に、すべての読み取り作業が完了するまで待ってから出力します。
コードを見ると、アイデアがより明確になります。
from PyPDF2 import PdfFileReader, PdfFileWriterpath = r'C:\Users\xxxxxx'pdf_writer = PdfFileWriter()for i in range(1, 6): pdf_reader = PdfFileReader(path + '/INV{}.pdf'.format(i))for page in range(pdf_reader.getNumPages()): pdf_writer.addPage(pdf_reader.getPage(page))with open(path + r'\合并PDF\merge.pdf', 'wb') as out: pdf_writer.write(out)
すべてのコンテンツは最終出力のために同じライターに配信される必要があるため、ライターの初期化はループ本体の外で行う必要があります。
ループボディ内にある場合、pdfを読み取るためのアクセスごとに新しいライターになるため、ライターに渡された各リーダーのコンテンツは繰り返し上書きされ、マージ要件を達成できません。
ループ本体の先頭のコード:
for i in range(1, 6): pdf_reader = PdfFileReader(path + '/INV{}.pdf'.format(i))
目的は、各サイクルで新しいPDFファイルを読み取り、後続の操作のためにリーダーにそれを渡すことです。実際、各PDF名はたまたま規則的であるため、この書き込み方法はあまりお勧めできません。循環させる数値を直接手動で指定できます。より良い方法は、globモジュールを使用することです:
import globfor file in glob.glob(path + '/*.pdf'): pdf_reader = PdfFileReader(path)
コードでは、pdf_reader.getNumPages():リーダーのページ数を取得でき、範囲内のリーダーのすべてのページをトラバースできます。
pdf_writer.addPage(pdf_reader.getPage(page))は、現在のページをライターに渡すことができます。
最後に、withを使用して新しいPDFを作成し、ライターのpdf_writer.write(out)メソッドで出力します。
スプリット
マージ操作でのリーダーとライターの連携を理解していれば、分割は簡単に理解できます。ここでは、分割されたINV1.pdfを2つの個別のPDFドキュメントに例として取り上げ、ストロークから始めます。論理:
PDF文書を読むためのリーダー
リーダーがページごとにライターに引き渡された
ライターはページを取得するたびに即座に出力します
このコードロジックを通じて、ライターの初期化と出力の位置は、PDFループの各ページを読み取るループ本体内にある必要があり、ループの外ではないことも理解できます。
コードは簡単です:
from PyPDF2 import PdfFileReader, PdfFileWriterpath = r'C:\Users\xxx'pdf_reader = PdfFileReader(path + '\INV1.pdf')for page in range(pdf_reader.getNumPages()):# 遍历到每一页挨个生成写入器 pdf_writer = PdfFileWriter() pdf_writer.addPage(pdf_reader.getPage(page))# 写入器被添加一页后立即输出产生pdfwith open(path + '\INV1-{}.pdf'.format(page + 1), 'wb') as out: pdf_writer.write(out)
透かし
この作業は、次の画像を透かしとしてINV1.pdfに追加することです。
一つ目は準備作業で、透かしにしたい画像をWordに挿入し、適切な位置に調整してPDFファイルとして保存します。次に、コードをコーディングし、コピーモジュールを追加で使用する必要があります。具体的な説明を下の図に示します。
リーダーとライターを初期化し、最初に透かしPDFページを読み取ってバックアップします。コアコードを理解するのは少し難しいです。
透かし入れは、透かし入れされたPDFページを、透かし入れが必要なすべてのページとマージすることです。
透かしを入れる必要のあるPDFには多くのページがあり、透かしを入れたPDFは1ページしかないので、透かしを入れたPDFを直接マージすると、最初のページが追加され、透かしを入れたPDFページがなくなるため、抽象的に理解できます。
したがって、直接マージすることはできません。代わりに、透かしを入れたPDFページを新しいページスタンバイnew_pageに継続的にコピーし、.mergePageメソッドを使用して各ページとのマージを完了し、マージされたページを最終的な統合出力のためにライターに渡す!
.mergePageの使用について:次のページ.mergePage(上部のページに表示されます)に表示される場合、最終的な効果は図のようになります。
暗号化
暗号化は非常に簡単です。「暗号化はライターの暗号化のためのものです」と覚えておいてください。
したがって、関連する操作が完了した後にのみpdf_writer.encrypt(パスワード)を呼び出す必要があります
例として、単一のPDFの暗号化を取り上げます。
もちろん、PDFのマージ、分割、暗号化、透かしに加えて、Pythonを使用してExcelとWordを組み合わせ、より多くの自動化要件を達成することもできます。
更多精彩推荐