Posts about rst2pdf (old posts, page 2)

2008-09-11 18:24

Using vector images in reportlab, improved

I just committed into trunk of rst2pdf a nicely working SVGImage flowable for reportlabs.

The code is self-contained in two files:

You can use them in your app if you want (I'd like to know, though). One of them is GPL/LGPL (it's basically copied from uniconvertor) the other is MIT-Licensed.

The output is astonishing: svg.pdf is only 32KB and completely resolution-independent. Graphics in your PDF That look good printed and on screen! And are not huge! Yay!

This will be the flagship new feature in tomorrow's rst2pdf 0.8.

2008-09-10 23:32

Using vector images in reportlab

One of the big limitations of reportlab is that it has no support for vector-based images. You can't insert SVG, EPS or any other vector-based format in your documents.

Until now.

By hijacking another app called uniconvertor, I have managed to insert as vectors SVG images in a reportlab document.

Here's the hackish 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 several problems (see where the second paragraph ended), but it does work.

To run it, you need a warning.svg file (edit as needed) and you run it this way (replacing the path as proper for your setup):

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

In fact, this is not limited to SVG files. You should be able to use the following formats:

  • CorelDRAW ver.7-X3,X4 (CDR/CDT/CCX/CDRX/CMX)
  • Adobe Illustrator up to 9 ver. (AI postscript based)
  • Postscript (PS)
  • Encapsulated Postscript (EPS)
  • Computer Graphics Metafile (CGM)
  • Windows Metafile (WMF)
  • XFIG
  • Scalable Vector Graphics (SVG)
  • Skencil/Sketch/sK1 (SK and SK1)
  • Acorn Draw (AFF)

2008-09-04 11:08

rst2pdf: What will be new tomorrow

Keeping with my new time-based release schedule, tomorrow is again rst2pdf release day! What will be new in 0.7? Several things!

  • Fixed several serious bugs, specially with the handling of literal blocks (preformatteds and code blocks).
  • Implemented a rather neat sidebar/floating block mechanism. It only lets you go float-left or float-right but it looks better than what you get in HTML, at least:
sidebar-beige

You can even use it to float almost arbitrary objects, so you can have floating images or floating figures.

  • Fixed the look of hyperlinks. Reportlab had a bug about making some hyperlinks underlined, and those with a black thick underline. Not when you use rst2pdf! Monkey-patched the heck out of that.
  • Table styling. Let me show you:
rst2pdf-tablestyles

The first row is a header row. It automatically takes the table-heading style.

The following rows are regular, and they take the table style, which has support for zebra tables with alternating colors (white and gray here).

The lone red cell at the right is special. Its content is this:

.. class:: red

red

If you don't know ReST, that means "red" is a paragraph with class red, so it will be styled whatever way that means (here: red background).

Usually that would mean you have a white (or gray) cell with a red paragraph in it. That looks incredibly ugly.

So, rst2pdf tries to be clever: If there is a single element in a cell, it will try to guess the cell background from it.

And as you saw above, it works :-)

2008-09-02 23:49

rst2pdf: progress in smartframe branch

Yes, it is getting better. Now there are left-floating or right-floating elements, and you can float pretty much anything (except literal blocks, that's a problem) by using the class directive. Here's how it looks:

sidebar-beige

2008-08-31 23:01

rst2pdf: smartframes branch

Today I started a branch called SmartFrames. The main goal is to achieve a better text flow in the document (for example, for sidebars), and it is starting to get there, slowly.

Let's consider how ReST sidebars are rendered in the different writers.

We'll work with an ordinary lorem ipsum that has a sidebar declared just before it.

Here's HTML:

sidebar-html

And here's LaTeX:

sidebar-latex

Each one has its good side and its bad side.

The HTML sidebar is a real sidebar, while the LaTex one is some sort of insert.

OTOH, the ragged text against the HTML sidebar is ... horrid.

So, I wanted something at least a bit better than that for rst2pdf. In the best of all possible worlds, it would be the neat text alignment of LaTex with the floating HTML sidebar.

Here's how it looks now:

sidebar-pdf2

There are some minor problems with the current implementation, such that the sidebar is always aligned to the top of a paragraph, and some spacing issues.

How is it done? Let me tell you: it was not trivial :-)

In fact it's pretty evil, but here's a quick explanation:

When I get a sidebar flowable, I insert a new frame in the page template where the sidebar should go, then call a framebreak, insert the "real" sidebar, a "framecutter" and another framebreak.

The framecutter is a flowable that does nothing visible, but inserts another two frames, one at the right of the sidebar with the same height, and another below the sidebar, full width.

I need to use the framecutter because I don't know the height of the sidebar until after it's drawn.

So, we now have 4 frames instead of one:

  1. The original frame, covers the whole page, but has a framebreak above the sidebar.
  2. The sidebar frame, which is very tall, but has a framebreak below the sidebar text.
  3. A beside-the-sidebar frame, short and wide, starting at the right of the sidebar.
  4. A below-the-sidebar frame, wide and tall, starting below the sidebar.

The text should flow from 1 to 3 to 4 neatly and the seams shouldn't show.

Here's a picture that MAY make it clear (there are some odd displacements: those were bugs):

sidebar-wires

So, I'm not calling it a success yet, but it is looking decent.

2008-08-28 23:26

Rstpdf wil be released again tomorrow. And it's a good release.

How good? Let me tell you...

  • Support for PDF table of contents
  • Section names and numbers in headers/footers
  • Compressed PDFs (or not)
  • Guess image sizes. Specially if you meant to use them in a web page and declared just ":width: 50%"
  • Gutter margin support
  • Raw directive (insert pagebreaks and vertical space manually)
  • Offers a docutils-compliant API (and another API, too)
  • Include full or partial files for code-block. That means you can extract code and show it in your document!
  • Huge code cleanup lead by Nicolas Laurance.
  • Working multilingual hyphenation. You can have a per-paragraph language and hyphenate it correctly.

2008-08-27 23:46

How pretty is rst2pdf's output? Take a look.

I am a big Alexandre Dumas fan. He's the direct ancestor of Neal Stephenson, so many of you should like him too. So I used one of his best books to try some automatic typesetting of project gutenberg texts.

No, the whole book did not convert without errors, and yes, there is some manual work in what you are about to see, but hey, take a look.

Here's a far look of the first two pages:

montecristo-1

And here's some detail of the typsetting:

montecristo-2

Yes, the typesetting is not really LaTeX quality, but it's not bad, either.

Compare it with the HTML version at project Gutenberg. The typesetting is a thing of beauty compared to that :-(

The image is a picture of Chateau d'If from flickr, released under Creative Commons. The title font is Scriptina, I chose it because it looks 19th century but modern.

Contents © 2000-2018 Roberto Alsina