tablas studio programacion móviles libreria generar ejemplos desarrollo curso aplicaciones java pdf

java - studio - ¿Cómo marcar los archivos PDF con texto o imágenes?



manual de programacion android pdf (2)

Eche un vistazo al ejemplo de TransparentWatermark2 . Agrega texto transparente en cada página impar y una imagen transparente en cada página par de un documento PDF existente.

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)); // text watermark Font f = new Font(FontFamily.HELVETICA, 30); Phrase p = new Phrase("My watermark (text)", f); // image watermark Image img = Image.getInstance(IMG); float w = img.getScaledWidth(); float h = img.getScaledHeight(); // transparency PdfGState gs1 = new PdfGState(); gs1.setFillOpacity(0.5f); // properties PdfContentByte over; Rectangle pagesize; float x, y; // loop over every page for (int i = 1; i <= n; i++) { pagesize = reader.getPageSizeWithRotation(i); x = (pagesize.getLeft() + pagesize.getRight()) / 2; y = (pagesize.getTop() + pagesize.getBottom()) / 2; over = stamper.getOverContent(i); over.saveState(); over.setGState(gs1); if (i % 2 == 1) ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, x, y, 0); else over.addImage(img, w, 0, 0, h, x - (w / 2), y - (h / 2)); over.restoreState(); } stamper.close(); reader.close(); }

Como puede ver, creamos un objeto Phrase para el texto y un objeto Image para la imagen. También creamos un objeto PdfGState para la transparencia. En nuestro caso, optamos por una opacidad del 50% (cambie el 0.5f en otra cosa para experimentar).

Una vez que tenemos estos objetos, recorremos cada página. Usamos el objeto PdfReader para obtener información sobre el documento existente, por ejemplo, las dimensiones de cada página. Usamos el objeto PdfStamper cuando queremos estampar contenido adicional en el documento existente, por ejemplo, agregando una marca de agua en la parte superior de cada página.

Al cambiar el estado de los gráficos, siempre es seguro realizar un saveState() antes de comenzar y restoreState() una vez que haya terminado. Es probable que el código también funcione si no lo hace, pero créame: puede ahorrarle mucho tiempo de depuración si adopta la disciplina para hacerlo, ya que puede obtener efectos realmente extraños si el estado de los gráficos está fuera de balance.

Aplicamos la transparencia usando el método setGState() y dependiendo de si la página es impar o par, agregamos el texto (usando ColumnText y una coordenada (x, y) calculada para que el texto se agregue en el medio de cada página) o la imagen (usando el método addImage() y los parámetros apropiados para la matriz de transformación).

Una vez que haya hecho esto para cada página del documento, debe close() el stamper y el reader .

Consideración:

Notarás que las páginas 3 y 4 están en horizontal, sin embargo, hay una diferencia entre esas dos páginas que no es visible a simple vista. La página 3 es en realidad una página cuyo tamaño se define como si fuera una página en vertical, pero se gira 90 grados. La página 4 es una página cuyo tamaño se define de tal manera que el ancho> el alto.

Esto puede tener un impacto en la forma en que agrega una marca de agua, pero si usa getPageSizeWithRotation() , iText se adaptará. Es posible que esto no sea lo que desea: tal vez desee que la marca de agua se agregue de manera diferente.

Echa un vistazo a TransparentWatermark3 :

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)); stamper.setRotateContents(false); // text watermark Font f = new Font(FontFamily.HELVETICA, 30); Phrase p = new Phrase("My watermark (text)", f); // image watermark Image img = Image.getInstance(IMG); float w = img.getScaledWidth(); float h = img.getScaledHeight(); // transparency PdfGState gs1 = new PdfGState(); gs1.setFillOpacity(0.5f); // properties PdfContentByte over; Rectangle pagesize; float x, y; // loop over every page for (int i = 1; i <= n; i++) { pagesize = reader.getPageSize(i); x = (pagesize.getLeft() + pagesize.getRight()) / 2; y = (pagesize.getTop() + pagesize.getBottom()) / 2; over = stamper.getOverContent(i); over.saveState(); over.setGState(gs1); if (i % 2 == 1) ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, x, y, 0); else over.addImage(img, w, 0, 0, h, x - (w / 2), y - (h / 2)); over.restoreState(); } stamper.close(); reader.close(); }

En este caso, no usamos getPageSizeWithRotation() sino simplemente getPageSize() . También le decimos al stamper no compense la rotación de página existente: stamper.setRotateContents(false);

Eche un vistazo a la diferencia en los PDF resultantes:

En la primera captura de pantalla (que muestra las páginas 3 y 4 del PDF resultante de TransparentWatermark2 ), la página a la izquierda es en realidad una página en vertical girada 90 grados. Sin embargo, iText lo trata como si fuera una página en horizontal, como la página a la derecha.

En la segunda captura de pantalla (que muestra las páginas 3 y 4 del PDF resultante de TransparentWatermark3 ), la página a la izquierda es una página en vertical girada 90 grados y agregamos la marca de agua como si la página estuviera en vertical. Como resultado, la marca de agua también se gira 90 grados. Esto no sucede con la página a la derecha, porque esa página tiene una rotación de 0 grados.

Esta es una sutil diferencia, pero pensé que querrías saberlo.

Si desea leer esta respuesta en francés, lea Comentario créer un filigrane transparent en PDF?

Tengo un montón de documentos PDF en una carpeta y quiero aumentarlos con una marca de agua. ¿Cuáles son mis opciones de un contexto de servidor Java?

Preferiblemente, la marca de agua apoyará la transparencia. Tanto el vector como la trama son deseables.


La mejor opción es iText . Consulte una demostración de marca de agua aquí

Parte importante del código (donde se inserta el watermar) es esto:

public class Watermark extends PdfPageEventHelper { @Override public void onEndPage(PdfWriter writer, Document document) { // insert here your watermark }

Lee atentamente el ejemplo.

onEndPage() método onEndPage() será algo así como (en mi logo-watermarks utilizo com.itextpdf.text.Image; ):

Image image = Image.getInstance(this.getClass().getResource("/path/to/image.png")); // set transparency image.setTransparency(transparency); // set position image.setAbsolutePosition(absoluteX, absoluteY); // put into document document.add(image);