Python kullanarak Mevcut PDF'ye metin ekleyin


108

Python kullanarak mevcut bir PDF'ye fazladan metin eklemem gerekiyor, bunu yapmanın en iyi yolu nedir ve hangi ekstra modülleri yüklemem gerekecek.

Not: İdeal olarak, bunu hem Windows hem de Linux'ta çalıştırabilmeyi isterim, ancak bir itme işleminde yalnızca Linux işe yarar.

Düzenleme: pyPDF ve ReportLab iyi görünüyor ama ikisi de mevcut bir PDF'yi düzenlememe izin vermiyor, başka seçenekler var mı?

Yanıtlar:


89

Bunun daha eski bir gönderi olduğunu biliyorum ama bir çözüm bulmak için uzun süre uğraştım. Yalnızca ReportLab ve PyPDF kullanan iyi bir tanesine rastladım, bu yüzden paylaşmayı düşündüm:

  1. kullanarak PDF'nizi okuyun, PdfFileReader()bu girişi arayacağız
  2. ReportLab kullanarak eklemek için metninizi içeren yeni bir pdf oluşturun, bunu bir dize nesnesi olarak kaydedin
  3. kullanarak dize nesnesini okuyun, PdfFileReader()bu metni arayacağız
  4. kullanarak yeni bir PDF nesnesi oluşturun PdfFileWriter(), bu çıktıya
  5. girişi yineleyin ve .mergePage(*text*.getPage(0))metnin eklenmesini istediğiniz her sayfa için uygulayın , ardından output.addPage()değiştirilen sayfaları yeni bir belgeye eklemek için kullanın

Bu, basit metin eklemelerinde işe yarar. Bir belgeye filigran eklemek için PyPDF'nin örneğine bakın.

Aşağıdaki soruyu yanıtlamak için bazı kodlar:

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

Buradan, giriş dosyasının sayfalarını başka bir belge ile birleştirebilirsiniz.


2
"ReportLab kullanarak eklemek için metninizi içeren yeni bir pdf oluşturun, bunu bir dize nesnesi olarak kaydedin" Bunu nasıl yaparsınız? Bir tuval örneği.
Lakshman Prasad

1
Lakshman'ın sorusunu yanıtlamak için yukarıya bazı örnek kod ekledim.
dwelch

PyPDF2'yi daha güncel olduğu için kullanmanızı tavsiye ederim, ayrıca örnek kodlarını da kontrol edin: github.com/mstamy2/PyPDF2/blob/…
blaze

2
Bu kod yeni bir pdf dosyası oluşturacak ve tüm meta verileri atlayacaktır. Yani mevcut pdf'ye eklenmiyor.
Anton Kukoba

127

[Python 2.7] için örnek:

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 için örnek:


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 için, paket io.BytesIOpyPDF (bakılmayan) yerine PyPDF2 olmalı ve kullanmalıdır. Mükemmel cevap!
Noufal Ibrahim

4
Paylaşım için teşekkürler. Harika çalışıyor. Bir not: Bunun openyerine kullanmanın daha iyi olduğuna inanıyorum file.
mitenka

Bunun, özellikle çalışan bir örnek içerdiği için daha kabul edilebilir bir cevap olduğuna inanıyorum.
Casey

1
Dikkat: Yeni belge yalnızca orijinalin ilk sayfasını içerir! Bu gelen geri kalan sayfaları kopyalamak için yeterince kolay existing_pdfiçin output, örnek kod sadece yapmaz.
alexis

@alexis: Pdf'nin ikinci sayfasına bir şey koymak için kodu nasıl değiştirirsiniz? İki sayfa kullanan bir formum var ve ilk sayfada takılı kaldım. Şimdiden teşekkürler.
DavidV

11

pdfrw , mevcut bir PDF'den sayfaları okumanıza ve bunları bir rapor laboratuvarı tuvaline (bir görüntü çizmeye benzer şekilde) çizmenize izin verir. Bunun için github'daki pdfrw örnekleri / rl1 alt dizininde örnekler vardır . Feragatname: Ben pdfrw yazarıyım.


Sanırım oraya bir bağlantı koyabilirsiniz
The6thSense

İyi bir nokta! Bunu yayınladığımda pek SO şey yapmamıştım ve "minimum metin artı bağlantı politikası" konusunda endişeliydim. (O zamanlar temsilcim sadece 46 idi ve IIRC bir cevapta -2 almıştım, bu yüzden 5 yaşındaki sorulara yeni cevaplar için biraz endişeliydim :)
Patrick Maupin

eski sorular daha fazla görüş alır :) ve dikkat
The6thSense

FWIW, bu bağlantıyı izlemeye başlarsanız birkaç tane daha reportlab / pdfrw örneği var . Dupe hedefindeki cevaba dayanarak orada cevap verdim.
Patrick Maupin

7

Yararlanma David Dehghan 'ın cevabı Python 2.7.13 aşağıdaki işleri, yukarıda:

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

3

cpdf , işi komut satırından yapacaktır. Yine de piton değil (afaik):

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

0

Sorunu PDF'yi düzenlenebilir bir biçime dönüştürmek, değişikliklerinizi yazmak ve ardından tekrar PDF'ye dönüştürmek için daha iyi şansa sahip olabilirsiniz. Doğrudan PDF'yi düzenlemenizi sağlayan bir kitaplık bilmiyorum, ancak örneğin DOC ve PDF arasında çok sayıda dönüştürücü var.


1
Sorun şu ki, kaynağın yalnızca PDF biçiminde olması (3. bir partiden) ve PDF -> DOC -> PDF, dönüştürmede çok şey kaybedecek. Ayrıca bunun Linux üzerinde çalışmasına ihtiyacım var, bu yüzden DOC en iyi seçim olmayabilir.
Frozenskys

Adobe'nin daha iyi Acrobat sürümleri için lisans satabilmeleri için PDF düzenleme özelliğini oldukça kapalı ve tescilli tuttuğuna inanıyorum. Belki bir çeşit makro arayüzü kullanarak Acrobat Pro'nun kullanımını otomatikleştirmenin bir yolunu bulabilirsin.
aehlke

Yazmak istediğiniz kısımlar form alanları ise, bunları düzenlemek için XML arayüzleri vardır - aksi takdirde hiçbir şey bulamıyorum.
aehlke

Hayır, sadece her sayfaya birkaç satır metin eklemek istedim.
Frozenskys


-4

PyPdf'i denediniz mi?

Üzgünüz, bir sayfanın içeriğini değiştiremez.


Görünüşe göre işe yarayabilir, kimse kullandı mı? Bellek kullanımı nasıl?
Frozenskys

Bir metin filigranı ekleme özelliğine sahiptir ve düzgün biçimlendirilmişse çalışabilir.
Frozenskys
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.