เพิ่มข้อความลงใน PDF ที่มีอยู่โดยใช้ Python


108

ฉันต้องการเพิ่มข้อความพิเศษลงใน PDF ที่มีอยู่โดยใช้ Python วิธีที่ดีที่สุดในการดำเนินการนี้คืออะไรและฉันต้องติดตั้งโมดูลเพิ่มเติมใด

หมายเหตุ: ตามหลักการแล้วฉันต้องการให้สามารถเรียกใช้สิ่งนี้ได้ทั้งบน Windows และ Linux แต่ด้วยการกด Linux เท่านั้นที่จะทำได้

แก้ไข: pyPDFและReportLabดูดี แต่ไม่มีใครอนุญาตให้ฉันแก้ไข PDF ที่มีอยู่มีตัวเลือกอื่น ๆ อีกหรือไม่

คำตอบ:


89

ฉันรู้ว่านี่เป็นโพสต์ที่เก่ากว่า แต่ฉันใช้เวลานานในการพยายามหาวิธีแก้ปัญหา ฉันเจอสิ่งที่ดีโดยใช้เพียง ReportLab และ PyPDF ดังนั้นฉันคิดว่าฉันจะแบ่งปัน:

  1. อ่าน PDF ของคุณโดยใช้PdfFileReader()เราจะเรียกข้อมูลนี้ว่า
  2. สร้าง pdf ใหม่ที่มีข้อความของคุณเพื่อเพิ่มโดยใช้ ReportLab บันทึกสิ่งนี้เป็นวัตถุสตริง
  3. อ่านวัตถุสตริงโดยใช้PdfFileReader()เราจะเรียกข้อความนี้
  4. สร้างวัตถุ PDF ใหม่โดยใช้PdfFileWriter()เราจะเรียกผลลัพธ์นี้ว่า
  5. วนซ้ำผ่านการป้อนข้อมูลและใช้.mergePage(*text*.getPage(0))สำหรับแต่ละหน้าที่คุณต้องการเพิ่มข้อความจากนั้นใช้output.addPage()เพื่อเพิ่มหน้าที่แก้ไขลงในเอกสารใหม่

ใช้ได้ดีกับการเพิ่มข้อความธรรมดา ดูตัวอย่างของ PyPDF สำหรับการใส่ลายน้ำในเอกสาร

นี่คือรหัสสำหรับตอบคำถามด้านล่าง:

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

จากที่นี่คุณสามารถรวมหน้าของไฟล์อินพุตกับเอกสารอื่นได้


2
"สร้างไฟล์ PDF ใหม่ที่มีข้อความของคุณเพื่อเพิ่มโดยใช้ ReportLab บันทึกสิ่งนี้เป็นสตริงออบเจ็กต์" คุณทำได้อย่างไร? มันเป็นอินสแตนซ์ผ้าใบ
Lakshman Prasad

1
ฉันได้เพิ่มโค้ดตัวอย่างด้านบนเพื่อตอบคำถามของ Lakshman
dwelch

ฉันแนะนำให้ใช้ PyPDF2 เนื่องจากมีการอัปเดตมากกว่าโปรดตรวจสอบโค้ดตัวอย่างของพวกเขา: github.com/mstamy2/PyPDF2/blob/…
blaze

2
รหัสนี้จะสร้างไฟล์ pdf ใหม่และจะข้ามข้อมูลเมตาทั้งหมด ดังนั้นจึงไม่ต่อท้าย pdf ที่มีอยู่
Anton Kukoba

127

ตัวอย่างสำหรับ [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()

ตัวอย่าง 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()

13
สำหรับ python3 ควรio.BytesIOใช้แพ็คเก็ตและใช้ PyPDF2 มากกว่า pyPDF (ซึ่งไม่ได้รับการดูแล) ตอบโจทย์มาก!
Noufal Ibrahim

4
ขอบคุณสำหรับการแบ่งปัน. มันใช้งานได้ดี หมายเหตุหนึ่ง: ฉันเชื่อว่าดีกว่าที่จะใช้openแทนfile.
mitenka

ฉันเชื่อว่านี่เป็นคำตอบที่ยอมรับได้มากขึ้นโดยเฉพาะอย่างยิ่งเมื่อมีตัวอย่างการทำงาน
Casey

1
ข้อควรระวัง: เอกสารใหม่มีเฉพาะหน้าแรกของต้นฉบับเท่านั้น! ง่ายพอที่จะคัดลอกส่วนที่เหลือของหน้าจากexisting_pdfไปยังoutputโค้ดตัวอย่างก็ไม่ได้
alexis

@alexis: คุณจะแก้ไขโค้ดเพื่อใส่บางสิ่งในหน้าที่สองของ pdf ได้อย่างไร? ฉันมีแบบฟอร์มที่ใช้สองหน้าและฉันติดอยู่ในหน้าแรก ขอบคุณล่วงหน้า.
DavidV

11

pdfrwจะช่วยให้คุณอ่านในหน้าจาก PDF ที่มีอยู่และวาดลงบนผืนผ้าใบรายงาน (คล้ายกับการวาดภาพ) มีตัวอย่างสำหรับสิ่งนี้ในไดเร็กทอรีย่อยpdfrw samples / rl1บน github ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียน pdfrw


ฉันคิดว่าคุณสามารถใส่ลิงก์ที่นั่นได้
The6thSense

จุดดี! ฉันไม่ได้ทำสิ่งต่างๆมากนักเมื่อโพสต์สิ่งนั้นและกังวลเกี่ยวกับ "นโยบายข้อความและลิงก์ขั้นต่ำ" (ตัวแทนของฉันอายุเพียง 46 ในขณะนั้นและ IIRC ฉันเพิ่งได้รับคำตอบ -2 ต่อหนึ่งคำตอบดังนั้นฉันจึงกังวลเล็กน้อยเกี่ยวกับคำตอบใหม่สำหรับคำถามเก่า 5 ปี :)
Patrick Maupin

คำถามเก่ามีมุมมองมากขึ้น :) และความสนใจ
The6thSense

FWIW มีตัวอย่าง reportlab / pdfrw เพิ่มเติมหากคุณเริ่มตามลิงค์นี้ ฉันตอบที่นั่นโดยอาศัยคำตอบในเป้าหมายที่หลอกลวง
Patrick Maupin

7

การใช้ประโยชน์จากคำตอบของDavid Dehghanข้างต้นงานต่อไปนี้ใน 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()


0

คุณอาจโชคดีกว่าที่จะแก้ปัญหานี้ลงในการแปลง PDF เป็นรูปแบบที่แก้ไขได้เขียนการเปลี่ยนแปลงของคุณจากนั้นแปลงกลับเป็น PDF ฉันไม่รู้จักไลบรารีที่ให้คุณแก้ไข PDF ได้โดยตรง แต่มีตัวแปลงระหว่าง DOC และ PDF มากมาย


1
ปัญหาคือฉันมีแหล่งที่มาเป็น PDF เท่านั้น (จากบุคคลที่สาม) และ PDF -> DOC -> PDF จะสูญเสียการแปลงไปมาก นอกจากนี้ฉันต้องการสิ่งนี้เพื่อทำงานบน Linux ดังนั้น DOC อาจไม่ใช่ตัวเลือกที่ดีที่สุด
Frozenskys

ฉันเชื่อว่า Adobe ยังคงความสามารถในการแก้ไข PDF ไว้อย่างดีและเป็นกรรมสิทธิ์เพื่อให้พวกเขาสามารถขายใบอนุญาตสำหรับ Acrobat เวอร์ชันที่ดีกว่าได้ บางทีคุณอาจพบวิธีทำให้การใช้งาน Acrobat Pro เป็นไปโดยอัตโนมัติเพื่อแก้ไขโดยใช้ส่วนต่อประสานมาโครบางประเภท
aehlke

หากส่วนที่คุณต้องการเขียนเป็นฟิลด์แบบฟอร์มจะมีอินเทอร์เฟซ XML สำหรับแก้ไขไม่เช่นนั้นฉันจะไม่พบอะไรเลย
aehlke

ไม่ฉันแค่ต้องการเพิ่มข้อความสองสามบรรทัดในแต่ละหน้า
Frozenskys

0

หากคุณใช้ Windows สิ่งนี้อาจใช้ได้:

นักบินผู้สร้าง PDF

นอกจากนี้ยังมีสมุดปกขาวของการสร้างและแก้ไขไฟล์ PDF ใน Python มันดูเก่าไปหน่อย แต่อาจให้ข้อมูลที่เป็นประโยชน์กับคุณ:

ใช้ Python เป็น PDF Editing and Processing Framework


กระดาษสีขาวดูดี แต่โค้ดค่อนข้างสว่างและฉันไม่มีทรัพยากรที่จะใช้กรอบ PDF ทั้งหมดด้วยตัวเอง! ;)
Frozenskys

-4

คุณลองpyPdf แล้วหรือยัง?

ขออภัยไม่มีความสามารถในการแก้ไขเนื้อหาของเพจ


ดูเหมือนว่าจะได้ผลมีใครใช้บ้าง? การใช้หน่วยความจำเป็นอย่างไร
Frozenskys

มีความสามารถในการเพิ่มลายน้ำข้อความและหากมีการจัดรูปแบบอย่างถูกต้องก็อาจใช้งานได้
Frozenskys
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.