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

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

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

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

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

Поиск я нашел следующее:

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

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

Умммм, еще кое-что для проверки:

flowables.Macro
flowables.CallerMacro
# -*- coding: utf-8 -*-
from reportlab.lib.pagesizes import A4, landscape, portrait
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Table, Flowable, SimpleDocTemplate, Paragraph, Spacer, Image
from reportlab.lib import randomtext
from reportlab import platypus

import os,random

styles = getSampleStyleSheet()
path = os.path.realpath(os.path.dirname(__file__))

def drawPageFrame(canvas, doc):
    canvas.saveState()
    canvas.drawImage(path+"/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(com))
elementos.append(platypus.flowables.Macro('canvas.restoreState()'))

para = Paragraph(randomtext.randomText(randomtext.PYTHON,20), styles["Normal"])
elementos.append(para)

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

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

6
задан Cœur 19 August 2017 в 12:59
поделиться