it-swarm.com.de

iText Image Größe ändern

Ich habe ein Wasserzeichen, das ich in mein pdf einfügen möchte. Das Wasserzeichen ist ein .bmp-Bild und hat die Größe 2290 x 3026. Ich habe Probleme beim Versuch, dieses Bild an die Seite anzupassen. Hat jemand Vorschläge?

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();

Hier ist die Ausgabe für die getScaled()-Methoden.

826.0 - Width
1091.4742 - Height

Ich würde das Bild der PDF mit Ihnen teilen, aber leider kann ich es nicht.

Sollte ich stattdessen versuchen, ein .jpg zu verwenden? Ich weiß nicht wirklich, wie gut iText mit verschiedenen Bilderweiterungen umgeht.

16
Failsafe

Sie können einen anderen Ansatz verwenden: Ändern Sie die Größe des Bildes "manuell" (d. H. Durch eine Bildverarbeitungssoftware), statt programmgesteuert über iText. 

Da die endgültige Bemaßung hartcodiert erscheint, können Sie ein bereits verkleinertes Bild verwenden und sich jedes Mal etwas Verarbeitungszeit sparen, wenn Sie PDF - Dokumente mit Wasserzeichen versehen.

7
Alexis Pigeon

Ich mache das so:

//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);

Vielleicht im alten Stil, aber es funktioniert für mich;)

45
Franz Ebner

benutzen

watermark_image.scaleAbsolute(826, 1100);

anstatt

watermark_image.scaleToFit(826, 1100);
17
MGDroid

Für den Fall, dass die Bildhöhe die Dokumenthöhe überschreitet:

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

sie können verwenden 

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");

// Das obige Programm läuft perfekt, mit der Skalierung des Bildes. Ich hoffe, Sie finden es auch perfekt und wir können jedes Bildformat skalieren.

2
Paresh Jain

Manchmal ist es nützlich, down nur zu skalieren, wenn das Bild zu groß ist, und nicht zu vergrößern, wenn das Bild in Ordnung ist. Mit anderen Worten, die Skalierung erfolgt nur, wenn die Breite nicht in die verfügbare Breite passt oder die Höhe nicht in die verfügbare Höhe passt. Dies kann wie folgt durchgeführt werden:

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

mit dieser calculateScaleRatio Methode:

/**
 * 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