2009-07-24 53 views
60

Tôi cần thêm một số văn bản bổ sung vào tệp PDF hiện có bằng Python, cách tốt nhất để thực hiện điều này là gì và tôi cần cài đặt thêm mô-đun nào.Thêm văn bản vào PDF hiện có bằng cách sử dụng Python

Lưu ý: Lý tưởng nhất là tôi muốn có thể chạy trên cả Windows và Linux, nhưng chỉ với một cú đẩy, Linux sẽ thực hiện.

Xin cảm ơn trước.
Richard.

Chỉnh sửa: pyPDF và ReportLab có vẻ tốt nhưng không ai cho phép tôi chỉnh sửa tệp PDF hiện có, có bất kỳ tùy chọn nào khác không?

Trả lời

63

Tôi biết đây là một bài cũ, nhưng tôi đã trải qua một thời gian dài cố gắng tìm một giải pháp. Tôi đã xem qua một phong nha chỉ sử dụng ReportLab và PyPDF vì vậy tôi nghĩ rằng tôi muốn chia sẻ:

  1. đọc PDF bằng PdfFileReader(), chúng ta sẽ gọi đầu vào này
  2. tạo pdf mới chứa của bạn văn bản để thêm bằng ReportLab, lưu này như một đối tượng chuỗi
  3. đọc đối tượng chuỗi sử dụng PdfFileReader(), chúng tôi sẽ gọi cho văn bản này
  4. tạo ra một đối tượng mới sử dụng PDF PdfFileWriter(), chúng tôi sẽ gọi đây đầu ra
  5. lặp qua đầu vào và áp dụng .mergePage (văn bản .getPage (0)) cho mỗi trang web mà bạn muốn các văn bản bổ sung vào, sau đó sử dụng đầu ra .addPage() để thêm các trang sửa đổi để một tài liệu mới

Điều này hoạt động tốt để bổ sung văn bản đơn giản. Xem mẫu của PyPDF để đóng dấu một tài liệu.

Dưới đây là một số mã để trả lời các câu hỏi dưới đây:

packet = StringIO.StringIO() 
can = canvas.Canvas(packet, pagesize=letter) 
<do something with canvas> 
can.save() 
packet.seek(0) 
input = PdfFileReader(packet) 

Từ đây bạn có thể kết hợp các trang của tập tin đầu vào với tài liệu khác

+1

"tạo pdf mới chứa văn bản của bạn để thêm bằng ReportLab, lưu đối tượng này làm đối tượng chuỗi" Bạn làm như thế nào? Ví dụ canvas của nó. –

+1

Tôi đã thêm một số mã mẫu ở trên để trả lời câu hỏi của Lakshman. – dwelch

+1

Câu trả lời này là vàng - hoạt động như một sự quyến rũ. –

0

Bạn có thể may mắn hơn khi giải quyết vấn đề thành chuyển đổi PDF thành định dạng có thể chỉnh sửa, viết các thay đổi của bạn, sau đó chuyển đổi lại thành PDF. Tôi không biết một thư viện cho phép bạn chỉnh sửa PDF trực tiếp nhưng có rất nhiều trình chuyển đổi giữa DOC và PDF chẳng hạn.

+1

Vấn đề là tôi chỉ có nguồn gốc trong PDF (từ một bên thứ 3) và PDF -> DOC -> PDF sẽ mất rất nhiều trong chuyển đổi. Ngoài ra tôi cần điều này để chạy trên Linux vì vậy DOC có thể không phải là sự lựa chọn tốt nhất. – Frozenskys

+0

Tôi tin rằng Adobe giữ khả năng chỉnh sửa PDF khá kín và độc quyền để họ có thể bán giấy phép cho các phiên bản Acrobat tốt hơn của họ. Có lẽ bạn có thể tìm cách tự động hóa việc sử dụng Acrobat Pro để chỉnh sửa nó, sử dụng một số loại giao diện macro. – aehlke

+0

Nếu các phần bạn muốn viết là các trường biểu mẫu, có các giao diện XML để chỉnh sửa chúng - nếu không tôi không thể tìm thấy bất kỳ thứ gì. – aehlke

-2

Bạn đã thử pyPdf chưa?

Rất tiếc, nó không có khả năng sửa đổi nội dung của trang.

+0

Có vẻ như điều đó có thể hiệu quả, có ai đã sử dụng nó không? Việc sử dụng bộ nhớ như thế nào? – Frozenskys

+0

Nó có khả năng thêm một watermark văn bản và nếu nó đã được định dạng đúng cách nó có thể làm việc. – Frozenskys

1

Nếu bạn đang ở trên Windows, điều này có thể làm việc:

PDF Creator Pilot

Ngoài ra còn có một sách trắng của một tạo PDF và khung chỉnh sửa trong Python. Đó là một ít ngày, nhưng có lẽ có thể cung cấp cho bạn một số thông tin hữu ích:

Using Python as PDF Editing and Processing Framework

+0

Giấy trắng có vẻ tốt nhưng có chút sáng trên mã và tôi không thực sự có tài nguyên để triển khai toàn bộ khuôn khổ PDF! ;) – Frozenskys

68

Đây là một câu trả lời hoàn chỉnh mà tôi tìm thấy ở những nơi khác [Python 2.7]:

from pyPdf import PdfFileWriter, PdfFileReader 
import StringIO 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 

packet = StringIO.StringIO() 
# create a new PDF with Reportlab 
can = canvas.Canvas(packet, pagesize=letter) 
can.drawString(10, 100, "Hello world") 
can.save() 

#move to the beginning of the StringIO buffer 
packet.seek(0) 
new_pdf = PdfFileReader(packet) 
# read your existing PDF 
existing_pdf = PdfFileReader(file("original.pdf", "rb")) 
output = PdfFileWriter() 
# add the "watermark" (which is the new pdf) on the existing page 
page = existing_pdf.getPage(0) 
page.mergePage(new_pdf.getPage(0)) 
output.addPage(page) 
# finally, write "output" to a real file 
outputStream = file("destination.pdf", "wb") 
output.write(outputStream) 
outputStream.close() 

Và đây là một bản cập nhật cho Python 3.x:


from PyPDF2 import PdfFileWriter, PdfFileReader 
import io 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 

packet = io.BytesIO() 
# create a new PDF with Reportlab 
can = canvas.Canvas(packet, pagesize=letter) 
can.drawString(10, 100, "Hello world") 
can.save() 

#move to the beginning of the StringIO buffer 
packet.seek(0) 
new_pdf = PdfFileReader(packet) 
# read your existing PDF 
existing_pdf = PdfFileReader(open("original.pdf", "rb")) 
output = PdfFileWriter() 
# add the "watermark" (which is the new pdf) on the existing page 
page = existing_pdf.getPage(0) 
page.mergePage(new_pdf.getPage(0)) 
output.addPage(page) 
# finally, write "output" to a real file 
outputStream = open("destination.pdf", "wb") 
output.write(outputStream) 
outputStream.close() 
+8

Đối với python3, gói phải là 'io.BytesIO' và sử dụng PyPDF2 thay vì pyPDF (không được duy trì). Câu trả lời chính xác! –

+3

Cảm ơn bạn đã chia sẻ. Nó hoạt động tuyệt vời. Một lưu ý: Tôi tin rằng tốt hơn nên sử dụng 'mở' thay vì' tệp'. – mitenka

+0

Tôi tin rằng đây là câu trả lời được chấp nhận nhiều hơn, đặc biệt là khi nó bao gồm một ví dụ làm việc. – Casey

2

cpdf sẽ làm công việc từ dòng lệnh. Nó không phải là trăn, mặc dù (afaik):

cpdf -add-text "Line of text" input.pdf -o output .pdf 
3

pdfrw sẽ cho phép bạn đọc trong các trang từ một PDF hiện có và thu hút chúng vào một canvas ReportLab (tương tự như vẽ một hình ảnh). Có các ví dụ về điều này trong pdfrw examples/rl1 thư mục con trên github. Disclaimer: Tôi là tác giả pdfrw.

+0

Tôi nghĩ bạn có thể đặt một liên kết ở đó – The6thSense

+0

Điểm tốt! Tôi đã không làm nhiều thứ SO khi tôi đăng bài đó và lo lắng về "chính sách liên kết văn bản tối thiểu cộng". (Đại diện của tôi chỉ 46 tuổi vào lúc đó, và IIRC tôi vừa nhận được một câu trả lời -2, vì vậy tôi hơi lo lắng về câu trả lời mới cho câu hỏi 5 năm tuổi :) –

+0

câu hỏi cũ được xem nhiều hơn :) và chú ý – The6thSense

3

Tận dụng David Dehghan 's answer trên, các tác phẩm sau đây trong Python 2.7.13:

from PyPDF2 import PdfFileWriter, PdfFileReader, PdfFileMerger 

import StringIO 

from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 

packet = StringIO.StringIO() 
# create a new PDF with Reportlab 
can = canvas.Canvas(packet, pagesize=letter) 
can.drawString(290, 720, "Hello world") 
can.save() 

#move to the beginning of the StringIO buffer 
packet.seek(0) 
new_pdf = PdfFileReader(packet) 
# read your existing PDF 
existing_pdf = PdfFileReader("original.pdf") 
output = PdfFileWriter() 
# add the "watermark" (which is the new pdf) on the existing page 
page = existing_pdf.getPage(0) 
page.mergePage(new_pdf.getPage(0)) 
output.addPage(page) 
# finally, write "output" to a real file 
outputStream = open("destination.pdf", "wb") 
output.write(outputStream) 
outputStream.close() 
Các vấn đề liên quan