2017-08-29 3 views

Répondre

1
public void addTemplate(PdfTemplate template, 
    double a, double b, double c, double d, double e, double f) 

Les six valeurs a, b, c, d, e et f sont des éléments d'une matrice qui comporte trois lignes et trois colonnes.

enter image description here

Vous pouvez utiliser cette matrice pour exprimer une transformation dans un système à deux dimentionnelle.

enter image description here

La réalisation de ce résultat de multiplication dans ce:

x' = a * x + c * y + e 
y' = b * x + d * y + f 

La troisième colonne dans la matrice est fixée: vous travaillez en deux dimensions, de sorte que vous n'avez pas besoin de calculer une nouvelle coordonnée z. Lorsque vous étudiez la géométrie analytique à l'école secondaire, vous avez probablement appris à appliquer des transformations aux objets. En PDF, nous utilisons une approche légèrement différente: au lieu de transformer des objets, nous transformons le système de coordonnées. La valeur e et la valeur f peuvent être utilisées pour une traduction. Les valeurs a, b, c et d peuvent être utilisées pour une opération de rotation et/ou de mise à l'échelle.

enter image description here

Par défaut est la matrice de transformation actuelle (CTM):

enter image description here

Avec la méthode addTemplate(), vous pouvez ajouter un formulaire XObject à une toile et définir une position à l'aide e, f, par exemple:

canvas.addTemplate(template, 36, 36); 

Ce w ajouter template à la coordonnée x = 36; y = 36.

En introduisant a, b, c et d, vous pouvez également faire pivoter et/ou l'échelle de la template.

Mise à jour: comme mentionné dans les commentaires, vous pouvez utiliser les méthodes surchargées qui acceptent un paramètre AffineTransform si vous ne l'aimez pas l'algèbre de la matrice de transformation.

+0

Vous pourriez conseiller à l'OP d'utiliser une surcharge avec un paramètre 'AffineTransform' s'il n'est pas à l'aise avec les matrices simples. – mkl

+0

OK, @mkl: fait! –

+0

Merci pour vous. Vous avez vraiment sauvé ma journée. Je fais enfin l'échelle et je travaille en même temps. – dingjsh

1

le code ci-dessous a fait l'affaire, merci pour les gars qui m'ont aidé.

 FileInputStream pdfInput = new FileInputStream(pdf); 
     PdfReader pdfReader = new PdfReader(pdfInput); 
     for (int index = 1; index <= pdfReader.getNumberOfPages(); index++) { 
      main.newPage(); 
      PdfImportedPage page = pdfWriter.getImportedPage(pdfReader, 
       index); 
      Rectangle pagesize = pdfReader.getPageSizeWithRotation(index); 
      float oWidth = pagesize.getWidth(); 
      float oHeight = pagesize.getHeight(); 
      float scale = getScale(oWidth, oHeight); 
      float scaledWidth = oWidth * scale; 
      float scaledHeight = oHeight * scale; 
      int rotation = pagesize.getRotation(); 

      AffineTransform transform = new AffineTransform(scale, 0, 0, scale, 0, 0); 
      switch (rotation) { 
       case 0: 
        cb.addTemplate(page, transform); 
        break; 
       case 90: 
        AffineTransform rotate90 = new AffineTransform(0, -1f, 1f, 0, 0, scaledHeight); 
        rotate90.concatenate(transform); 
        cb.addTemplate(page, rotate90); 
        break; 
       case 180: 
        AffineTransform rotate180 = new AffineTransform(-1f, 0, 0, -1f, scaledWidth, 
         scaledHeight); 
        rotate180.concatenate(transform); 
        cb.addTemplate(page, rotate180); 
        break; 
       case 270: 
        AffineTransform rotate270 = new AffineTransform(0, 1f, -1f, 0, scaledWidth, 0); 
        rotate270.concatenate(transform); 
        cb.addTemplate(page, rotate270); 
        break; 
       default: 
        cb.addTemplate(page, scale, 0, 0, scale, 0, 0); 
      } 
     } 

private static float getScale(float width, float height) { 
    float scaleX = PageSize.A4.getWidth()/width; 
    float scaleY = PageSize.A4.getHeight()/height; 
    return Math.min(scaleX, scaleY); 
}