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.
Birisi cevap verene kadar, os.system ("libreoffice - headless --invisible --convert - to doc" veya bir şey için – Lynob