IText Image Resize

У меня есть водяной знак, который я хотел бы добавить в свой pdf файл. Водяной знак - это изображение .bmp и составляет 2290 x 3026. У меня много проблем, пытаясь изменить размер этого изображения, чтобы он соответствовал странице, есть ли у кого-нибудь какие-либо предложения?

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

Вот результат для методов getScaled().

826.0 - Width
1091.4742 - Height

Я бы поделился фотографией с вами, ребята, но, к сожалению, я не могу.

Должен ли я попытаться использовать .jpg вместо этого? Я действительно не знаю, насколько хорошо iText обрабатывает различные расширения изображений.

Ответы

Ответ 1

Вы можете использовать другой подход: изменить размер изображения "вручную" (т.е. через программное обеспечение для обработки изображений) вместо программного использования через iText.

Поскольку окончательное измерение кажется жестко запрограммированным, вы можете использовать уже измененное изображение и экономить время обработки каждый раз, когда вы делаете водяные знаки PDF-документов.

Ответ 2

Я делаю это так:

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

Возможно, старый стиль, но он работает для меня;)

Ответ 3

использование

watermark_image.scaleAbsolute(826, 1100);

вместо

watermark_image.scaleToFit(826, 1100);

Ответ 4

На всякий случай, если высота изображения превышает высоту документа:

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

Ответ 5

вы можете использовать

imageInstance.scaleAbsolute(requiredWidth, requiredHeight);

Ответ 6

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

//Вышеупомянутая программа работает отлично, с масштабированием изображения, надеюсь, что вы тоже найдете ее идеальной, и мы можем масштабировать любой формат изображения.

Ответ 7

Иногда полезно уменьшать масштаб, только если изображение слишком велико, и не увеличивать, если изображение соответствует ОК. Другими словами, масштабирование произойдет только в том случае, если ширина не соответствует доступной ширине или высота не соответствует доступной высоте. Это можно сделать следующим образом:

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

с этим 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;
}