Re: Integrate "Flowable" (SVG) with caching

"Yannick Gosteli @ PETZI" <[email protected]>
Newsgroups gmane.comp.python.reportlab.user
Message-ID <[email protected]>
OK Thx Robin,

I got it now.
I built a test here and it works: 
https://github.com/Gostich/reportlab_test_svg/blob/master/test3.py

Best regards
Yannick

Yannick Gosteli
PETZI - Association suisse des clubs de musiques actuelles
Billetterie/Petzitickets
[email protected]
www.petzi.ch - www.petzitickets.ch

Le 16. 11. 17 à 17:34, Robin Becker a écrit :
> On 16/11/2017 14:16, Yannick Gosteli @ PETZI wrote:
>> Robin,
>>
>> Your example does not match with the case of SVG that we need to 
>> render in reportlab - I mean we have to build the rasterization.
>> The ways I know to do this rasterization are "renderPDF.draw()" and 
>> "renderPM.drawToPIL()".
>>
>
> there is also what Dinu pointed out, svglib can convert svg directly 
> to a drawing object. That can be rendered like any other flowable 
> using its drawOn command.
>
>>
>> - CASE 1 -
>>
>> "renderPDF.draw()" method explicitly needs x & y => there is no way 
>> to move the point where SVG will be printed via the doForm()
>>
>> Example:
>> ```
>> canv.beginForm('svg')
>> renderPDF.draw(drawing, canv, x=0, y=0)
>> canv.endForm()
>>
>> canv.translate(100,100) # no effect
>> canv.doForm('svg')
>>
>> -------------
>>
> I suspect your use of renderPDF.draw is drawing directly to the canvas 
> and is ignoring the form entirely. I would just try 
> drawing.drawOn(canv,0,0) instead..
>
>
> eg new example which shows the drawing being translated etc etc; if 
> you want to use svg I would definitely use this technique with Dinu's 
> svglib svg2rlg function.
> ###############################################
> from reportlab.pdfgen.canvas import Canvas
> from reportlab.graphics.shapes import Drawing, Line, Circle
>
> canv= Canvas('tform.pdf')
>
> #make a drawing
> d=Drawing(20,20)
> d.add(Line(0,0,10,10,strokeWidth=1,strokeColor=(0,0,1)))
> d.add(Circle(15,15,5,strokeWidth=1,strokeColor=(1,0,0),fillColor=(0.5,0.5,0))) 
>
>
>
> #define a form
> canv.beginForm('myform')
> canv.setFont('Times-Roman',10)
> canv.setFillColor((1,0,0))
> canv.setStrokeColor((0,1,0))
> canv.setLineWidth(2)
> s='In myform'
> w=canv.stringWidth(s)
> d.drawOn(canv,10,10)
> canv.drawString(2,4,s)
> canv.rect(0,0,2+w,14,stroke=1)
> canv.endForm()
>
> canv.drawString(10,10,'Hello World')
>
>
> canv.saveState()
> canv.translate(100,100)
> canv.lines([(0,-5,0,5), (-5,0,5,0)])
> canv.doForm('myform')
> canv.restoreState()
>
> canv.saveState()
> canv.translate(200,200)
> canv.scale(1.5,1.5)
> canv.lines([(0,-5,0,5), (-5,0,5,0)])
> canv.doForm('myform')
> canv.restoreState()
>
> canv.saveState()
> canv.translate(300,300)
> canv.lines([(0,-5,0,5), (-5,0,5,0)])
> canv.doForm('myform')
> canv.restoreState()
>
> canv.showPage()
> canv.save()
> ###############################################
>
>>
>> - CASE 2 -
>>
>> "renderPM.drawToPIL()" will render in a PIL image => we can use it in 
>> canv.drawImage() => no needs of "form" (useless)
>>
>> ------------
>>
>>
>> Let me know if you see a better solution
>>
>> Best regards
>> Yannick
>>
>>
>> Yannick Gosteli
>> PETZI - Association suisse des clubs de musiques actuelles
>> Billetterie/Petzitickets
>> [email protected]
>> www.petzi.ch - www.petzitickets.ch
>>
>> Le 16. 11. 17 à 14:38, Robin Becker a écrit :
>>> On 16/11/2017 12:57, Dinu Gherman wrote:
>>>> Hi Yannick,
>>>>
>>>> have you tried using svglib that I originally wrote in the context 
>>>> of reportlab? Using it you can import an SVG file and render it as 
>>>> a reportlab flowable. I’m just not sure if it will be cached and 
>>>> reused the same way as bitmap images over many pages. And I haven’t 
>>>> really produced reportlab-generated docs in a long time.
>>>>
>>>> https://github.com/deeplook/svglib
>>>>
>>>> Cheers,
>>>>
>>>> Dinu
>>>>
>>> The current code draws directly into the canvas, so if a repeated 
>>> image is required the code for drawing is repeated and document gets 
>>> larger.
>>>
>>> My hack solution would be to draw into a form and then render the 
>>> form as often as required.
>>>
>>> Yannick is correct in saying that the form is created in it's own 
>>> space, but if that's zero based then when you use the form you can 
>>> surround the doForm with
>>>
>>> saveState
>>> scale translate etc etc
>>> doForm
>>> restoreState
>>>
>>> to position the image anywhere on the page see below.
>>>
>>> Obviously this is more work than just using a built in method, but 
>>> it should be easy enough to make an svg cache.
>>>
>>> EG
>>>
>>> ############################################
>>> from reportlab.pdfgen.canvas import Canvas
>>>
>>> canv= Canvas('tform.pdf')
>>>
>>> #define a form
>>> canv.beginForm('myform')
>>> canv.setFont('Times-Roman',10)
>>> canv.setFillColor((1,0,0))
>>> canv.setStrokeColor((0,1,0))
>>> canv.setLineWidth(2)
>>> s='In myform'
>>> w=canv.stringWidth(s)
>>> canv.drawString(2,4,s)
>>> canv.rect(0,0,2+w,14,stroke=1)
>>> canv.endForm()
>>>
>>> canv.drawString(10,10,'Hello World')
>>>
>>>
>>> canv.saveState()
>>> canv.translate(100,100)
>>> canv.lines([(0,-5,0,5), (-5,0,5,0)])
>>> canv.doForm('myform')
>>> canv.restoreState()
>>>
>>> canv.saveState()
>>> canv.translate(200,200)
>>> canv.scale(1.5,1.5)
>>> canv.lines([(0,-5,0,5), (-5,0,5,0)])
>>> canv.doForm('myform')
>>> canv.restoreState()
>>>
>>> canv.saveState()
>>> canv.translate(300,300)
>>> canv.lines([(0,-5,0,5), (-5,0,5,0)])
>>> canv.doForm('myform')
>>> canv.restoreState()
>>>
>>> canv.showPage()
>>> canv.save()
>>> ############################################
>>>
>>>
>>>
>>>
>>>>> Am 15.11.2017 um 22:23 schrieb Yannick Gosteli @ PETZI 
>>>>> <[email protected]>:
>>>>>
>>>>> Dear,
>>>>>
>>>>> I generate a document that contains a SVG repeated several times.
>>>>> I wonder if there is a way to integrate this SVG with "caching" 
>>>>> the same way it works with Canvas.drawImage*.
>>>>>
>>> ............
>>
>> _______________________________________________
>> reportlab-users mailing list
>> [email protected]
>> https://pairlist2.pair.net/mailman/listinfo/reportlab-users
>
>

_______________________________________________
reportlab-users mailing list
[email protected]
https://pairlist2.pair.net/mailman/listinfo/reportlab-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.