Hello everbody,

seeing that last month had a thread on wrapping PDFBox, obviously
there's some demand for a fully-featured PDF library for Python :-).
So for one of my projects I started working on wrapping iText with JCC
today and I want to state that I'm really impressed! JCC rocks.

Besides the fact that JCC could need a "--help" parameter, it all went
very smoothly, I just ran into two small problems:

  * I had to to some trial-and-error recompiling because JCC doesn't
include subtypes in the dependencies which means, for example, that
when you really should use a FileOutputStream, iText usually only
imports a OutputStream (probably a calculated dependency from the
libraries method signatures), so it needs some fiddling with --package
to get all necessary classes in.

Is there a good way for forcing the import of a whole package? The way
it is now, I really don't use more than 5% of iText's API and can't
really tell if the wrapper contains all necessary external classes to
use iText properly. I'm a bit lost there and would welcome pointers
and ideas on how to do this correctly. What happens if a Python
program uses multiple JCC-wrapped JVMs, would the wrapped types
"itext.FileOutputStream" and "lib2.FileOutputStream" collide?

I also haven't started to identify any iterables or sequences that can
be made "pythonic", using JCC's built-in extensions. Is there a good
way to grep for those?

  * when compiling the extension, JCC generated the following code:
namespace com {
    namespace lowagie {
        namespace text {
            namespace pdf {
                [...]
                    static PdfName *DOMAIN;
                [...]

which led to this error:
build/_itext/com/lowagie/text/pdf/PdfName.h:173: error: expected ';'
before numeric constant

This happens, because "DOMAIN", unfortunately, collides with the macro
    #define DOMAIN 1
in <math.h>.

I fixed this error by adding:
[...]
#define _OLDDOMVAL_ DOMAIN
#undef DOMAIN
                    static PdfName *DOMAIN;
#define DOMAIN _OLDDOMVAL_
[...]

and that allows everything to compile, but it's a hack. Currently I
think that to make JCC a real general-purpose tool that can wrap 99.9%
of all libraries out-of-the-box, it will need to do some name
mangling. Has anyone on the list developed a good solution or
work-around for these situations?

BTW, my current process for building is:
1. python -m jcc --jar iText-2.1.5.jar --include bcprov-jdk16-142.jar
--include junit4.5/junit-4.5.jar --package java.io
java.io.FileOutputStream java.io.FileInputStream --package java.util
--python itext --version 2.1.5  --build

... wait for it to fail, then edit PdfName.h like described above

2. python -m jcc --jar iText-2.1.5.jar --include bcprov-jdk16-142.jar
--include junit4.5/junit-4.5.jar --package java.io
java.io.FileOutputStream java.io.FileInputStream --package java.util
--python itext --version 2.1.5  --compile
3. python -m jcc --jar iText-2.1.5.jar --include bcprov-jdk16-142.jar
--include junit4.5/junit-4.5.jar --package java.io
java.io.FileOutputStream java.io.FileInputStream --package java.util
--python itext --version 2.1.5  --bdist
4. easy_install dist/itext-2.1.5-pyXYZ.egg

I'm pretty certain that all of the above leaves a wide room for
improvement :-). So thanks in advance for any comments.

Best regards from Germany,
Jonas

Reply via email to