Post a complete working sample with the wrong behavior. I can't reproduce
the problem with only what you have provided. I did this program and it
works.

import java.io.*;

import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
import java.awt.*;

public class g2_landscape {
    public static void main(String[] args) {
        Document document = new Document(PageSize.A4, 50, 50, 50, 50);
        Document.compress = false;
        try {
            PdfWriter writer = PdfWriter.getInstance(document, new
FileOutputStream("c:\\g2_landscape.pdf"));
            document.open();
            PdfContentByte cb = writer.getDirectContent();
            Graphics2D g2 = cb.createGraphics(100, 100);
            g2.drawLine(0, 0, 100, 100);
            g2.dispose();
            document.setPageSize(PageSize.A4.rotate());
            document.newPage();
            g2 = cb.createGraphics(100, 100);
            g2.drawLine(0, 0, 100, 100);
            g2.dispose();
            document.close();
            System.out.println("Finished.");
        }
        catch (Exception de) {
            de.printStackTrace();
        }
    }
}

Best Regards,


> -----Original Message-----
> From: Erwin Achermann [SMTP:[EMAIL PROTECTED]]
> Sent: Monday, April 22, 2002 17:05
> To:   jim moore; [EMAIL PROTECTED]
> Subject:      RE: [iText-questions] PdfGraphics2D: unbalanced save/Restore
> Exception
> 
> Hi Jim, 
> you're right they were mismatched but still after fixing that i get wrong
> behaviour. 
> It seems like the the PdfGraphics2D is doing some chaching or
> optimization, concerning the save/resore graphicsState.
> 
>                       // set pageSize of first page before the document
> opens!!
>                       float width =
> (float)pageable.getPageFormat(0).getPaper().getWidth();
>                       float height =
> (float)pageable.getPageFormat(0).getPaper().getHeight();
>                       theDocument.setPageSize(new Rectangle(width,
> height));
>                       // g.setPageSize(pageable.getPageFormat(0)); // this
> was my old implementation
>                   theDocument.open();
>                       g =
> pdfWriter.getDirectContent().createGraphics(width, height, fm);
>                       
>                       for (int  p = 0;  p < pages ; ++p) {
>                               Printable thePage =
> pageable.getPrintable(p);
>                               try {
>                                       // print! 
>                                       thePage.print(g,
> pageable.getPageFormat(p), p);
>       
> System.out.println("PdfJob.createPdf:  page " + p + " printed");
>                                       if (p < pages-1) {
>                                               // next page, please! on its
> proper PageSize 
>                                               //
> g.setPageSize(pageable.getPageFormat(p+1));
>                                               width =
> (float)pageable.getPageFormat(p+1).getPaper().getWidth();
>                                               height =
> (float)pageable.getPageFormat(p+1).getPaper().getHeight();
>                                               theDocument.setPageSize(new
> Rectangle(width, height));
>                                       } // end of if (p < pages-1)
>                                       theDocument.newPage();
>                                       g.dispose();
>                                       g =
> pdfWriter.getDirectContent().createGraphics(width, height, fm);
>                               } catch ( PrinterException e) {
>                                       e.printStackTrace();
>                               }
>                               catch(DocumentException de) {
>                                       de.printStackTrace();
>                               }
>                       } // end of for (int p = 0; p < pages; p++)
>                       g.dispose();
>                       // write the document and clear all references
>                       end();
> 
> The idea is to have a PdfGraphicsObject per page. I therefore issue a
> g.dispose() before each new GraphicsObject is created, and one g.dispose()
> after the last page (outside of the the loop) create-dispose pairs match
> now. But still the paper orientation is not correctly set to the
> respective page orientation. In my onwn old PdfGraphics implementation I
> had the following method: 
>   
>       public void setPageSize(PageFormat pf) {
>               Paper p = pf.getPaper();
>               System.out.println(" Paper: w:"+p.getWidth()+",
> h:"+p.getHeight());
>               System.out.println(" PageFormat: w:"+pf.getWidth()+"
> h:"+pf.getHeight() 
>                                                  + " Orient:
> "+pf.getOrientation());
>               System.out.println(" DocTop: "+doc.top());
>               System.out.println(" Doc.Page.Height:
> "+doc.getPageSize().height());
>               
>               doc.setPageSize(new Rectangle((float)pf.getWidth(),
> (float)pf.getHeight()));
>               
>               // do not use the imageable numbers here. We are drawing
>               // everthing where we are asked to. Our user (caller) must
>               // ensure that margins are respected. 
>               int llx = 0;                        //
> (int)pf.getImageableX();
>               int lly = 0;                        //
> (int)pf.getImageableY();
>               int w =  (int)pf.getWidth();        //
> (int)pf.getImageableWidth();
>               int h =  (int)pf.getHeight();       //
> (int)pf.getImageableHeight();
>               System.out.println(" PageSize: w:"+w+", h:"+h);
>               
>               setClip(llx, lly, w, h);
>       }
>     
> 
> This Method is not aware of the save/restore issues at all but worked
> nicely. Since it seems not so trivial, i would suggest a method along this
> line for the new PdfGraphics2D class too, taking the save/restore
> resposibility off the users shoulders. What do you think? 
> 
> Cheers
> Erwin
> 
> 
> > -----Original Message-----
> > From: jim moore [mailto:[EMAIL PROTECTED]]
> > Sent: Monday, April 22, 2002 5:14 PM
> > To: Erwin Achermann; [EMAIL PROTECTED]
> > Subject: Re: [iText-questions] PdfGraphics2D: unbalanced save/Restore
> > Exception
> > 
> > 
> > On first glance it looks like your PdfGraphics2D creates and 
> > disposes are
> > mismatched. You create one before the for loop. If there are 
> > more pages, you
> > dispose it and create a new one. This new one never gets 
> > disposed though. I
> > think this code below should fix it:
> > 
> >     /**
> >      * <code>createPdf</code> prints a set of pages into the PDF
> >      * file.
> >      */
> >     public void createPdf() {
> > // make an instance of a PdfGraphics Object for the document
> > DefaultFontMapper fm = new DefaultFontMapper();
> > java.awt.Graphics2D g = null;
> > 
> > // don't do anything if pageable is null
> > if (pageable != null) {
> > // read all fonts recognized be iText in system font path
> > fm.insertDirectory(sun.awt.font.NativeFontWrapper.getFontPath(true));
> > 
> > System.out.println("PdfJob.createPdf:  started");
> > int pages = pageable.getNumberOfPages();
> > System.out.println("PdfJob.createPdf:  pages to print: "+pages+"\n");
> > 
> > // set pageSize of first page before the document opens!!
> > float width = (float)pageable.getPageFormat(0).getPaper().getWidth();
> > float height = 
> > (float)pageable.getPageFormat(0).getPaper().getHeight();
> > theDocument.setPageSize(new Rectangle(width, height));
> > 
> > // g.setPageSize(pageable.getPageFormat(0));
> >                   theDocument.open();
> > 
> > for (int  p = 0;  p < pages ; ++p) {
> >     //moved the create into the for loop
> >     g = pdfWriter.getDirectContent().createGraphics(width, 
> > height, fm);
> >     Printable thePage = pageable.getPrintable(p);
> >     try {
> >         // print!
> >         thePage.print(g, pageable.getPageFormat(p), p);
> >         System.out.println("PdfJob.createPdf:  page " + p + " 
> > printed");
> >         if (p < pages-1) {
> >             // next page, please! on its proper PageSize
> >             width =
> > (float)pageable.getPageFormat(p+1).getPaper().getWidth();
> >             height =
> > (float)pageable.getPageFormat(p+1).getPaper().getHeight();
> >             theDocument.setPageSize(new Rectangle(width, height));
> >         } // end of if (p < pages-1)
> > 
> > 
> >         theDocument.newPage();
> >     } catch ( PrinterException e) {
> >     e.printStackTrace();
> > }
> > catch(DocumentException de) {
> >   de.printStackTrace();
> > }
> > 
> >     g.dispose(); //dispose it here when you are done with it
> > } // end of for (int p = 0; p < pages; p++)
> > // write the document and clear all references
> > end();  // = theDocument.close()
> > } // end of if (pageable)
> >     } // end createPdf
> > 
> > 
> > _______________________________________________
> > iText-questions mailing list
> > [EMAIL PROTECTED]
> > https://lists.sourceforge.net/lists/listinfo/itext-questions
> > 
> 
> _______________________________________________
> iText-questions mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/itext-questions

_______________________________________________
iText-questions mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/itext-questions

Reply via email to