Làm việc với các tệp PDF bằng Python

0
2284

Tất cả các bạn phải quen thuộc với PDF là gì. Trên thực tế, chúng là một trong những phương tiện kỹ thuật số quan trọng nhất và được sử dụng rộng rãi. PDF là viết tắt của Định dạng Tài liệu Di động . Nó sử dụng phần mở rộng .pdf . Nó được sử dụng để trình bày và trao đổi tài liệu một cách đáng tin cậy, không phụ thuộc vào phần mềm, phần cứng hoặc hệ điều hành.

Được phát minh bởi Adobe , PDF hiện là một tiêu chuẩn mở được duy trì bởi Tổ chức Tiêu chuẩn hoá Quốc tế (ISO). Các tệp PDF có thể chứa các liên kết và nút, trường biểu mẫu, âm thanh, video và logic nghiệp vụ.

Trong bài viết này, chúng ta sẽ tìm hiểu, cách chúng ta có thể thực hiện các thao tác khác nhau như:

  • Trích xuất văn bản từ PDF
  • Xoay các trang PDF
  • Hợp nhất các tệp PDF
  • Tách PDF
  • Thêm hình mờ vào các trang PDF

bằng cách sử dụng các tập lệnh python đơn giản!

Cài đặt

Chúng tôi sẽ sử dụng mô-đun của bên thứ ba, PyPDF2.

PyPDF2 là một thư viện python được xây dựng dưới dạng bộ công cụ PDF. Nó có khả năng:

  • Trích xuất thông tin tài liệu (tiêu đề, tác giả,…)
  • Tách từng trang tài liệu
  • Hợp nhất tài liệu từng trang
  • Cắt trang
  • Hợp nhất nhiều trang thành một trang duy nhất
  • Mã hóa và giải mã các tệp PDF
  • và hơn thế nữa!

Để cài đặt PyPDF2, hãy chạy lệnh sau từ dòng lệnh:

pip install PyPDF2

1. Trích xuất văn bản từ tệp PDF

                # importing required modules 


                import 
                PyPDF2 





                # creating a pdf file object 


                pdfFileObj 
                = 
                open
                (
                'example.pdf'
                , 
                'rb'
                ) 





                # creating a pdf reader object 


                pdfReader 
                = 
                PyPDF2.PdfFileReader(pdfFileObj) 





                # printing number of pages in pdf file 


                print
                (pdfReader.numPages) 





                # creating a page object 


                pageObj 
                = 
                pdfReader.getPage(
                0
                ) 





                # extracting text from page 


                print
                (pageObj.extractText()) 





                # closing the pdf file object 


                pdfFileObj.close() 

Kết quả của chương trình trên có dạng như sau:

20 
PythonBasics
SRDoty
27 tháng 8, 2008
Nội dung
1
4
1.1WhatisPython? ................................... ..
4
1.2 Cài đặt và tài liệu ... .........
4 [và một số dòng khác ...]

Hãy để chúng tôi cố gắng hiểu đoạn mã trên theo từng phần:

  • pdfFileObj = open (‘example.pdf’, ‘rb’) Chúng tôi đã mở example.pdf ở chế độ nhị phân. và lưu đối tượng tệp dưới dạng pdfFileObj .
  • pdfReader = PyPDF2.PdfFileReader (pdfFileObj) Ở đây, chúng ta tạo một đối tượng thuộc lớp PdfFileReader của mô-đun PyPDF2 và truyền đối tượng tệp pdf & lấy đối tượng trình đọc pdf.
  • in (pdfReader.numPages) Thuộc tính numPages cung cấp số lượng trang trong tệp pdf. Ví dụ, trong trường hợp của chúng tôi, nó là 20 (xem dòng đầu tiên của đầu ra).
  • pageObj = pdfReader.getPage (0) Bây giờ, chúng ta tạo một đối tượng của PageObject lớp module PyPDF2. Đối tượng trình đọc pdf có hàm getPage () lấy số trang (bắt đầu từ chỉ mục 0) làm đối số và trả về đối tượng trang.
  • print (pageObj.extractText ()) Đối tượng trang có hàm extractText () để trích xuất văn bản từ trang pdf.
  • pdfFileObj.close () Cuối cùng, chúng tôi đóng đối tượng tệp pdf.

Lưu ý: Mặc dù các tệp PDF rất tuyệt vời để sắp xếp văn bản theo cách dễ dàng cho mọi người in và đọc, chúng không đơn giản để phần mềm phân tích cú pháp thành văn bản rõ. Do đó, PyPDF2 có thể mắc lỗi khi trích xuất văn bản từ PDF và thậm chí có thể không mở được một số tệp PDF. Thật không may, bạn không thể làm gì nhiều về điều này. PyPDF2 có thể đơn giản là không thể hoạt động với một số tệp PDF cụ thể của bạn. tuyển sinh cao đẳng dược

2. Xoay các trang PDF

                # importing the required modules 


                import 
                PyPDF2 





                def 
                PDFrotate(origFileName, newFileName, rotation): 






                # creating a pdf File object of original pdf 



                pdfFileObj 
                = 
                open
                (origFileName, 
                'rb'
                ) 






                # creating a pdf Reader object 



                pdfReader 
                = 
                PyPDF2.PdfFileReader(pdfFileObj) 






                # creating a pdf writer object for new pdf 



                pdfWriter 
                = 
                PyPDF2.PdfFileWriter() 






                # rotating each page 



                for 
                page 
                in 
                range
                (pdfReader.numPages): 






                # creating rotated page object 



                pageObj 
                = 
                pdfReader.getPage(page) 



                pageObj.rotateClockwise(rotation) 






                # adding rotated page object to pdf writer 



                pdfWriter.addPage(pageObj) 






                # new pdf file object 



                newFile 
                = 
                open
                (newFileName, 
                'wb'
                ) 






                # writing rotated pages to new file 



                pdfWriter.write(newFile) 






                # closing the original pdf file object 



                pdfFileObj.close() 






                # closing the new pdf file object 



                newFile.close() 








                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() 

Tại đây, bạn có thể thấy trang đầu tiên của rotated_example.pdf trông như thế nào (hình ảnh bên phải) sau khi xoay:

Một số điểm quan trọng liên quan đến mã trên:

  • Để xoay, trước tiên chúng ta tạo đối tượng trình đọc pdf của pdf gốc.
  • pdfWriter = PyPDF2.PdfFileWriter () Các trang được xoay sẽ được ghi sang một pdf mới. Đối với văn bản cho file PDF, chúng tôi sử dụng đối tượng của PdfFileWriter lớp module PyPDF2.
  • cho trang trong phạm vi (pdfReader.numPages): pageObj = pdfReader.getPage (trang) pageObj.rotateClockwise (xoay) pdfWriter.addPage (pageObj) Bây giờ, chúng tôi lặp lại từng trang của pdf gốc. Chúng ta lấy đối tượng trang bằng phương thức getPage () của lớp trình đọc pdf. Bây giờ, chúng ta xoay trang bằng phương thức xoayClockwise () của lớp đối tượng trang. Sau đó, chúng ta thêm trang vào đối tượng người viết pdf bằng cách sử dụng phương thức addPage () của lớp người viết pdf bằng cách chuyển đối tượng trang đã xoay.
  • newFile = open (newFileName, ‘wb’) pdfWriter.write (newFile) pdfFileObj.close () newFile.close () Bây giờ, chúng ta phải ghi các trang pdf sang một tệp pdf mới. Đầu tiên chúng ta mở đối tượng tệp mới và ghi các trang pdf vào nó bằng phương thức write () của đối tượng pdf writer. Cuối cùng, chúng tôi đóng đối tượng tệp pdf ban đầu và đối tượng tệp mới.

Một số điểm quan trọng liên quan đến mã trên:

  • Để xoay, trước tiên chúng ta tạo đối tượng trình đọc pdf của pdf gốc.
  • pdfWriter = PyPDF2.PdfFileWriter () Các trang được xoay sẽ được ghi sang một pdf mới. Đối với văn bản cho file PDF, chúng tôi sử dụng đối tượng của PdfFileWriter lớp module PyPDF2.
  • cho trang trong phạm vi (pdfReader.numPages): pageObj = pdfReader.getPage (trang) pageObj.rotateClockwise (xoay) pdfWriter.addPage (pageObj) Bây giờ, chúng tôi lặp lại từng trang của pdf gốc. Chúng ta lấy đối tượng trang bằng phương thức getPage () của lớp trình đọc pdf. Bây giờ, chúng ta xoay trang bằng phương thức xoayClockwise () của lớp đối tượng trang. Sau đó, chúng ta thêm trang vào đối tượng người viết pdf bằng cách sử dụng phương thức addPage () của lớp người viết pdf bằng cách chuyển đối tượng trang đã xoay.
  • newFile = open (newFileName, ‘wb’) pdfWriter.write (newFile) pdfFileObj.close () newFile.close () Bây giờ, chúng ta phải ghi các trang pdf sang một tệp pdf mới. Đầu tiên chúng ta mở đối tượng tệp mới và ghi các trang pdf vào nó bằng phương thức write () của đối tượng pdf writer. Cuối cùng, chúng tôi đóng đối tượng tệp pdf ban đầu và đối tượng tệp mới.

3. Hợp nhất các tệp PDF

                # importing required modules 


                import 
                PyPDF2 





                def 
                PDFmerge(pdfs, output): 



                # creating pdf file merger object 



                pdfMerger 
                = 
                PyPDF2.PdfFileMerger() 






                # appending pdfs one by one 



                for 
                pdf 
                in 
                pdfs: 



                with 
                open
                (pdf, 
                'rb'
                ) as f: 



                pdfMerger.append(f) 






                # writing combined pdf to output pdf file 



                with 
                open
                (output, 
                'wb'
                ) as f: 



                pdfMerger.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() 

Đầu ra của chương trình trên là một pdf kết hợp , merge_example.pdf thu được bằng cách hợp nhất example.pdfrotated_example.pdf .

Hãy để chúng tôi xem xét các khía cạnh quan trọng của chương trình này:

  • pdfMerger = PyPDF2.PdfFileMerger () Để hợp nhất, chúng tôi sử dụng một lớp được tạo sẵn, PdfFileMerger của mô-đun PyPDF2.
    Ở đây, chúng tôi tạo một đối tượng pdfMerger của lớp hợp nhất pdf
  • cho pdf trong pdf: với open (pdf, ‘rb’) là f: pdfMerger.append (f) Bây giờ, chúng tôi nối đối tượng tệp của mỗi đối tượng hợp nhất pdf sang pdf bằng cách sử dụng phương thức append () .
  • với mở (đầu ra, ‘wb’) là f: pdfMerger.write (f) Cuối cùng, chúng tôi ghi các trang pdf vào tệp pdf đầu ra bằng cách sử dụng phương pháp ghi của đối tượng hợp nhất pdf.

4. Tách tệp PDF

                # importing the required modules 


                import 
                PyPDF2 





                def 
                PDFsplit(pdf, splits): 



                # creating input pdf file object 



                pdfFileObj 
                = 
                open
                (pdf, 
                'rb'
                ) 






                # creating pdf reader object 



                pdfReader 
                = 
                PyPDF2.PdfFileReader(pdfFileObj) 






                # 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 



                pdfWriter 
                = 
                PyPDF2.PdfFileWriter() 






                # output pdf file name 



                outputpdf 
                = 
                pdf.split(
                '.pdf'
                )[
                0
                ] 
                + 
                str
                (i) 
                + 
                '.pdf'






                # adding pages to pdf writer object 



                for 
                page 
                in 
                range
                (start,end): 



                pdfWriter.addPage(pdfReader.getPage(page)) 






                # writing split pdf pages to pdf file 



                with 
                open
                (outputpdf, 
                "wb"
                ) as f: 



                pdfWriter.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 
                = 
                pdfReader.numPages 






                # closing the input pdf file object 



                pdfFileObj.close() 





                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() 

Đầu ra sẽ là ba tệp PDF mới với phần chia 1 (trang 0,1), phần chia 2 (trang 2,3), phần chia 3 (trang 4-cuối) .

Không có hàm hoặc lớp mới nào được sử dụng trong chương trình python ở trên. Sử dụng logic và lặp lại đơn giản, chúng tôi đã tạo các phần tách của pdf đã chuyển theo các phần tách danh sách đã chuyển .

5. Thêm hình mờ vào các trang PDF

                # importing the required modules 


                import 
                PyPDF2 





                def 
                add_watermark(wmFile, pageObj): 



                # opening watermark pdf file 



                wmFileObj 
                = 
                open
                (wmFile, 
                'rb'
                ) 






                # creating pdf reader object of watermark pdf file 



                pdfReader 
                = 
                PyPDF2.PdfFileReader(wmFileObj) 






                # merging watermark pdf's first page with passed page object. 



                pageObj.mergePage(pdfReader.getPage(
                0
                )) 






                # closing the watermark pdf file object 



                wmFileObj.close() 






                # 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 



                pdfReader 
                = 
                PyPDF2.PdfFileReader(pdfFileObj) 






                # creating a pdf writer object for new pdf 



                pdfWriter 
                = 
                PyPDF2.PdfFileWriter() 






                # adding watermark to each page 



                for 
                page 
                in 
                range
                (pdfReader.numPages): 



                # creating watermarked page object 



                wmpageObj 
                = 
                add_watermark(mywatermark, pdfReader.getPage(page)) 






                # adding watermarked page object to pdf writer 



                pdfWriter.addPage(wmpageObj) 






                # new pdf file object 



                newFile 
                = 
                open
                (newFileName, 
                'wb'
                ) 






                # writing watermarked pages to new file 



                pdfWriter.write(newFile) 






                # closing the original pdf file object 



                pdfFileObj.close() 



                # closing the new pdf file object 



                newFile.close() 





                if 
                __name__ 
                =
                = 
                "__main__"
                : 



                # calling the main function 



                main() 

Khóa học PYTHON (IPD2020) cho người mới bắt đầu