2012-06-20 171 views
15

Tengo una marca de agua que me gustaría poner en mi pdf. La marca de agua es una imagen .bmp, y mide 2290 x 3026. Tengo muchos problemas para intentar cambiar el tamaño de esta imagen para que se ajuste a la página. ¿Alguien tiene alguna sugerencia?iText Image Resize

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

Aquí está la salida para los métodos getScaled().

826.0 - Width 
1091.4742 - Height 

Compartí la imagen del pdf con ustedes, pero desafortunadamente no puedo.

¿Debo intentar usar un .jpg en su lugar? Realmente no sé qué tan bien iText maneja diferentes extensiones de imagen.

+0

puede agregar una captura de pantalla de PDF. Ver http://meta.stackexchange.com/questions/75491/how-to-upload-an-image-to-a-post o http://meta.stackexchange.com/questions/57125/inserting-an-image -in-a-pre-tag – Ritesh

+0

Ese no es el problema. La marca de agua que estoy agregando es una marca de agua de la compañía, y no puedo simplemente pasarla por ahí ... Bueno, me dijeron que no lo haga de todos modos. – Failsafe

+1

¿Ha intentado escalar la imagen manualmente, en lugar de hacerlo mediante programación, y usar la imagen escalada manualmente en su código? dado que parece codificar la dimensión escalada, eso le ahorrará algo de procesamiento cada vez que filtre documentos PDF. –

Respuesta

7

Se podría utilizar otro enfoque: cambiar el tamaño de la imagen "manualmente" (es decir, a través de un procesamiento de imágenes software) en lugar de programáticamente a través de iText.

Dado que la última dimensión parece estar codificada, puede usar una imagen ya redimensionada y ahorrarse algo de tiempo de proceso cada vez que filtre documentos PDF.

40

lo hago así:

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

Tal estilo antiguo pero funciona para mí;)

+0

Desafortunadamente eso no funciona para mí. Lo más cerca que he estado de mi vida fue hacer: watermark_image.scalePercent (110 * 72/300); – Failsafe

+0

¿Puedes describir exactamente cuál es tu problema? el escalado no funciona, está bien, pero ¿cuál es su resultado con el escalador que usa en ese momento? –

+1

Este enfoque me funcionó mejor que la idea propuesta por Alexis porque la escala predeterminada tiene una resolución bastante baja, por lo que si cambias el tamaño de la imagen original para que se adapte al documento pdf, obtienes una imagen pixelada de baja resolución equivalente a 72 ppp. Pero con la escala, puede usar una imagen mucho más grande ajustada para ajustarse pero conservando la alta resolución. – Ted

17

uso

watermark_image.scaleAbsolute(826, 1100); 

en lugar de

watermark_image.scaleToFit(826, 1100); 
10

puede utilizar

imageInstance.scaleAbsolute(requiredWidth, requiredHeight); 
+0

¡Gracias @ Coach005, simple pero excelente !!!, ha votado a favor. aplausos –

8

Sólo en caso de si la altura de la imagen es superior a la altura del documento:

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

Esto es bueno. Simplemente escribiendo 'image.scaleToFit (PageSize.A4.getWidth(), PageSize.A4.getHeight());' puede hacer que las imágenes más grandes salgan del borde de la página –

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

// El programa anterior funciona perfectamente, con la escala de la imagen, esperamos que también lo encuentre perfecto, y podemos escalar cualquier formato de imagen.

+0

¿Puede comentar por qué esto resuelve un problema de hace cinco años con un documento aceptado? responder mejor que las otras respuestas dadas? –

+0

Amigo, esto fue por un trabajo que dejé hace 5 años ... ¿Por qué siquiera te molestaste en responder a esto? – Failsafe

+0

disculpa por contestar tarde, pero había empezado a trabajar profesionalmente en este 5 meses, y había recibido mucha ayuda de este sitio, así que, enseñé, debería devolver algo a este sitio, hasta que tenga capacidad. –