This is a transformation order problem. The solution is to change in
PdfGraphics2D:

    public void drawString(String s, float x, float y) {
        AffineTransform at = getTransform();
        AffineTransform at2 = getTransform();
        at2.translate(x, y);
        at2.concatenate(font.getTransform());
        setTransform(at2);
        AffineTransform inverse = this.normalizeMatrix();
        AffineTransform flipper = AffineTransform.getScaleInstance(1,-1);
        inverse.concatenate(flipper);
        double[] mx = new double[6];
        inverse.getMatrix(mx);
        cb.beginText();
        cb.setFontAndSize(baseFont, fontSize);
        cb.setTextMatrix((float)mx[0], (float)mx[1], (float)mx[2],
(float)mx[3], (float)mx[4], (float)mx[5]);
        cb.showText(s);
        cb.endText();
        setTransform(at);
    }

Best Regards,
Paulo Soares 

> -----Original Message-----
> From: Erwin Achermann [SMTP:[EMAIL PROTECTED]]
> Sent: Wednesday, April 24, 2002 10:10
> To:   iText ML (E-Mail)
> Subject:      [iText-questions] Error with derived Fonts
> 
> Hi Paulo and other iText-ers,
> 
> derived Fonts carry along an AffineTransform (e.g. for fancy things like
> backwards leaning font) 
> I fixed this almost by subclassing PdfGraphics2D. But there remains a
> discrepancy between java.awt.Graphics2D and my
> com.lowagie.text.pdf.PdfGraphics in placing Strings, which I really do not
> understand. 
> 
> In the following two examples, uncommenting the global transform yield the
> same picture on PDF as well as on screen, but with the global transform
> the two pictures differ (obviously by the shearing amount is interpreted
> differently)... but I don't see where this should/does/does not happen. 
> 
> Thanks for your comments
> Cheers
> Erwin
> 
> ----------------- derived font on screen
> /*
>  * How does java.awt.Graphics2D deal with derived fonts, and where
>  * dose it place it? 
>  */
> 
> import java.io.FileOutputStream;
> import java.io.IOException;
> import java.awt.geom.AffineTransform;
> import java.awt.*;
> 
> 
> import com.lowagie.text.*;
> import com.lowagie.text.pdf.PdfWriter;
> import com.lowagie.text.pdf.PdfContentByte;
> 
> import java.awt.*;
> import javax.swing.*;
> import java.awt.event.*;
> 
> 
> public class DerivedScreen extends JFrame  {
>     
>       public DerivedScreen() 
>       {
>               super("DerivedScreen");
>               setSize(500,500); // SIZE of the Graphics
> 
>               MyPane mine = new MyPane();
>               getContentPane().add(mine);
>               // ExitWindow exit = new ExitWindow();
>               // addWindowListener(exit);
> 
>               setDefaultCloseOperation(EXIT_ON_CLOSE);
>       }
>       
> 
>     public static void main(String[] args) {
>     
>               DerivedScreen screen = new DerivedScreen();
>               screen.show();
>       }
> }
> 
> class MyPane extends JPanel 
> {
>       public void paintComponent(Graphics g) {
>               Graphics2D g2d = (Graphics2D)g;
>               
>               java.awt.Font myFont = new java.awt.Font("Arial",
> java.awt.Font.PLAIN, 12);
>               
>                       
>               g2d.setFont(myFont);
>               g2d.drawString("This is arial plain",10,15);
> 
>               AffineTransform trafo =
> AffineTransform.getShearInstance(0.5f,0f);
>               myFont = myFont.deriveFont(trafo);
>                       
>               g2d.transform(trafo);    /////////////// leaving a global
>       
> /////////////// transform away,
>       
> /////////////// yields the same
>       
> /////////////// picture on pdf and on
>       
> /////////////// screen
> 
>               g2d.setFont(myFont);
>               g2d.drawString("This is sheared arial plain",10,30);
>               g2d.drawLine(0,0,20,20);
>               
>       }
> }
> 
> // class ExitWindow extends WindowAdapter 
> // {
> //    public void windowClosing(WindowEvent e) 
> //    {
> //            System.out.println(" terminating ");
> //            System.exit(0);
> //    }
> // }
> 
> ----------------- derived font in pdf
> /*
>  * How does com.lowagie.text.pdf.PdfGraphics deal with derived fonts, and
> where
>  * dose it place it? 
>  *
>  */
> 
> import java.io.FileOutputStream;
> import java.io.IOException;
> import java.awt.geom.AffineTransform;
> import java.awt.*;
> 
> 
> import com.lowagie.text.*;
> import com.lowagie.text.pdf.PdfWriter;
> import com.lowagie.text.pdf.PdfContentByte;
> 
> 
> 
> class DerivedPdf  {
>     
>     public static void main(String[] args) {
>         
>         System.out.println("Example: derived fonts");
>         
>         // step 1: creation of a document-object
>         Document document = new Document();
>         Document.compress = false;
> 
>               java.awt.Font myFont = new java.awt.Font("Arial",
> java.awt.Font.PLAIN, 12);
>               
>         
>         try {
>             // step 2:
>             // we create a writer that listens to the document
>             // and directs a PDF-stream to a file
>             
>             PdfWriter writer = PdfWriter.getInstance(document, new
> FileOutputStream("d:/temp/fontderive.pdf"));
>             
>             // step 3: we open the document
>             document.open();
>             
>                       PdfContentByte cb = writer.getDirectContent();
>             Graphics2D g2 = cb.createMyGraphics(500, 500); // SIZE of
>       
> // the
>       
> // Graphics 
>                       
>                       g2.setFont(myFont);
>                       g2.drawString("This is arial plain",10,15);
> 
>                       AffineTransform trafo =
> AffineTransform.getShearInstance(0.5f,0f);
>                       myFont = myFont.deriveFont(trafo);
>                       
>                       g2.transform(trafo); /////////////// leaving a
> global
>       
> /////////////// transform away,
>       
> /////////////// yields the same
>       
> /////////////// picture on pdf and on
>       
> /////////////// screen
>                       
>                       g2.setFont(myFont);
>                       g2.drawString("This is sheared arial plain",10,30);
>                       g2.drawLine(0,0,20,20);
> 
>         }
>         catch(DocumentException de) {
>             System.err.println(de.getMessage());
>         }
>         catch(IOException ioe) {
>             System.err.println(ioe.getMessage());
>         }
>         
>         // step 5: we close the document
>         document.close();
>     }
> }
> 
> 
> ----------------- my PdfGraphics subclassing PdfGraphics2D
> /*
>  * $Id: PdfGraphics.java,v 1.1 2002/04/23 12:44:39 erwin.achermann Exp
> erwin.achermann $ 
>  *
>  * $Date: 2002/04/23 12:44:39 $
>  *
>  */
> 
> package com.lowagie.text.pdf;
>       
> import java.awt.geom.AffineTransform;
> 
> 
> /**
>  * This class an extension of com.lowagie.text.pdf.PdfGraphics2D
>  * The only thing that we change is, that we want to retaint the
>  * transformAttibute of a font 
>  *
>  */
> public class PdfGraphics extends PdfGraphics2D {
> 
>     PdfGraphics(PdfContentByte cb, float width, float height, FontMapper
> fontMapper) {
>         super(cb,width,height,fontMapper);
>         fontTrafo = new AffineTransform();
>        }
>       
>       AffineTransform fontTrafo;
>       
> 
>     public void setFont(java.awt.Font p_Font) {
>               fontTrafo = p_Font.getTransform();
> //            // fetch old font's transform attribute ...
> //            AffineTransform a = getFont().getTransform();
> //            // apply the old fonts trafo and the new fonts inverse trafo
> //            try {
> //
> a.concatenate(p_Font.getTransform().createInverse());                  
> //            } catch (java.awt.geom.NoninvertibleTransformException e) {
> //                    e.printStackTrace();
> //            } // end of try-catch
> //            transform(a);
> //            System.out.println(" set font: "+p_Font+" trafo: " + a);
> //            // finally set the new font
>               super.setFont(p_Font);
>     }
> 
>       public void drawString(String s, float x, float y) {
> //            transform(fontTrafo);
> //            super.drawString(s,x,y);
> //    try {
> //                    transform(fontTrafo.createInverse());
> //            } catch (java.awt.geom.NoninvertibleTransformException e) {
> //                    e.printStackTrace();
> //            } // end of try-catch
> 
>               AffineTransform sav = getTransform();
>               cb.saveState();
>               transform(fontTrafo);
>               super.drawString(s,x,y);
>               cb.restoreState();
>               setTransform(sav);
>       }
> 
> } // end class PdfGraphics
> 
> 
> _______________________________________________
> 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