InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
SubVersion y Visual Studio
Encriptación con AES Rijndael - Ejemplo
TripleDES - Un ejemplo practico en C#
Serialización: XmlSerializer y BinaryFormater
Handler para manipular imagenes
Conversiones de tipos personalizadas (VB y C#)
Compresión por gzip y deflate
La página Web que está abriendo contiene tanto elementos seguros como no seguros.
Cómo insertar un fichero .xml en un campo de tipo XML de SQL server 2005 o 2008
Comparativa de sentencias VB.Net vs C#


Insertar una marca de agua en documentos PDF

Hace ya algún tiempo escribí un articulo introductorio a la librería iTextSharp - http://www.devjoker.com/contenidos/Articulos/374/Generar-archivos-PDFcon-C.aspx -. Este articulo tiene además una interesante discusion sobre los diferentes usos que podemos dar a esta libreria.

El siguiente ejemplo muestra uno de estos usos, como insertar una marca de agua a un documento PDF existente - de nuevo dar las gracias a mi ex compañero Raúl García-Escribano, en realidad el código de este articulo es suyo (yo solo lo he adaptado y modificado ligeramente).

Para la realizacion de este articulo he utilizado Visual Studio 2008 y C#. Creamos un nuevo proyecto de tipo consola y - evidentemente -  tendremos que descargar y referenciar la librería iTextSharp para que todo funcione correctamente.

El objetivo del programa es  partiendo de un archivo existente - "devjoker.pdf" -, leer el documento y "estampar" una marca de agua en cada página. El resultado de este proceso lo guardaremos en un nuevo documento.

Lo primero que necesitamos es incluir las clausulas using a la librería iTextSharp.

 

using iTextSharp.text;

using iTextSharp.text.pdf;

En el Main de nuestro programa - al final del articulo está el código completo - declaramos un lector para el documento pdf - de tipo PdfReader e identificado por reader - un objeto document - ojo , es del tipo iTextSharp.text.Document - identificado por documento  y un FileStream - ambos necesarios para escribir el archivo de salida - cuyo nombre formamos con un Guid.

 

string path = @"C:\devjoker.pdf";

PdfReader reader = new PdfReader(path);

 

FileStream fs = null;

Document document = null;

 

document = new Document();

string outputPdf = String.Format("C:\\temp\\{0}.pdf",

Guid.NewGuid().ToString());

fs = new FileStream( outputPdf,

FileMode.CreateNew,

FileAccess.Write);

Lo siguiente que vamos a necesitar es un "estampador" - PdfStamper -, asociado a este estampador definimos la fuente y el estado del grafico con la que queremos insertar la marca de agua - BaseFont y PdfGState respectivamente. Es importante tener en cuenta que es un ejemplo y la ruta de fuentes está directamente en el código - esta ruta puede variar dependiendo del SO - en entornos reales se recomienda obtener la ruta de un archivo de configuración o de formandola dinamicamente con el valor de la variable de entorno WINDIR.

 

PdfStamper stamp = null;

stamp = new PdfStamper(reader, fs);

BaseFont bf =

BaseFont.CreateFont(@"c:\windows\fonts\arial.ttf",

BaseFont.CP1252, true);

PdfGState gs = new PdfGState();

gs.FillOpacity = 0.35F;

gs.StrokeOpacity = 0.35F;

Con esto ya tenemos los elementos necesarios para recorrer todas la páginas devueltas por el lector - reader. En cada iteracion del bucle obtenemos el tamaño y contenido de la página y llamamos a un método auxiliar WriteTextToDocument que se encarga de escribir el texto www.devjoker.com en cada página.

 

for (int nPag = 1; nPag <= reader.NumberOfPages; nPag++)

{

Rectangle tamPagina = reader.GetPageSizeWithRotation(nPag);

PdfContentByte over = stamp.GetOverContent(nPag);

over.BeginText();

WriteTextToDocument(bf, tamPagina, over, gs, "www.devjoker.com");

over.EndText();

}

El método WriteTextToDocument se encarga de calcular la diagonal de la página e insertar el texto cruzando la página.

 

private static void

WriteTextToDocument( BaseFont bf,

Rectangle tamPagina,

PdfContentByte over,

PdfGState gs,

string texto)

{

over.SetGState(gs);

over.SetRGBColorFill(220, 220, 220);

over.SetTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_STROKE);

over.SetFontAndSize(bf, 46);

Single anchoDiag =

(Single)Math.Sqrt(Math.Pow((tamPagina.Height - 120), 2)

+ Math.Pow((tamPagina.Width - 60), 2));

Single porc =

(Single)100 * (anchoDiag / bf.GetWidthPoint(texto, 46));

over.SetHorizontalScaling(porc);

double angPage = (-1)

* Math.Atan((tamPagina.Height - 60) / (tamPagina.Width - 60));

over.SetTextMatrix( (float)Math.Cos(angPage),

(float)Math.Sin(angPage),

(float)((-1F) * Math.Sin(angPage)),

(float)Math.Cos(angPage),

30F,

(float)tamPagina.Height - 60);

over.ShowText(texto);

}

Podemos ver el resultado de la ejecución en la siguiente imagen:

El código completo del ejemplo es el siguiente:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using iTextSharp.text;

using iTextSharp.text.pdf;

using System.IO;

namespace iTextSharpSample2

{

class Program

{

static void Main(string[] args)

{

string path = @"C:\devjoker.pdf";

PdfReader reader = new PdfReader(path);

FileStream fs = null;

PdfStamper stamp = null;

Document document = null;

try

{

document = new Document();

string outputPdf = String.Format("C:\\temp\\{0}.pdf",

Guid.NewGuid().ToString());

fs = new FileStream( outputPdf,

FileMode.CreateNew,

FileAccess.Write);

stamp = new PdfStamper(reader, fs);

BaseFont bf =

BaseFont.CreateFont( @"c:\windows\fonts\arial.ttf",

BaseFont.CP1252, true);

PdfGState gs = new PdfGState();

gs.FillOpacity = 0.35F;

gs.StrokeOpacity = 0.35F;

for (int nPag = 1; nPag <= reader.NumberOfPages; nPag++)

{

Rectangle tamPagina =

reader.GetPageSizeWithRotation(nPag);

PdfContentByte over = stamp.GetOverContent(nPag);

over.BeginText();

WriteTextToDocument(bf,

tamPagina,

over,

gs,

"www.devjoker.com");

over.EndText();

}

}

finally

{

// Garantizamos que aunque falle se cierran los objetos

// alternativa:usar using

reader.Close();

if (stamp != null) stamp.Close();

if (fs != null) fs.Close();

if (document != null) document.Close();

}

Console.WriteLine("Fin de ejecucion");

Console.Read();

}

private static void WriteTextToDocument(BaseFont bf,

Rectangle tamPagina,

PdfContentByte over,

PdfGState gs,

string texto)

{

over.SetGState(gs);

over.SetRGBColorFill(220, 220, 220);

over.SetTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_STROKE);

over.SetFontAndSize(bf, 46);

Single anchoDiag =

(Single)Math.Sqrt(Math.Pow((tamPagina.Height - 120), 2)

+ Math.Pow((tamPagina.Width - 60), 2));

Single porc = (Single)100

* (anchoDiag / bf.GetWidthPoint(texto, 46));

over.SetHorizontalScaling(porc);

double angPage = (-1)

* Math.Atan((tamPagina.Height - 60) / (tamPagina.Width - 60));

over.SetTextMatrix((float)Math.Cos(angPage),

(float)Math.Sin(angPage),

(float)((-1F) * Math.Sin(angPage)),

(float)Math.Cos(angPage),

30F,

(float)tamPagina.Height - 60);

over.ShowText(texto);

}

}

}

 Saludos y hasta la proxima. DJK


 Versión para imprimir  Foros de consulta

 
Insertar marca de agua en PDF con java por LuigiBuilder
Respuesta recibida el [29/10/2009 01:44:00]
Hola,
Muy buen tutorial.
Como haria para insertar marca de agua pero con java.
Tambien como puedo firmar un PDF con C# y java.

Gracias.

 
La libreria iTextSharp está po... por Devjoker
Respuesta recibida el [30/10/2009 04:28:23]
La libreria iTextSharp está portada de la librería original Java, por lo que el código debe ser el mismo (salvando las diferencias entre C# y Java)


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

Insertar una marca de agua en documentos PDF
Autor: Pedro Herrarte Sánchez
Visitas: 2034 Fecha de publicación: 13/10/2009
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

Es fundador, diseñador y programador de www.devjoker.com.




Visitas: 110 | Comentarios: 3 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 809 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 765 | Comentarios: 3 | Archivo: Articulos
Visitas: 3178 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14564 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1499 | Comentarios: 3 | Archivo: Articulos
Visitas: 695 | Comentarios: 2 | Archivo: Articulos
Visitas: 369 | Comentarios: 0 | Archivo: Articulos
Visitas: 2034 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
peticion urgente mi nombre es juan pablo osorio cardona cc 71115218 por juancho ... [Actualidad] 0 14/03/2010
peticion por juancho ... [Actualidad] 0 14/03/2010
estrato de pencion por carlos antonio mateus gomez ... [Actualidad] 0 14/03/2010
quiero aprender c# por alcapego ... [C#] 4 16/02/2008
certificado pensiones horizonte por angela patricia rodriguez ... [Actualidad] 140 26/01/2010
certificado de penciones y cesantias por fredy ... [Actualidad] 2 29/01/2010
certificado por jhon jairo vargas ... [Actualidad] 1 13/03/2010
devolver consulta en form builder de oracle con like por cesar10lb ... [ORACLE] 0 13/03/2010
certificado de cesantias horizonte por yeimmy ... [Actualidad] 4 13/03/2010
solicito certificado de pensiones y sesantias para laborar por maria eugenia garcia m. ... [Actualidad] 0 13/03/2010
certificado de fondos de pensiones horizonte por mona ... [Actualidad] 6 03/03/2010
certificado pensiones por nelly moreno ... [Actualidad] 0 13/03/2010

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
22/10/2005 Actualización de datos. UPDATE    forma parte de...Tutorial SQL
04/11/2008 Fijar el encabezado de un GridView con ASP.Net y CSS
22/10/2005 Vistas    forma parte de...Tutorial SQL
24/05/2007 Tipos de datos en Transact SQL    forma parte de...Tutorial de Transact SQL
26/08/2007 Comandos Unix/Linux
28/06/2006 Excepciones en PL/SQL    forma parte de...Tutorial PL/SQL
30/01/2009 SQL to LINQ
10/06/2007 Multiples escritorios en Windows XP
22/10/2005 Consultar datos. SELECT    forma parte de...Tutorial SQL
11/10/2006 Constantes    forma parte de...Tutorial C#

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]