web-dev-qa-db-fra.com

iText Image Redimensionner

J'ai un filigrane que je voudrais mettre dans mon pdf. Le filigrane est une image .bmp de 2290 x 3026. Je ne parviens pas à redimensionner cette image à la taille de la page. Est-ce que quelqu'un a des suggestions?

Document document = new Document(); 
PdfWriter.getInstance(document, new FileOutputStream("result.pdf")); 
document.open(); 
document.add(new Paragraph("hello")); 
document.close(); 
PdfReader reader = new PdfReader("result.pdf"); 
int number_of_pages = reader.getNumberOfPages(); 
PdfStamper pdfStamper = new PdfStamper(reader, new FileOutputStream("result_watermark.pdf")); 
// Get the PdfContentByte type by pdfStamper. 
Image watermark_image = Image.getInstance("abstract(0307).bmp"); 
int i = 0; 
watermark_image.setAbsolutePosition(0, 0);
watermark_image.scaleToFit(826, 1100);
System.out.println(watermark_image.getScaledWidth());
System.out.println(watermark_image.getScaledHeight()); 
PdfContentByte add_watermark; 
while (i < number_of_pages) { 
    i++; 
    add_watermark = pdfStamper.getUnderContent(i); 
    add_watermark.addImage(watermark_image); 
} 
pdfStamper.close();

Voici la sortie pour les méthodes getScaled().

826.0 - Width
1091.4742 - Height

Je voudrais partager la photo du pdf avec vous mais malheureusement, je ne peux pas.

Devrais-je essayer d'utiliser un fichier .jpg à la place? Je ne sais pas vraiment comment iText gère les différentes extensions d'image.

16
Failsafe

Vous pouvez utiliser une autre approche: redimensionner l’image "manuellement" (c’est-à-dire via un logiciel de traitement d’image) au lieu d’être programmée via iText. 

Étant donné que la dernière dimension semble codée en dur, vous pouvez utiliser une image déjà redimensionnée et gagner du temps de traitement à chaque fois que vous filigrane de documents PDF.

7
Alexis Pigeon

Je le fais comme ça:

//if you would have a chapter indentation
int indentation = 0;
//whatever
Image image = coolPic;

float scaler = ((document.getPageSize().getWidth() - document.leftMargin()
               - document.rightMargin() - indentation) / image.getWidth()) * 100;

image.scalePercent(scaler);

Peut-être à l'ancienne mais ça marche pour moi;)

45
Franz Ebner

utilisation

watermark_image.scaleAbsolute(826, 1100);

au lieu de

watermark_image.scaleToFit(826, 1100);
17
MGDroid

Juste au cas où si la hauteur de l'image dépasse la hauteur du document:

float documentWidth = document.getPageSize().width() - document.leftMargin() - document.rightMargin();
float documentHeight = document.getPageSize().height() - document.topMargin() - document.bottomMargin();
image.scaleToFit(documentWidth, documentHeight);
13
Roman Popov

vous pouvez utiliser 

imageInstance.scaleAbsolute(requiredWidth, requiredHeight);
10
Coach005
Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream("F:\\Directory1\\sample1.pdf"));
    document.open();

    Image img = Image.getInstance("F:\\Server\\Xyz\\WebContent\\ImageRestoring\\Rohit.jpg");
    img.scaleToFit(200, 200);
    document.add(new Paragraph("Sample 1: This is simple image demo."));
    document.add(img);
    document.close();
    System.out.println("Done");

// Le programme ci-dessus fonctionne parfaitement, avec la mise à l'échelle de l'image. Nous espérons que vous la trouverez également parfaite et que nous pouvons redimensionner tout format d'image.

2
Paresh Jain

Parfois, il est utile de ne redimensionner down que si l'image est trop grande et de ne pas la redimensionner si elle convient. En d'autres termes, la mise à l'échelle ne se produira que si la largeur ne correspond pas à la largeur disponible ou si la hauteur ne correspond pas à la hauteur disponible. Cela peut être fait comme suit:

float scaleRatio = calculateScaleRatio(iTextDocument, image);
if (scaleRatio < 1F) {
    image.scalePercent(scaleRatio * 100F);
}

avec cette méthode calculateScaleRatio:

/**
 * Calculates the scale ratio required to fit the supplied image in the supplied PDF document
 *
 * @param iTextDocument
 *         PDF to fit image in.
 * @param image
 *         Image to be converted into a PDF.
 * @return The required scale percentage or 100% if no scaling is required to fit the image.
 */
private float calculateScaleRatio(Document iTextDocument, Image image) {
    float scaleRatio;
    final float imageWidth = image.getWidth();
    final float imageHeight = image.getHeight();
    if (imageWidth > 0 && imageHeight > 0) {
        final Rectangle pageSize = iTextDocument.getPageSize();

        // First get the scale ratio required to fit the image width
        final float pageWidth = pageSize.getWidth() - iTextDocument.leftMargin() - iTextDocument.rightMargin();
        scaleRatio = pageWidth / imageWidth;

        // Now get the scale ratio required to fit the image height - and if smaller, use this instead
        final float pageHeight = pageSize.getHeight() - iTextDocument.topMargin() - iTextDocument.bottomMargin();
        final float heightScaleRatio = pageHeight / imageHeight;
        if (heightScaleRatio < scaleRatio) {
            scaleRatio = heightScaleRatio;
        }

        // Do not upscale - if the entire image can fit in the page, leave it unscaled.
        if (scaleRatio > 1F) {
            scaleRatio = 1F;
        }
    } else {
        // No scaling if the width or height is zero.
        scaleRatio = 1F;
    }

    return scaleRatio;
}
0
Steve Chambers