Tambahkan teks ke PDF yang Ada menggunakan Python

107

Saya perlu menambahkan beberapa teks tambahan ke PDF yang sudah ada menggunakan Python, apa cara terbaik untuk melakukannya dan modul tambahan apa yang perlu saya instal.

Catatan: Idealnya saya ingin dapat menjalankan ini pada Windows dan Linux, tetapi dengan dorongan Linux hanya akan melakukannya.

Edit: pyPDF dan ReportLab terlihat bagus tetapi tidak ada yang mengizinkan saya mengedit PDF yang ada, apakah ada pilihan lain?

Frozenskys
sumber

Jawaban:

88

Saya tahu ini adalah posting lama, tetapi saya menghabiskan waktu lama untuk mencoba menemukan solusi. Saya menemukan yang layak hanya menggunakan ReportLab dan PyPDF jadi saya pikir saya akan membagikan:

  1. membaca PDF Anda menggunakan PdfFileReader(), kami akan memanggil masukan ini
  2. buat pdf baru yang berisi teks Anda untuk ditambahkan menggunakan ReportLab, simpan ini sebagai objek string
  3. membaca objek string menggunakan PdfFileReader(), kami akan memanggil teks ini
  4. buat objek PDF baru menggunakan PdfFileWriter(), kami akan memanggil output ini
  5. iterasi melalui input dan terapkan .mergePage(*text*.getPage(0))untuk setiap halaman tempat Anda ingin menambahkan teks, lalu gunakan output.addPage()untuk menambahkan halaman yang dimodifikasi ke dokumen baru

Ini berfungsi dengan baik untuk penambahan teks sederhana. Lihat contoh PyPDF untuk memberi tanda air pada dokumen.

Berikut beberapa kode untuk menjawab pertanyaan di bawah ini:

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

Dari sini Anda dapat menggabungkan halaman file input dengan dokumen lain.

dwelch
sumber
2
"buat pdf baru yang berisi teks Anda untuk ditambahkan menggunakan ReportLab, simpan ini sebagai objek string" Bagaimana Anda melakukannya? Ini adalah contoh kanvas.
Lakshman Prasad
1
Saya telah menambahkan beberapa kode contoh di atas untuk menjawab pertanyaan Lakshman.
dwelch
Saya sarankan menggunakan PyPDF2 karena lebih diperbarui, periksa juga kode sampelnya: github.com/mstamy2/PyPDF2/blob/…
blaze
2
Kode ini akan membuat file pdf baru dan melewatkan semua metadata. Jadi itu tidak menambahkan pdf yang ada.
Anton Kukoba
125

Contoh untuk [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()

Contoh untuk 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()
David Dehghan
sumber
13
Untuk python3, paket harus io.BytesIOdan menggunakan PyPDF2 daripada pyPDF (yang tidak dikelola). Jawaban yang bagus!
Noufal Ibrahim
4
Terima kasih telah berbagi. Ini bekerja dengan baik. Satu catatan: Saya yakin lebih baik digunakan opendaripada file.
mitenka
Saya percaya ini adalah jawaban yang lebih dapat diterima, terutama karena ini menyertakan contoh yang berfungsi.
Casey
1
Hati-hati: Dokumen baru hanya menyertakan halaman pertama dari aslinya! Cukup mudah untuk menyalin sisa halaman dari existing_pdfke output, kode contoh tidak.
alexis
@alexis: Bagaimana Anda memodifikasi kode untuk meletakkan sesuatu di halaman kedua pdf? Saya memiliki formulir yang menggunakan dua halaman dan saya terjebak di halaman pertama. Terima kasih sebelumnya.
DavidV
11

pdfrw akan memungkinkan Anda membaca di halaman dari PDF yang ada dan menariknya ke kanvas reportlab (mirip dengan menggambar). Ada contoh untuk ini di subdirektori pdfrw example / rl1 di github. Penafian: Saya adalah penulis pdfrw.

Patrick Maupin
sumber
Saya pikir Anda bisa meletakkan tautan di sana
The6thSense
Poin bagus! Saya tidak melakukan banyak hal SO ketika saya mempostingnya, dan khawatir tentang "kebijakan teks plus tautan minimal." (Rep saya hanya 46 pada saat itu, dan IIRC saya baru saja menerima -2 pada satu jawaban, jadi saya sedikit khawatir tentang jawaban baru untuk pertanyaan 5 tahun :)
Patrick Maupin
pertanyaan lama mendapat lebih banyak pandangan :) dan perhatian
The6thSense
FWIW, ada beberapa contoh reportlab / pdfrw jika Anda mulai mengikuti tautan ini . Saya menjawab disana, berdasarkan jawaban di target penipuan.
Patrick Maupin
7

Memanfaatkan David Dehghan 's jawaban di atas, berikut karya-karya di 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()
Ross Smith II
sumber
3

cpdf akan melakukan pekerjaan dari baris perintah. Ini bukan python, meskipun (afaik):

cpdf -add-text "Line of text" input.pdf -o output .pdf
pengguna2243670
sumber
0

Anda mungkin lebih beruntung dalam memecahkan masalah menjadi mengubah PDF menjadi format yang dapat diedit, menulis perubahan Anda, lalu mengubahnya kembali menjadi PDF. Saya tidak tahu perpustakaan yang memungkinkan Anda mengedit PDF secara langsung tetapi ada banyak konverter antara DOC dan PDF misalnya.

aehlke
sumber
1
Masalahnya adalah saya hanya memiliki sumber dalam PDF (dari pihak ke-3) dan PDF -> DOC -> PDF akan kehilangan banyak dalam konversi. Saya juga membutuhkan ini untuk berjalan di Linux sehingga DOC mungkin bukan pilihan terbaik.
Frozenskys
Saya percaya Adobe menjaga kemampuan pengeditan PDF tetap tertutup dan eksklusif sehingga mereka dapat menjual lisensi untuk versi Acrobat yang lebih baik. Mungkin Anda dapat menemukan cara untuk mengotomatiskan penggunaan Acrobat Pro untuk mengeditnya, menggunakan semacam antarmuka makro.
aehlke
Jika bagian yang ingin Anda tulis adalah bidang formulir, ada antarmuka XML untuk mengeditnya - jika tidak, saya tidak dapat menemukan apa pun.
aehlke
Tidak, saya hanya ingin menambahkan beberapa baris teks ke setiap halaman.
Frozenskys
0

Jika Anda menggunakan Windows, ini mungkin berhasil:

Percontohan Pembuat PDF

Ada juga whitepaper kerangka pembuatan dan pengeditan PDF dengan Python. Agak ketinggalan jaman, tapi mungkin bisa memberi Anda beberapa info berguna:

Menggunakan Python sebagai Kerangka Pengeditan dan Pemrosesan PDF

thedz
sumber
Buku putihnya terlihat bagus tetapi sedikit cahaya pada kode, dan saya tidak benar-benar memiliki sumber daya untuk mengimplementasikan keseluruhan kerangka PDF sendiri! ;)
Frozenskys
-4

Sudahkah Anda mencoba pyPdf ?

Maaf, ia tidak memiliki kemampuan untuk mengubah konten halaman.

Zoman
sumber
Sepertinya itu mungkin berhasil, apakah ada yang menggunakannya? Seperti apa penggunaan memorinya?
Frozenskys
Itu memang memiliki kemampuan untuk menambahkan tanda air teks dan jika diformat dengan benar itu mungkin berfungsi.
Frozenskys