Skip to main content

Ralsina.Me — Roberto Alsina's website

Posts about rst2pdf (old posts, page 4)

Using vector images in reportlab, improved

I just com­mit­ted in­to trunk of rst2pdf a nice­ly work­ing SVGIm­age flow­able for re­port­lab­s.

The code is self­-­con­tained in two files:

You can use them in your app if you want (I'd like to know, though). One of them is GPL/L­GPL (it's ba­si­cal­ly copied from uni­con­ver­tor) the oth­er is MIT-Li­censed.

The out­put is as­ton­ish­ing: svg.pdf is on­ly 32KB and com­plete­ly res­o­lu­tion-in­de­pen­den­t. Graph­ics in your PDF That look good print­ed and on screen! And are not huge! Yay!

This will be the flag­ship new fea­ture in to­mor­row's rst2pdf 0.8.

Using vector images in reportlab

One of the big lim­i­ta­tions of re­port­lab is that it has no sup­port for vec­tor-based im­ages. You can't in­sert SVG, EPS or any oth­er vec­tor-based for­mat in your doc­u­ments.

Un­til now.

By hi­jack­ing an­oth­er app called uni­con­ver­tor, I have man­aged to in­sert as vec­tors SVG im­ages in a re­port­lab doc­u­men­t.

Here's the hack­ish code:

import sys,os
from app.io import load
from app.plugins import plugins
import app
from reportlab.platypus import *
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch

app.init_lib()
plugins.load_plugin_configuration()


class SVGImage(Flowable):
  def __init__(self,imgname):
    self.doc = load.load_drawing(imgname)
    for k in dir(self.doc):
      print k
    self.saver = plugins.find_export_plugin(plugins.guess_export_plugin(".pdf"))
    Flowable.__init__(self)

  def wrap(self,aW,aH):
    br=self.doc.BoundingRect()
    return br[2],br[3]

  def drawOn(self,canv,x,y,_sW=0):
    canv.translate(x,y)
    self.saver (self.doc,".ignoreme.pdf",options={'pdfgen_canvas':canv})
    os.unlink(".ignoreme.pdf")

styles = getSampleStyleSheet()
def go():
    doc = SimpleDocTemplate("phello.pdf")
    Story = [Spacer(1,2*inch)]
    style = styles["Normal"]
    p = SVGImage('warning.svg')
    Story.append(p)
    doc.build(Story)

go()

It has sev­er­al prob­lems (see where the sec­ond para­graph end­ed), but it does work.

To run it, you need a warn­ing.svg file (ed­it as need­ed) and you run it this way (re­plac­ing the path as prop­er for your se­tup):

PYTHONPATH=/usr/lib/python2.5/site-packages/uniconvertor/ python use_uniconv.py

In fac­t, this is not lim­it­ed to SVG files. You should be able to use the fol­low­ing for­mat­s:

  • Corel­­DRAW ver.7-X3,X4 (C­­DR/CDT/C­CX/C­­DRX/CMX)

  • Adobe Il­lus­­tra­­tor up to 9 ver. (AI post­script based)

  • Post­script (P­S)

  • En­­cap­­su­lat­ed Post­script (EP­S)

  • Com­put­er Graph­ics Metafile (CG­M)

  • Win­­dows Metafile (WM­F)

  • XFIG

  • Scal­able Vec­­tor Graph­ics (SVG)

  • Sken­­cil/S­ketch/sK1 (SK and SK1)

  • Acorn Draw (AF­F)

rst2pdf: What will be new tomorrow

Keep­ing with my new time-based re­lease sched­ule, to­mor­row is again rst2pdf re­lease day! What will be new in 0.7? Sev­er­al things!

  • Fixed sev­er­al se­ri­ous bugs, spe­­cial­­ly with the han­dling of lit­er­al blocks (pre­­for­­mat­t­eds and code block­­s).

  • Im­­ple­­men­t­ed a rather neat side­bar/float­ing block mech­a­nis­m. It on­­ly lets you go float-left or float-right but it looks bet­ter than what you get in HT­M­L, at least:

sidebar-beige

You can even use it to float al­most ar­bi­trary ob­ject­s, so you can have float­ing im­ages or float­ing fig­ures.

  • Fixed the look of hy­per­links. Re­­port­lab had a bug about mak­ing some hy­per­links un­der­­lined, and those with a black thick un­der­­line. Not when you use rst2pdf! Mon­key-­­patched the heck out of that.

  • Ta­ble styling. Let me show you:

rst2pdf-tablestyles

The first row is a head­er row. It au­to­mat­i­cal­ly takes the table-­head­ing style.

The fol­low­ing rows are reg­u­lar, and they take the ta­ble style, which has sup­port for ze­bra ta­bles with al­ter­nat­ing col­ors (white and gray here).

The lone red cell at the right is spe­cial. Its con­tent is this:

.. class:: red

red

If you don't know ReST, that means "red" is a para­graph with class red, so it will be styled what­ev­er way that means (here: red back­ground).

Usu­al­ly that would mean you have a white (or gray) cell with a red para­graph in it. That looks in­cred­i­bly ug­ly.

So, rst2pdf tries to be clev­er: If there is a sin­gle el­e­ment in a cel­l, it will try to guess the cell back­ground from it.

And as you saw above, it works :-)


Contents © 2000-2024 Roberto Alsina