2009-07-24 4 views
60

kullanarak Mevcut PDF metin ekleyin.Bu ve ben yüklemeniz gerekir ekstra hangi modüller hakkında gitmek için en iyi yolu nedir Python kullanarak varolan PDF, bazı ekstra metin eklemek gerekir Python

Not: İdeal Windows hem de Linux üzerinde bu çalıştırmak mümkün olmak istiyorum, ama bir itme Linux sadece yapacağız.

Şimdiden teşekkürler.
Richard.

Düzenleme: pyPdf ve Reportlab iyi bakmak ama bana varolan PDF düzenleme sağlayacak ne biri, başka seçenekler vardır?

cevap

63

Bu eski bir yazı olduğunu biliyorum ama bir çözüm bulmak için çalışıyor uzun zaman geçirdi. Ben paylaşmak istedim bu yüzden sadece reportlab ve pyPdf kullanarak iyi bir birine rastladım:

  1. PdfFileReader() kullanarak PDF okumak, biz içeren yeni pdf oluşturmak bu girişi
  2. arayacağım senin metin, reportlab kullanarak eklemek
  3. PdfFileReader() kullanarak dize nesne oku dize nesne olarak kaydetmek, biz PdfFileWriter() kullanarak yeni bir PDF nesne oluşturmak bu metni
  4. arayacağım, bunu ararım çıkış
  5. yinelerler girişiiçinden ve .mergePage uygulamak (metin .getPage (0)) metin eklenen istediğiniz her sayfa için, daha sonra çıkışını kullanmak .addPage() Yeni bir belgeye değiştirilmiş sayfalar eklemek

Bu basit metin eklemeler için iyi çalışır. Bir belgeyi damgalamak için PyPDF'nin örneğine bakın.

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

Buradan başka belgede İşte

+1

"ReportLab kullanarak eklemek için metninizi içeren yeni bir pdf oluşturun, bunu bir string nesnesi olarak kaydedin" Bunu nasıl yapıyorsunuz? Onun bir tuval örneği. –

+1

Lakshman'in sorusuna cevap vermek için yukarıdaki örnek kodları ekledim. – dwelch

+1

Bu cevap altındır - cazibe gibi çalışır. –

0

Sen PDF geri dönüştürmesini ardından, düzenlenebilir bir biçime PDF dönüştürme değişiklikleri yazılı içine sorun kesiliyor iyi şans olabilir. PDF'yi doğrudan düzenlemenizi sağlayan bir kitaplık bilmiyorum ancak DOC ve PDF arasında birçok dönüştürücü var.

+1

sorun şu ki sadece (bir 3. parti itibaren) PDF kaynak ve PDF olması -> DOC -> PDF dönüşümde çok şey kaybedecek. Ayrıca Linux'ta çalıştırmak için buna ihtiyacım var, bu yüzden DOC en iyi seçim olmayabilir. – Frozenskys

+0

Adobe'nin PDF düzenleme yeteneğini oldukça kapalı ve tescilli bir şekilde tuttuğunu ve böylece daha iyi Acrobat sürümleri için lisans satabileceklerini düşünüyorum. Belki de, bir tür makro arabirim kullanarak, düzenlemek için Acrobat Pro'nun kullanımını otomatikleştirmenin bir yolunu bulabilirsiniz. – aehlke

+0

Yazmak istediğiniz bölümler form alanlarıysa, bunları düzenlemek için XML arabirimleri vardır - aksi halde hiçbir şey bulamıyorum. – aehlke

-2

pyPdf'u denediniz mi?

Üzgünüz, bir sayfanın içeriğini değiştirme yetkisi yok. Windows üzerinde iseniz

+0

Bu işe yarayabilir, kullananlar var mı? Bellek kullanımı nasıl? – Frozenskys

+0

Metin filigranı ekleme özelliği var ve düzgün biçimlendirilmişse işe yarayabilir. – Frozenskys

1

, bu işe yarayabilecek:

PDF Creator Pilot

da Pythonda PDF oluşturma ve düzenleme çerçevesinin bir teknik inceleme var. Biraz tarihli, ama belki bazı yararlı bilgiler verebilir:

Using Python as PDF Editing and Processing Framework

+0

Beyaz kağıt iyi görünüyor, ancak kod üzerinde biraz ışık var ve ben tamamen kendi PDF çerçevesini uygulamak için gerekli kaynağa sahip değilim! ;) – Frozenskys

68

ile giriş dosyasının sayfalarını birleştirebilir ben başka bir yerde bulunan bir tam cevap [Python: İşte

aşağıdaki soruyu cevaplamak için bazı koddur 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() 

Ve burada Python 3.x için bir güncelleştirme olduğunu:


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

Python3 için paket io.BytesIO olmalıdır. ve PyPDF2'yi pyPDF yerine (kullanılmayan) kullanın. Mükemmel cevap! –

+3

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

+0

Bunun daha kabul edilebilir bir yanıt olduğuna inanıyorum, özellikle de çalışma örneğini içerdiğinden. – Casey

2

cpdf komut satırından iş yapacak. Gerçi (afaik), piton değildir:

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

pdfrw Varolan PDF sayfalarında okuyup bir reportlab tuval (bir görüntü çizerek benzer) bunları çizmek izin verir. Bunun için github üzerindeki pdfrw examples/rl1 alt dizininde örnekler vardır. Yasal Uyarı: Ben pdfrw yazarım.

+0

Sanırım bir bağlantı kurabilirsin – The6thSense

+0

İyi nokta! Bunu yayınladığımda çok fazla şey yapmadım ve "minimal metin artı bağlantı politikası" konusunda endişeliydim. (Benim temsilcisi sadece 46 yaşındaydı ve IIRC sadece bir cevap üzerine -2 almıştı, bu yüzden 5 yaşındaki sorulara yeni cevaplar hakkında biraz endişeliydim :) –

+0

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

3

yararlanan David Dehghan 'ın answer yukarıdaki, Python 2.7.13 aşağıdaki çalışır:

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() 
İlgili konular