2015-02-02 21 views
7

Bu question numaralı telefonu zaten sordum ama henüz bir yanıt yok, bu yüzden de etkin bir şekilde geliştirilmiş ve fpdf python kitaplığından daha iyi görünen Reportlab'a bakmak istiyorum.Reportlab: Bir pdf dosyasına altbilgi ekleme

Bu question ürününü daha önce görmüştüm Verilen cevap, bu blog post ile aynı veya daha az görünüyor. Her nasılsa, gösterilen senaryoda hatalar var, ama onu oylamak istemiyorum, OP kabul etti, sorununu çözmüş görünüyordu, kimim tartışacağım, başka bir soru sormayı tercih ediyorum.

Eğer

from reportlab.pdfgen.canvas import Canvas 

ithalat gerekir her şeyden önce ve, buna Canvas var canvas değil ve o zaman sadece

Canvas.restoreState() veya Canvas.saveState()

Belki daha fazla hata var yapamaz ben 'yerine başka bir örnek kullanın. Dünkü bütün parçayı o snippet'i yapmaya çalıştım ve yapamadım.

Altbilgi oluşturmak için başka bir yöntem var mı? Ben sormak istiyorum spesifik bir yöntem this olduğu adam row[1] şey

Ben Liberation Serif 12 kullanılarak, A4 bir LibreOffice belgesinde, sayılır, bir şeyler yazıyor row[0] üzerine, for döngüsü yapmak, 49 satır vardır. Ortalama olarak, yazı tipi boyutuna ve alt yazı tipi boyutuna bağlı olarak 45 satır olduğunu varsayarsak, bu altbilgiyi x=row[45] gibi ekleyemez ve ardından sayfa numarasına göre x değerini artıramaz mı? Bu daha kolay bir çözüm olmaz mıydı?

Dosya sonu veya metnin eklendiği son satır olduğunu tespit edebilirsem, yapabilirim.

Diğer soruma bakarsanız, powerpoint, excel ve word'ü pdf'ye dönüştürdüğümü ve daha sonra bir altbilgi eklediğimi fark edersiniz. O zamanlar belgeler PDF'leri çalışmak daha kolay olduğunu düşünüyorum çünkü

linux ve pencereler gizli powerpoint üzerinde çalışır ve kelime excel kütüphane varsa, o zaman altbilgi sonra pdf dönüştürmek ekleyin, neden, çok iyi olurdu

+0

Birisi cevap verene kadar, os.system ("libreoffice - headless --invisible --convert - to doc" veya bir şey için – Lynob

cevap

11

Her şeyden önce, Reportlab harika. En iyi kütüphane pdfs oluşturmayı buldum.

örnekler denemeden önce reportlab kurun:

pip install reportlab 

Eğer multibuild bir belge işlemek ve altbilgi eklemek için bir canvasmaker kullanmaya gerek dipnot oluşturmak için.

Öncelikle iki sayfa ile basit pdf dosyası yapalım: pdf dosyası doğru oluşturulduğunu

from reportlab.platypus import (SimpleDocTemplate, Paragraph, PageBreak) 
from reportlab.lib.styles import getSampleStyleSheet 
from reportlab.lib.pagesizes import LETTER 


if __name__ == '__main__': 

    # Content 
    styles = getSampleStyleSheet() 
    elements = [] 
    elements.append(Paragraph("Hello", styles["Normal"])) 
    elements.append(Paragraph("World", styles["Normal"])) 
    elements.append(PageBreak()) 
    elements.append(Paragraph("You are in page 2", styles["Normal"])) 

    # Build 
    doc = SimpleDocTemplate("my_file.pdf", pagesize=LETTER) 
    doc.build(elements) 

kontrol edin.Şimdi

en son satırında multibuild için bir çizgi ve sayfa numaralarını gösterir Altbilgiyi çizmek ve yapı değiştirmek için bir tuval sınıfı ekleyelim:

multibuild olarak
from reportlab.pdfgen import canvas 
from reportlab.platypus import (SimpleDocTemplate, Paragraph, PageBreak) 
from reportlab.lib.styles import getSampleStyleSheet 
from reportlab.lib.pagesizes import LETTER 


class FooterCanvas(canvas.Canvas): 

    def __init__(self, *args, **kwargs): 
     canvas.Canvas.__init__(self, *args, **kwargs) 
     self.pages = [] 

    def showPage(self): 
     self.pages.append(dict(self.__dict__)) 
     self._startPage() 

    def save(self): 
     page_count = len(self.pages) 
     for page in self.pages: 
      self.__dict__.update(page) 
      self.draw_canvas(page_count) 
      canvas.Canvas.showPage(self) 
     canvas.Canvas.save(self) 

    def draw_canvas(self, page_count): 
     page = "Page %s of %s" % (self._pageNumber, page_count) 
     x = 128 
     self.saveState() 
     self.setStrokeColorRGB(0, 0, 0) 
     self.setLineWidth(0.5) 
     self.line(66, 78, LETTER[0] - 66, 78) 
     self.setFont('Times-Roman', 10) 
     self.drawString(LETTER[0]-x, 65, page) 
     self.restoreState() 


if __name__ == '__main__': 

    # Content 
    styles = getSampleStyleSheet() 
    elements = [] 
    elements.append(Paragraph("Hello", styles["Normal"])) 
    elements.append(Paragraph("World", styles["Normal"])) 
    elements.append(PageBreak()) 
    elements.append(Paragraph("You are in page 2", styles["Normal"])) 

    # Build 
    doc = SimpleDocTemplate("my_file.pdf", pagesize=LETTER) 
    doc.multiBuild(elements, canvasmaker=FooterCanvas) 

ayrıca ilk için farklı bir tuval belirtebilirsiniz Sayfa yapacaksanız:

doc.multiBuild(Elements, onFirstPage=myFirstPage, onLaterPages=myLaterPages) 

Bu yardımcı olur umarım.

DÜZENLEME

Şimdi hedef mevcut bir pdf dosyası bir dipnot eklemek etmektir. Ne yazık ki, bu rapor Reportlab ile tek başına yapılamaz (en azından açık kaynak versiyonu, profesyonel versiyonun bu özelliğe sahip olduğunu düşünüyorum). "Sayfaları ayıklanması, orijinal pdf açma ve:

Firt, biz pdfrw Şimdi

pip install pdfrw 

bunu yapıyoruz varolan pdf altbilgi ekleyebilir küçük bir reçeteye eklemeniz gerekir "çizim yeni pdf altbilgi boyunca sayfaları, her seferinde bir sayfa:

from reportlab.pdfgen.canvas import Canvas 
from pdfrw import PdfReader 
from pdfrw.toreportlab import makerl 
from pdfrw.buildxobj import pagexobj 

input_file = "my_file.pdf" 
output_file = "my_file_with_footer.pdf" 

# Get pages 
reader = PdfReader(input_file) 
pages = [pagexobj(p) for p in reader.pages] 


# Compose new pdf 
canvas = Canvas(output_file) 

for page_num, page in enumerate(pages, start=1): 

    # Add page 
    canvas.setPageSize((page.BBox[2], page.BBox[3])) 
    canvas.doForm(makerl(canvas, page)) 

    # Draw footer 
    footer_text = "Page %s of %s" % (page_num, len(pages)) 
    x = 128 
    canvas.saveState() 
    canvas.setStrokeColorRGB(0, 0, 0) 
    canvas.setLineWidth(0.5) 
    canvas.line(66, 78, page.BBox[2] - 66, 78) 
    canvas.setFont('Times-Roman', 10) 
    canvas.drawString(page.BBox[2]-x, 65, footer_text) 
    canvas.restoreState() 

    canvas.showPage() 

canvas.save() 

REDDİ: Linux girdi dosyası olarak reportlab tarafından oluşturulan pdf dosyası kullanarak test edilmiştir. Muhtemelen keyfi bir pdf dosyasında çalışmaz.

+0

kullanmayı denedim. Cevabınız için teşekkürler, cevabınızı yarın kabul ediyorum, ancak istiyorum size bir şey sormak için, sayfa üstbilgisi pagebreak'i çağırır gönderilmez ekleniyor mu? Eğer varsa, bu benim için çalışmayacak çünkü mevcut bir dosyayı kullanıyorum, lütfen daha önceki soruma bakın, yukarıdaki bağlantıya bakın, sayfanın ne zaman biteceğini bilmeme gerek yok, manüel olarak ekleme yapmadığım için, pdf – Lynob

+0

sayfalarını algılayan bir işlev olmadıkça, tüm dosya için for döngüsü kullanmıyorum OnlaterPages kullanmaya çalışacağım – Lynob

+0

Dosyadaki her sayfanın nasıl yükleneceğini çünkü [] el ile yazmıyorum çünkü – Lynob