Нарисуйте изображения с помощью холста и используйте SimpleDocTemplate

Я пишу pdfs с reportlab внутри представления django, они очень просты, заголовок, содержимое и нижний колонтитул.

Я использую SimpleDocTemplate, который подходит очень хорошо, чтобы рисовать таблицы в содержимом, нижний колонтитул и заголовок drwan, используя:

build([data], onFirstPage=drawPageFrame, onLaterPages=drawPageFrame). 

Мой вопрос: как я могу нарисовать изображение, например, используя Canvas.drawImage (…)? Мне нужен «плавающий» образ … расположенный над текстом, где я хочу, и с SimpleDocTemplate у меня нет объекта Canvas для этого.

Поиск Я нашел это:

Элемент макета таблички использует потоки. Упаковщики обычно устанавливают атрибут canv на каждый текучий, когда он обертывается, разделяется или нарисован, т.е. вокруг методов обертки, разделения и рисования. Внутри этих методов у вас есть доступ к холсту, используя атрибут canv self.

Как это можно использовать?

Ummmm, больше материала для проверки:

 flowables.Macro flowables.CallerMacro 
 # - * - кодирование: utf-8 - * -
 from reportlab.lib.pagesizes импорт A4, пейзаж, портрет
 from reportlab.lib.styles import getSampleStyleSheet
 from reportlab.platypus import Table, Flowable, SimpleDocTemplate, Paragraph, Spacer, Image
 из reportlab.lib import randomtext
 из отчета platypus importlab

 import os, random

 styles = getSampleStyleSheet ()
 path = os.path.realpath (os.path.dirname (__ file__))

 def drawPageFrame (холст, документ):
     canvas.saveState ()
     canvas.drawImage (путь + "/ ujiPDF.jpg", 50,50,57,57)
     canvas.restoreState ()

 doc = SimpleDocTemplate ("salida.pdf", pagesize = A4)

 elementos = []

 com = 'canvas.drawImage ("' + path + '/ ujiPDF.jpg", 100 100,57,57)'
 print com
 elementos.append (platypus.flowables.Macro ( 'canvas.saveState ()))
 print platypus.flowables.Macro (com)
 elementos.append (platypus.flowables.Macro (ком))
 elementos.append (platypus.flowables.Macro ( 'canvas.restoreState ()))

 para = Параграф (randomtext.randomText (randomtext.PYTHON, 20), стили ["Normal"])
 elementos.append (пункт)

 doc.build (elementos, onFirstPage = drawPageFrame, onLaterPages = drawPageFrame)

Это подход макросов … чистый выход, но без второго изображения.

3 Solutions collect form web for “Нарисуйте изображения с помощью холста и используйте SimpleDocTemplate”

Ваш лучший вариант – создать подкласс SimpleDocTemplate или BaseDocTemplate. В методе построения у вас будет доступ к холсту. Если вы хотите использовать все, что делает SimpleDocTemplate, вы можете попробовать скопировать его непосредственно из site-packages/reportlab/platypus/doctemplate.py .

В утконосе есть класс Image. Просто используйте from reportlab.platypus import Image и вы получили доступ к этому классу. Он работает, как и другие классы внутри, и smth.append(Image(filename)) добавляет изображение в объект, который необходимо создать в pdf. Основан на личном веб-сайте Тайлера Лормана

Вам не нужно подклассифицировать весь шаблон документа, если я правильно понимаю вас, вы просто хотите, чтобы вы могли вставить INTO в SimpleDocTemplate. Вы можете достичь этого с помощью очень простого подкласса Flowable.

-> В частности, поскольку люди часто спрашивают о том, как поместить объекты matplotlib в reportlab, я покажу, как сгенерировать график с помощью matplotlib, а затем использовать модифицированный текучий, чтобы поместить этот график в SimpleDocTemplate (без сохранения файла на диск). Эта концепция применима к любому файлу или тому, что вы можете использовать в cStringIO

-> Ниже ниже вы можете поместить фигуру над текстом (измените высоту с отрицательного на положительный, чтобы подтолкнуть ее выше воображаемой линии в верхней части раздела, в который идет речь)

Основная концепция заключается в том, что каждая Flowable сама по себе также содержит холст, на который мы можем нарисовать.

 import matplotlib.pyplot as plt import cStringIO from reportlab.lib.units import inch, cm from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle import reportlab.lib, reportlab.platypus class flowable_fig(reportlab.platypus.Flowable): def __init__(self, imgdata): reportlab.platypus.Flowable.__init__(self) self.img = reportlab.lib.utils.ImageReader(imgdata) def draw(self): self.canv.drawImage(self.img, 0, 0, height = -2*inch, width=4*inch) # http://www.reportlab.com/apis/reportlab/2.4/pdfgen.html doc = SimpleDocTemplate(("report.pdf"),pagesize=letter, rightMargin=72,leftMargin=72, topMargin=72,bottomMargin=18) Story=[] styles=getSampleStyleSheet() ptext = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi massa dolor, vulputate quis elit sed, sagittis consectetur erat. Sed lobortis nisi eros, eu maximus enim iaculis ac. Vestibulum sagittis urna nec interdum aliquam. Pellentesque ornare velit ut ante ullamcorper, vulputate accumsan nisi vulputate. Fusce consectetur dolor quam. Phasellus hendrerit, ligula vel consectetur pretium, lorem neque dapibus eros, ornare suscipit ipsum dolor id nisl. Sed vel orci id leo efficitur lobortis sit amet id risus. Nullam euismod, ipsum a posuere scelerisque, ante lorem ultrices nibh, ut feugiat metus ex congue enim. Nam lobortis, metus id pellentesque feugiat, arcu orci rutrum felis, quis luctus urna nisl at nulla. Donec eu eros pharetra dolor congue facilisis at ac magna. Nullam eu ultricies metus. Sed sodales, libero viverra pellentesque tempus, magna purus convallis nibh, eu condimentum tortor erat tincidunt turpis. Vestibulum scelerisque tincidunt egestas. Nullam commodo diam nisl, sed consequat ex sagittis eu.' Story.append(Paragraph(ptext, styles["Normal"])) fig = plt.figure(figsize=(10, 3)) plt.plot([1,2,3,4]) plt.ylabel('This is a boring plot') imgdata = cStringIO.StringIO() fig.savefig(imgdata, format='png') imgdata.seek(0) # rewind the data pic = flowable_fig(imgdata) Story.append(pic) doc.build(Story) 
  • Reportlab: заголовок с данными со страницы
  • Использование Python ReportLab для splitfirst / splitlast
  • from reportlab.platypus import ListFlowable, ListItem не работает
  • Как установить любой шрифт в reportlab Canvas в python?
  • reportlab низкая производительность
  • reportlab: установка colspan для td в rml
  • Добавление текста поверх существующих PDF-файлов с помощью reportlab
  • Как улучшить качество изображения ReportLab?
  • Python - лучший язык программирования в мире.