¿Cómo ampliar el tamaño de página de un PDF para agregar una marca de agua?

Mi aplicación web firma documentos PDF. Me gustaría que los usuarios descarguen el documento PDF original (no firmado), pero agreguen una imagen y los firmantes en el margen izquierdo del documento pdf.

He visto esta idea en otra aplicación web, y me gustaría hacer lo mismo. Por supuesto, me gustaría hacerlo usando la biblioteca de itext.

Adjunto dos imágenes, el documento PDF original (no firmado) y el documento PDF modificado.

enter image description here

enter image description here

Primero esto: es importante cambiar el documento antes de firmarlo digitalmente. Una vez que se firman digitalmente, estos cambios romperán la firma.

Voy a dividir la pregunta en dos partes y omitiré la parte sobre la marca de agua real, ya que esto ya se explicó aquí: ¿Cómo marcar marcas de agua con texto o imágenes?

Esta pregunta no es un duplicado de esa pregunta, debido al requisito adicional de agregar un margen adicional a la derecha.

Eche un vistazo al documento primes.pdf . Este es el archivo fuente que vamos a usar en el ejemplo AddExtraMargin con el siguiente resultado: primes_extra_margin.pdf . Como puede ver, se agregó un margen de media pulgada a la izquierda de cada página.

Así es como se hace:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { PdfReader reader = new PdfReader(src); int n = reader.getNumberOfPages(); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); // properties PdfContentByte over; PdfDictionary pageDict; PdfArray mediabox; float llx, lly, ury; // loop over every page for (int i = 1; i < = n; i++) { pageDict = reader.getPageN(i); mediabox = pageDict.getAsArray(PdfName.MEDIABOX); llx = mediabox.getAsNumber(0).floatValue(); lly = mediabox.getAsNumber(1).floatValue(); ury = mediabox.getAsNumber(3).floatValue(); mediabox.set(0, new PdfNumber(llx - 36)); over = stamper.getOverContent(i); over.saveState(); over.setColorFill(new GrayColor(0.5f)); over.rectangle(llx - 36, lly, 36, ury - llx); over.fill(); over.restoreState(); } stamper.close(); reader.close(); } 

El PdfDictionary que obtenemos con el método getPageN() se llama diccionario de página . Tiene mucha información sobre una página específica en el PDF. Solo estamos mirando una entrada: la /MediaBox . Esto es solo una prueba de concepto. Si desea escribir una aplicación más robusta, también debe mirar la entrada /CropBox y la entrada /Rotate . Por cierto, sé que estas entradas no existen en primes.pdf, así que las estoy omitiendo aquí.

El cuadro multimedia de una página es una matriz con cuatro valores que representan un rectángulo definido por las coordenadas de su esquina inferior izquierda y superior derecha (por lo general, me refiero a llx , lly , urx y ury ).

En mi ejemplo de código, cambio el valor de llx restando 36 unidades de usuario. Si compara el tamaño de página de ambos archivos PDF, verá que hemos agregado media pulgada.

También usamos estas coordenadas para dibujar un rectángulo que cubre la media pulgada adicional. Ahora cambie a los otros ejemplos de marca de agua para descubrir cómo agregar texto u otro contenido a cada página.

Actualizar:

si necesita escalar las páginas existentes, por favor lea Reparar la orientación de un PDF para escalarlo