Vous devez vérifier la zone de recadrage de la page et positionner votre texte par rapport à cela. Notez également que le coin inférieur gauche n'a pas besoin d'être 0,0 et que les pages peuvent être pivotées.
J'ai vu les pages du paysage ont généré trois façons:
11 "x8.5"
8,5x11 @ 90 degrés 8,5x11 @ 270 degrés
(heureusement que je ne l'ai jamais vu 11x8.5 @ 180, ou je pourrais avoir à gravement blesser quelqu'un sur des principes généraux)
Les pages de "portrait" sont presque universellement générées comme 8.5 "x11" (ou quoi que vos mesures pourraient être). Dans une décennie de travail avec le format PDF, je n'ai pas encore vu de page de portrait tournée. Légal, mais stupide.
Alors, pour obtenir votre bbox correcte et faire pivoter votre texte en position, vous auriez besoin de quelque chose comme:
final double TOP_OFFSET = 10.0 + IMAGE_HEIGHT; // or whatever
final double RIGHT_OFFSET = 15.0 + IMAGE_WIDTH;
PdfReader reader = new PdfReader(path);
PdfStamper stamper = new PdfStamper(reader, outStream);
Rectangle cropBox = reader.getCropBox(1);
int rotation = reader.getPageRotation(1);
PdfContentByte content = stamper.getOverContent(1); // first page
AffineTransform transform;
double xOffset, yOffset;
switch(rotation) {
case 0:
xOffset = cropBox.getRight() - RIGHT_OFFSET;
yOffset = cropBox.getTop() - TOP_OFFSET;
transform = AffineTransform.getTranslateInstance(xOffset, yOffset);
break;
case 90:
// some other transformations here
break;
case 180:
// and here
break;
case 270:
// and here.
break;
};
content.transform(transform);
content.addImage(waterMarkImage);
stamper.close();
Je trouve souvent que je dois faire sauter la taille de la page par Un peu pour découvrez où je vais mal avec mes transformations. Dites +1000 à chaque bordure de la boîte de média (et recadrez si présent).
PdfDictionary pageDict = reader.getPageN(1);
PdfArray boxes[] = {pageDict.getAsArray(PdfName.MEDIABOX), pageDict.getAsArray(PdfName.CROPBOX) };
float mods[] = {-1000, -1000, 1000, 1000 }
for (int i = 0; i < boxes.length; ++i) {
if (boxes[i] == null)
continue; // crop boxes are optional
for (int j = 0; j < 4; ++j) {
PdfNumber curVal = boxes[i].getAsNumber(j);
PdfNumber newVal = curVal.getFloat() + mods[j];
boxes[i].set(j, newVal);
}
}
Maintenant, quand vous bousiller vos transformations (je fais inévitablement), vous serez en mesure de voir comment vous foiré, et le fixer.
Quels sont les formats de page qui posent problème? – Jes