2016-05-29 5 views
1

Ich habe ein Problem, ich weiß nicht wirklich, wie ich mit ... fortfahren soll Wenn ich ein Rechteck auf einer Seite (der blaue im Bild) zeichnen und dann das gleiche Rechteck auf eine zeichnen Vorlage auf der gleichen Seite (die grüne), das Rechteck auf der Vorlage ist größer. Hat jemand eine Ahnung WARUM?Rechteckgröße auf Vorlage in itext verwirrend

Führen Sie die folgende Klasse:

public class RectangleTemplate { 

public static void main(String[] args){ 



    try { 
     File file = new File("rectagnleTemplate_" + System.currentTimeMillis() + ".pdf"); 
     FileOutputStream fileout = new FileOutputStream(file); 
     Document document = new Document(); 
     PdfWriter writer = PdfWriter.getInstance(document, fileout); 


     document.open(); 

     Rectangle rectangleOnPage = new Rectangle(20, 20, 100, 100); 
     rectangleOnPage.setBorderColor(BaseColor.BLUE); 
     rectangleOnPage.setBorder(Rectangle.BOX); 
     rectangleOnPage.setBorderWidth(2); 

     PdfContentByte canvas = writer.getDirectContent(); 
     canvas.rectangle(rectangleOnPage); 
     canvas.stroke(); 

     PdfTemplate template = canvas.createTemplate(document.getPageSize().getWidth(), document.getPageSize() 
       .getHeight()); 

     template.rectangle(rectangleOnPage.getLeft(), rectangleOnPage.getBottom(), rectangleOnPage.getRight(), 
       rectangleOnPage.getTop()); 

     template.setColorFill(BaseColor.GREEN 
          ); 

     template.fill(); 
     template.stroke(); 

     canvas.addTemplate(template, -10,-10); 



     canvas.sanityCheck(); 
     canvas.stroke(); 




     document.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (DocumentException e) { 
     e.printStackTrace(); 
    } 

    } 
} 

das grüne Rechteck so groß wie die blau sein sollte:

enter image description here

Antwort

0

Dies ist in der Tat verwirrend: iText 1, 2 und 5 organisch wuchs : verschiedene Menschen beigetragen Code und als Ergebnis gibt es einen Unterschied zwischen der Art und Weise ein Rectangle Objekt erstellt und die Art, wie Sie ein Rechteck mit der rectangle()-Methode definieren.

einen Blick auf die docs API Nehmen:

public Rectangle(float llx, float lly, float urx, float ury) 

Sie müssen die Koordinaten der linken unteren und der oberen rechten Ecke:

Der Rectangle Konstruktor sieht wie folgt aus.

Die rectangle Methode sieht wie folgt aus:

public void rectangle(float x, float y, float w, float h) 

In diesem Fall müssen Sie nur die von der unteren linken Ecke koordinieren passieren. Die anderen beiden Parameter sind die Breite und die Höhe.

Diese Zeile im Code ist falsch:

template.rectangle(
    rectangleOnPage.getLeft(), rectangleOnPage.getBottom(), 
    rectangleOnPage.getRight(), rectangleOnPage.getTop()); 

Es sollte:

template.rectangle(
    rectangleOnPage.getLeft(), rectangleOnPage.getBottom(), 
    rectangleOnPage.getWidth(), rectangleOnPage.getHeight()); 

Dieses Problem in iText 7. iText 7 befestigt ist, ist eine komplette Neufassung von iText durch ein eingespieltes Team .

+0

ah vielen Dank! – blauerelephant