2013-08-06 1 views
0

Lorsque vous placez des objets sur une page pdf en utilisant le positionnement absolu (dans un PdfContentByte je devine?), Il est positionné dans un système de coordonnées qui commence dans le coin inférieur gauche.Comment retourner un système de coordonnées dans iText?

Je voudrais retourner les coordonnées d'une manière que le système commence dans le coin supérieur gauche. Je ferais le retournement avant d'ajouter du contenu à la page.

J'ai essayé d'utiliser cette

cb.concatCTM(1f, 0f, 0f, -1f, 0f, PageSize.A4.getHeight());

mais les objets ajoutés par la suite ont été éjectés (ce que je ne voudrais pas arriver).

+0

Si vous inversez les systèmes de coordonnées dans les fichiers PDF, vous en retournez également automatiquement le contenu. Si vous voulez simplement l'origine en haut à gauche et que vous pouvez travailler avec des coordonnées y négatives, une simple traduction ferait l'affaire. – mkl

Répondre

2

Dans les cas où vous souhaitez que l'origine du système de coordonnées se trouve dans le coin supérieur gauche, il est possible d'utiliser des calculs simples pour modifier les coordonnées. L'utilisation d'un CTM différent à cette fin est plus complexe et peut conduire à toutes sortes d'effets secondaires, comme vous l'avez expérimenté vous-même. Par exemple: faire pivoter le CTM fait également tourner le contenu (le texte peut être à l'envers, en miroir, ...). Pourquoi ne pas simplement utiliser une méthode qui recalcule les coordonnées. Par exemple: vous voulez avoir une coordonnée (10, 10) compté à partir du haut de la page, puis utilisez transformer (pagesize, y) où la méthode de transformation est définie comme ceci:

public float transform(Rectangle pagesize, float y) { 
    return pagesize.top() - y; 
} 

De cette façon, vous pouvez faire des choses comme:

float x = 50; 
float y = transform(pagesize, 50); 
table.writeSelectedRows(0, 10, x, y, canvas); 

Personnellement, je pense qu'il est une mauvaise idée de ne pas respecter le système de coordonnées tel que défini dans la norme ISO-32000-1, parce que vous préférez travailler avec un système de coordonnées où l'augmentation des valeurs impair Y pointent vers le bas au lieu de haut (c'est tellement contre-intuitif), mais si vous insistez pour le faire, vous ne devriez pas altérer le CTM à moins que votre PDF fu soit vraiment grand.

+1

Merci! J'ai fini par faire ça ... Bon c'est tout pour mon petit projet et depuis que j'ai lu de haut en bas et non l'inverse, les réglages d'origine étaient contra-intuitifs (pour un amateur comme moi) ... ne croyez pas que quelqu'un va lire mon code sauf moi quand même. : D – Karlovsky120

+0

Tout ce qui fonctionne le mieux pour vous est bien ;-) –

3

Toute transformation que vous appliquez au PDF système de coordonnées ne change pas seulement la façon dont vous pouvezfournir les coordonnées de un point sur la page; à la place, il modifie également le système de coordonnées dans lequel une visionneuse PDF dessine ses objets. Par exemple.

Figure 13 - Effects of Coordinate Transformations

(section 8.3.3 Transformations commune dans ISO 32000-1)

Si vous Flip les coordonnées d'une manière que le système commence dans le coin supérieur gauche, par conséquent, vous aussi flip les objets dra wn. Dans le cas d'objets texte, vous pouvez annuler localement le retournement au moyen de matrices de texte retournées in situ.

Cela signifie tout à fait un problème, cependant. S'il suffirait au contraire d'avoir l'origine dans le coin supérieur gauche avec des coordonnées y négatives sur la page, je vous proposerais simplement de traduire le système de coordonnées.

0

Tout d'abord: pardonnez mon anglais.Je suis gars espagnol xD

Voici ma solution:

Je cherchais la même chose. Je voulais avoir un point d'origine dans le coin supérieur gauche.

Eh bien, vous ne pouvez pas le changer mais vous pouvez faire autre chose.

Si vous voulez la hauteur de CHAQUE PAGE, vous devez obtenir la corbeille de la page de la classe PdfReader.

Ainsi, par exemple, si vous voulez obtenir la position verticale « y = 60 » origine considèrant au coin supérieur gauche vous devez faire ceci:

PdfReader reader = new PdfReader("yourFile.pdf"); 
Float y = reader.getCropBox(pageNumber).getHeight()-60; 

Ceci est très utile dans le cas où vous avoir un document pdf avec différentes pages de hauteur.

Questions connexes