2010-12-04 3 views
1

Lorsque j'essaie d'ajouter une image en tant que filigrane à la position absolue alors que absoluteX = 10f et absolu y = rectangle.getLeft() + (rectangle.getWidth() -image.getPlainWidth());Problème lors de l'insertion d'un filigrane dans un fichier pdf avec une taille de page variable dans iText

Pour certaines tailles de page, l'image ne doit pas être ajoutée à absoluteX = 10f pour l'augmenter à 300f ou plus. Comment chercher correctement la position absolue pour la gauche.

+0

Quels sont les formats de page qui posent problème? – Jes

Répondre

0

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.

Questions connexes