[reportlab-users] [ANN] PyCanvas with a new testsuite and "no" bug now.

Jerome Alet reportlab-users@reportlab.com
Tue, 1 Oct 2002 10:33:34 +0200


--mP3DRpeJDSE+ciuQ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hi,

the attached tarball contains the latest incarnation of PyCanvas.

PyCanvas is a Canvas class which can also output Python source code
which generates the same PDF output.

it is packaged to be easily extracted in the reportlab tree, the file
pycanvas.py goes into pdfgen and test_pdfgen_pycanvas.py into test,
so you can include it into RL if you want, without modifying any
other file.

License is 100% pure ReportLab license.

test_pdfgen_pycanvas.py is a modified version of test_pdfgen_general.py
which uses pycanvas.Canvas instead of canvas.Canvas, and prints the
generated python source code to stdout. The complete test suite seems
to work fine now.

The new version features :

        - A bug with PDFTextObjects was corrected (__init__'s x and y 
          were not taken into account, but the old test suite didn't
          show the problem, unfortunately).
          
        - The generated Python source code is now a "runnable" module 
          which defines a doIt function, so you can import it and run
          it from other programs.
          
        - The generated Python source code is now capable of regenerating
          itself ad infinitum !!! (it uses pycanvas instead of canvas)
          The accuracy of such a re-generation is perfect (100%).
          
          e.g. with the test suite :
          
              python test_pdfgen_pycanvas.py >1.py
              python 1.py out1.pdf >2.py
              python 2.py out2.pdf >3.py 
              python 3.py out3.pdf >4.py 
              ...
              1.py, 2.py, 3.py, etc... are identical files.

Any comment or bug report is *very* welcome.

Thanks in advance

Jerome Alet

--mP3DRpeJDSE+ciuQ
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="pycanvas-patch.tar.gz"
Content-Transfer-Encoding: base64

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
S13qUpe61KUubUj/BSuXw7kAoAAA

--mP3DRpeJDSE+ciuQ--