Hello Angello,

I found out that to get the text justified, I have to use the
appendRawCommands method on PDPageContentStream to adjust the space between
letters and words, using raw commands Tc and Tw from PDF reference.

I am just surprised that this commands are not implemented on
PDPageContentStream, as this representing no such code:
    private static final String SET_CHAR_SPACING = "Tc\n";
    private static final String SET_WORD_SPACING = "Tw\n";


    public void setCharSpace( float charSpace ) throws IOException
    {
        appendRawCommands( formatDecimal.format( charSpace ) );
        appendRawCommands( SPACE );
        appendRawCommands( SET_CHAR_SPACING );
    }

    public void setWordSpace( float charSpace ) throws IOException
    {
        appendRawCommands( formatDecimal.format( charSpace ) );
        appendRawCommands( SPACE );
        appendRawCommands( SET_WORD_SPACING );
    }

or something like that!



2011/10/16 Angelo zerr <[email protected]>

> Hi Jeremias,
>
> Many thanks for your great explanation! I'm very motivated to study
> PDFDocumentGraphics2D with your explanation and your support.
> I would like create the same API than iText (Paragraph, Table, etc) with
> FOP
> (or PDFBox) and use it for our converterODF/OOXML.
> I would like avoid managing layout for docx and layour for odt, but use in
> the 2 cases the Paragraph, Table structures that I would like provides with
> FOP or PDFBox.
> I have started to manage that with PDFBox (but with FOP it will be same
> thing) and I track x and y when I add a structure (to compute x/y position
> and know if new page must be added) :
>
> ex:
> -----------------------------------------------------------
> Document doc=new Document()
> Paragrapf p = new Paragraph();
> p.addRun(new Run("AAAA"));
> p.addRun(new Run(" "));
> p.addRun(new Run("BBBB"));
> doc.addParagraph(p);
>
> doc.save("test.pdf"); // <= here it loops to each structure and compute x,
> y
> position, after coputing that it render each structure.
> -----------------------------------------------------------
>
> I don't know how to manage layout (x and y position) with a different
> means?
>
> Anyway thank a lot for your great help.
>
> Regards Angelo
>
> 2011/10/15 Jeremias Maerki <[email protected]>
>
> > Hi Angelo
> >
> > PDFDocumentGraphics2D is a Graphics2D subclass, so the API is stable.
> > The only thing special to it is the font and page size setup and the
> > nextPage() method.
> >
> > You program once against a Graphics2D object to paint individual pages
> > and that allows you to paint on the Screen (AWT/Swing), print to a
> > printer (javax.print) or to create SVG (SVGGraphics2D from Apache Batik),
> > PDF (PDFDocumentGraphics2D from Apache FOP), PostScript
> > (PSDocumentGraphics2D from Apache XML Graphics Commons) or whatever. I
> > think iText has a Graphics2D implementation, too. We could even write
> > one for PDFBox.
> >
> > PDFBox already has the opposite direction: it takes a PDF page and can
> > paint it on a Graphics2D object. That's how it does PDF2Image and how
> > the PDFReader displays the PDF contents.
> >
> > Graphics2D is a vector graphics painting API suitable for a single
> > page/box/screen. It works with absolute coordinates. You can use it to
> > create paged documents. There are tools in java.awt.text that help
> > laying out text but it's no full layout engine.
> >
> > Word processing documents (ODF/OOXML/DOC) are flow-oriented formats,
> > just like HTML and XSL-FO. It's the job of a formatting engine (like
> > Apache FOP) to turn that into a paged format, i.e. from not having to
> > track X/Y to absolute positioning on a page. It does line breaking und
> > checks how many lines fit into a page and continues on a new page if an
> > overflow occurs (that's simplified).
> >
> > Apparently, you have a nice API in iText that allows you to build up the
> > PDF by adding paragraphs and runs where you don't have to worry about
> > line breaking, hyphenation and page breaks. That means, iText has at
> > least a simple formatting engine built in. PDFBox doesn't have that
> (yet).
> > FOP has a sophisticated one for XSL-FO. Apache Batik has one for the SVG
> > flow-text feature (using java.text.AttributedCharacterIterator, but
> > heavily relying on their internal GVT framework).
> >
> > The JDK has one in javax.swing.text (rendering Text, HTML and RTF, also
> > using java.awt.font and java.text) although I'm starting to believe that
> > it only supports line-breaking, not page breaking. That's the one I used
> > in the example for PDFDocumentGraphics2D. I can't tell if that would
> > make a good basis for a simple layout engine for PDFBox. But I certainly
> > think it might be possible to reuse some of that and try to build a
> > simple page breaker on top of that. I think that might actually one of
> > the best option for have something useful relatively quickly but it
> > might not fit for all possible features that ODF/OOXML offer.
> >
> > So, in the end I don't think you can get around to find or program some
> > kind of formatter/layout engine that handles the transition from
> > flow-based to absolute text, when you go from ODF/OOXML to PDF.
> >
> > Doing that on an engine that does not directly depend on PDFBox would
> > allow you to cater for more than just PDF (taking XDocReport's and ODF
> > Toolkit's view). That's why I suggested to have a look at FOP's
> > intermediate format. Because if you can generate that format you have
> > immediate access to all paged output formats that FOP supports (PDF, PS,
> > AFP, PCL, TIFF, Print). To a lesser degree the same is also possible if
> > you program against Graphics2D because you can then also produce various
> > output formats (see the list of Graphics2D implementations that I gave
> > above).
> >
> > Please note: I don't want to deny PDFBox a nice simple (flow-oriented)
> > API for generating PDFs or a Graphics2D implementation. I'm just
> > pointing out possible directions.
> >
> > And the bitter pill at the end: doing layout can be real hard. I'm
> > speaking from experience.
> >
> > On 15.10.2011 14:09:20 Angelo zerr wrote:
> > > Hi Jeremias ,
> > >
> > > Wow thta's a very cool sample! Thank a lot.
> > >
> > > With you sample I must manage x and y position that I have started with
> > > PDFBox implementation.
> > > It seems that PDFDocumentGraphics2D  looks like PDPageContentStream
> (draw
> > > string, set font, color, exc).
> > >
> > > So my question what is advantage to use PDFDocumentGraphics2D from FOP
> > > instead of PDPageContentStream from PDFBox?
> > > PDFDocumentGraphics2D  is an API stable?
> > >
> > > Thank a lot for your answer.
> > >
> > > Regards Angelo
> > >
> > > 2011/10/15 Jeremias Maerki <[email protected]>
> > >
> > > > It turned out PDFDocumentGraphics2D was not so operational anymore.
> > > > Somewhere along the way it broke. I've fixed it again [1] and added a
> > > > usage example [2]. That means you'll have to download FOP Trunk [3].
> > > >
> > > > [1] http://svn.apache.org/viewvc?rev=1183620&view=rev
> > > > [2]
> > > >
> >
> http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/examples/embedding/java/embedding/ExampleJava2D2PDF.java?view=markup
> > > > [3] http://xmlgraphics.apache.org/fop/download.html
> > > >
> > > > But guys, talking about PDFDocumentGraphics2D is getting very
> off-topic
> > > > for this list. Please take that part to
> > [email protected]
> > > > from here.
> > > >
> > > > On 14.10.2011 23:54:56 Angelo zerr wrote:
> > > > > Hi Steve
> > > > >
> > > > > 2011/10/14 Steve Hannah <[email protected]>
> > > > >
> > > > > > >
> > > > > > >
> > > > > > > It works but I have the same problem than PDFBox. I must manage
> x
> > and
> > > > y
> > > > > > > position (increment x and y when I add some text).
> > > > > > >
> > > > > >
> > > > > > It appears that PDFDocumentGraphics2D is just a Graphics2D
> context.
> > > >  Then
> > > > > > presumably you could pass it to the paint() method of any AWT or
> > Swing
> > > > > > component to have that component paint itself to the PDF.   E.g.
> > Just
> > > > use a
> > > > > > JTextPane or a JTable, then pas the PDFDocumentGraphics2D object
> to
> > > > their
> > > > > > paint() methods
> > > > > >
> > > > >
> > > > > Ok thank's for this information.
> > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > > I have started to manage that with PDFBox and it works great
> > > > (increment x
> > > > > > > when text is added, increment y when text is too long for the
> > line,
> > > > etc).
> > > > > > >
> > > > > > > I don't see the advantage to use PDFDocumentGraphics2D instread
> > of
> > > > using
> > > > > > > PDFBox PDPageContentStream.
> > > > > > > I'm afraid with FOP because:
> > > > > > >
> > > > > > > * PDFDocumentGraphics2D  is not documented. It seems that
> nobody
> > > > (google
> > > > > > > tell me that)  has used PDFDocumentGraphics2D to create PDF
> from
> > > > scratch.
> > > > > > >
> > > > > > One google search found some API docs.
> > > > > >
> > > > > >
> > > >
> >
> http://www.jarvana.com/jarvana/view/org/apache/xmlgraphics/fop/1.0/fop-1.0-javadoc.jar!/org/apache/fop/svg/PDFDocumentGraphics2D.html
> > > > > >
> > > > > > Possibly old, but that's what 10 seconds of research found.
> > > > > >
> > > > >
> > > > > When I said documented, I meant that I have no found documentation
> in
> > the
> > > > > FOP WebSite or other blog which explains how to use this class. I
> > have
> > > > not
> > > > > found sample which use this class.
> > > > > Your link is the Javadoc that I have already read because I have
> the
> > > > sources
> > > > > of FOP in my Eclipse Workspace.
> > > > >
> > > > > Regards Angelo
> > > > >
> > > > > >
> > > > > > Best regards
> > > > > >
> > > > > > Steve
> > > > > >
> > > >
> > > >
> > > >
> > > >
> > > > Jeremias Maerki
> > > >
> > > >
> >
> >
> >
> >
> > Jeremias Maerki
> >
> >
>

Reply via email to