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