Nosotros hasta ahora hemos trabajado con unos formularios PDF que se rellenaban mediante FDF (protocolo de Acrobat para obtener información y rellenar los documento PDF). Llevamos trabajando con ellos pero el resultado no ha sido muy bueno, así que hemos buscado un alternativa, y nos hemos decidido por evaluar la librería iText que tiene versión community y comercial.
En este caso, montamos un servlet en un servidor Tomcat que recibe mediante POST un conjunto de parámetros y los pasa al formulario PDF. En este caso para el usuario tienen una ruta como que se descarga un PDF, por ejemplo www.servidor.com/documento.pdf
En nuestro proyecto tomcat premaramos el web.xml con nuestro servlet:
[code]
<servlet>
<description>Documento</description>
<display-name>Documento</display-name>
<servlet-name>Documento</servlet-name>
<servlet-class>es.uva.web.app.pdf.Documento</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Documento</servlet-name>
<url-pattern>/documento.pdf</url-pattern>
</servlet-mapping>
[/code]
Y a continuación la clase que recibe los datos del post y rellena el formulario PDF. Va a recoger el parámetro «dato» y va a cumplimentar el campo «FormularioDato» del formulario PDF que se encuentra en «/documento.pdf» del proyecto.
[code]
public class Documento extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
String dato=»»;
res.setContentType(«application/pdf»);
res.setHeader(«Cache-control»,»must-revalidate, post-check=0, pre-check=0″);
try {
if ((req.getParameter(«dato») != null)&& (req.getParameter(«dato»).compareTo(«») != 0)) {
dato=req.getParameter(«dato»);
}
} catch (Exception e) {
throw new IOException(«Error al obtener el parametro dato «+e);
}
try {
InputStream is = getServletContext().getResourceAsStream(«/formulario.pdf»);
PdfReader reader = new PdfReader(is, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, baos);
AcroFields fields = stamper.getAcroFields();
fields.setField(«FormularioDato»,dato);
stamper.setFormFlattening(true);
stamper.close();
OutputStream os = res.getOutputStream();
baos.writeTo(os);
os.flush();
} catch (DocumentException de) {
throw new IOException(de.getMessage());
}
}
}
[/code]
Ya para terminar, la página que invocaría al servlet,
[code]
<!DOCTYPE html PUBLIC «-//W3C//DTD HTML 4.01 Transitional//EN» «http://www.w3.org/TR/html4/loose.dtd»>
<html>
<head>
<meta http-equiv=»Content-Type» content=»text/html; charset=UTF-8″>
<title>HOLA MUNDO FDF</title>
</head>
<body>
<form action=»http://www.servidor.com/documento.pdf» method=»post»>
<label>DATO
<input type=»text» name=»dato» id=»dato» value=»VALOR»>
</label>
<br>
<input name=»Enviar» type=»submit» value=»Enviar»>
</form>
</body>
</html>
[/code]
De esta forma tan sencilla podemos rellenar formularios PDF.
Os podéis imaginar todas las posibilidades, por ejemplo, lo estamos usando para rellenar formularios con datos obtenidos consultando en el propio servlet a un directorio LDAP o una Base de datos, se pueden leer formularios PDF que nos envía un usuario y pasarlos a una base de datos, etc.
Espero que como siempre os sirva de ayuda.
Esto funciona perfectamente salvo que haya acentos en el campo del formulario que se quiera rellenar…
Si por ejemplo el valor que se tiene que pintar es «Córdoba» está saliendo «Crdoba». ¿Alguna idea de cómo solucionarlo?
Respecto al comentario anterior (que habéis borrado), ya he encontrado la solución al tema de los acentos que no salían:
AcroFields form = rellenarForm.getAcroFields();
FontFactory.register(«c:/windows/fonts/arial.ttf», «my_arial»);
Font myArialFont = FontFactory.getFont(«my_arial»);
BaseFont bf = myArialFont.getBaseFont();
form.addSubstitutionFont(bf);
for (Entry entrada : cargarMapa().entrySet()) {
form.setField(entrada.getKey(), entrada.getValue());
}
No, no se ha borrado, simplemente no se había aprobado. Muchas gracias por tu comentario.
Espectacular!!! Me has salvado de horas de trabajo. Gracias por compartir!!!!! =)
bfDescBold = BaseFont.createFont(BaseFont.HELVETICA_BOLD, BaseFont.WINANSI, BaseFont.CACHED);//winansi para las ñ, y letra con apostrofe o acentos
Hola, una pregunta… sabrías como pasar un pdf rellenable a pdf plano con la librería iText ?
Gracias y un saludo.
Tienes que «flatear» el formulario llamando a flattenFields();
Tienes un ejemplo en http://developers.itextpdf.com/examples/form-examples/clone-fdf-and-xfdf
Espero que sea lo que buscas
Hola, tengo justo la misma duda que Marta alguien tiene una solución para ello? Sabrían como sabrías como pasar un pdf rellenable a pdf plano con la librería iText , es decir a un pdf cuyos campos no son editables?
Te respondo lo mismo. Tienes que “flatear” el formulario llamando a flattenFields();
Tienes un ejemplo en http://developers.itextpdf.com/examples/form-examples/clone-fdf-and-xfdf
Espero que sea lo que buscas