Crear archivos PDF
De
<keywords content="keywords"> PDF, archivo, FOP, NFop, reportes, reporte, reporte PDF, reportes PDF, archivos PDF, archivo PDF, documento, documentos PDF, documento PDF, archivos </keywords>
Contenido |
Cómo Crear Archivos PDF
Introducción
El objetivo de este artículo es ilustrar la generación de un archivo PDF para los procesos en Bizagi.
El archivo PDF contemplado en este ejemplo soporta caracteres del alfabeto occidental tradicional (latino). Para incluir caracteres unicode en el PDF, revise este artículo.
Lo que debe hacer en Bizagi
Para generar archivos PDF en sus procesos Bizagi, los siguientes pasos se llevan a cabo:
1. Tener un atributo para almacenar el archivo PDF.
2. Crear la plantilla del PDF y su archivo de transformación.
3. Crear el servicio Web que genera el PDF.
4. Configurar la invocación a ese servicio web en Bizagi.
Ejemplo
Este ejemplo fue trabajado con el proceso Office Supply Request ("Solicitud de suministros de oficina") instruído en Mi Segundo Proceso.
La documentación aplica para la última versión de Bizagi. No está disponible para versiones 9.1.x.
Para este escenario, el archivo PDF contiene el detalle de la Orden de compra.
Las instrucciones que se describen a continuación aplican tanto para la edición Xpress como para las ediciones Enterprise de Bizagi.
El PDF es creado en la tarea automática Generar orden de compra("Generate Purchase Order"), para ser luego visualizado en la actividad Recibir productos ("Receive Products").
La estrategia cubierta en este artículo se basa en invocar un servicio web desde Bizagi.
El servicio web crea el PDF con los datos de negocio utilizando un componente llamado Apache FOP.
La respuesta del servicio web cargará de manera automática en Bizagi el archivo PDF en un atributo de tipo Archivo ("File").
Tener un atributo para almacenar el archivo PDF
Para realizar este ejemplo ( y partiendo del proceso "Office Supply Request" completado en las instrucciones del documento "Mi segundo Proceso"), se hicieron 3 adiciones al proceso:
1. La creación de 2 nuevos atributos en la entidad de proceso ("Office Supply Request"):
- Un atributo de tipo Archivo llamado PurchaseOrderFile. Su nombre visual es Purchase Order File ("Archivo de Orden de compra").
- Un atributo de tipo Fecha-Hora llamado PurchaseDate. Su nombre visual es Purchase Date ("Fecha de compra").
2. La inclusión de estos atributos creados anteriormente en la forma de la actividad Recibir productos ("Receive Products"). Éstos se incluyen como campos no editables.
3. La asignación de valor a el atributo Purchase Date con la fecha actual. Esto se realizó por medio de una expresión en la acción "al Entrar" ("onEnter") de la tarea de servicio Generar orden de compra("Generate Purchase Order") como se enseña a continuación.
Crear la plantilla del PDF y su archivo de transformación
El primer paso es crear el archivo de transformación XSL-FO.
Este archivo es usado para los parámetros de entrada de la configuración de la invocación del servicio web desde Bizagi.
Un producto que facilita la generación de este archivo de transformación es Altova StyleVision.
Para este ejemplo, se utilizó Altova StyleVision para el diseño del PDF que queremos crear, de acuerdo al modelo de datos de "Mi segundo proceso". Por lo tanto, para este diseño requerimos conocer el esquema (XSD) del modelo de datos.
Éste se extra usando Bizagi Studio:
Nótese que generamos el esquema para el process "OfficeSupplyRequest" y marcamos la información específica del proceso que queremos incluir en el reporte PDF.
El contenido del esquema generado lo guardamos en un archivo.
El archivo debe ser de extensión ".xsd".
Una vez que ya tenemos el esquema, creamos el diseño del PDF usando este esquema como dato de entrada para Altova Stylevision.
Nótese que en este ejemplo usamos una imagen (el logo de Bizagi).
Descargue la imagen empleada en este ejemplo aquí. Esta imagen debe guardarse en una ruta local en el servidor que albergará el servicio web.
Asegúrese de que el archivo de transformación XSL-FO contenga la ruta válida de referencia a esta imagen.
Alerta: Bizagi soporta XSLT 1.0 (XSLT 2.0 no es soportado). En Altova StyleVision, asegúrese de seleccionar XSLT 1.0 para la salida del archivo de transformación. |
Una vez se haya terminado con el diseño del PDF, guardamos el archivo de transformación XLS-FO generado.
Alerta: Algunas versiones de Altova StyleVision posteriores a 2008, incluyen un elemento "<fo:declarations>" que no es soportado por el componente Apache FOP.Net. Por lo tanto, para que el servicio web en .Net genere el PDF correctamente, asegúrese de que el archivo de transformación XSL-FO no contenga este elemento (ni su contenido). |
Descargue el archivo de transformación resultante (y el proyecto de Altova Stylevision's .sps que lo genera) aquí en este .rar.
Crear el servicio Web que genera el PDF
Habiendo terminado el diseño de PDF en Altova Stylevision, procedemos a crear el servicio web que se encargará de recibir la petición (request XML) enviada desde Bizagi.
El PDF se genera a partir de este XML con formato XSL-FO, gracias al uso de Apache FOP. Apache FOP es un proyecto de código abierto desarrollado en Java que también cuenta con una versión soportada para el Framework de .Net ("NFop").
En este ejemplo, nuestro servicio web fue creado con Visual Studio y por ende se utiliza el componente .Net de Apache Fop.
Descargue el componente para .Net de Apache Fop aquí, o desde el enlace externo principal: http://sourceforge.net/projects/nfop/
Para ver Cómo crear este servicio web generador de PDF en Java que soporte caracteres especiales Unicode, haga clic aquí.
Asegúrese de adicionar la referencia del componente NFop (y también el "vjslib") al proyecto en .Net.
Se deben incluir los namespaces para la clase del servicio web:
using System; using System.ComponentModel; using System.Web; using System.Web.Services; using System.Xml;
El método web tiene como código:
[WebMethod] public XmlDocument GeneratePurchaseOrder(string sFileContent) { //Generate the PDF file sbyte[] bufSByte = CBizagiReports.GeneratePDF(sFileContent); byte[] bufByte = new byte[bufSByte.Length]; //Copy the sbyte[] to a byte[] System.Text.UTF8Encoding utf = new System.Text.UTF8Encoding(); Buffer.BlockCopy(bufSByte, 0, bufByte, 0, bufSByte.Length); //Load an empty StringBuilder into an XmlWriter System.Text.StringBuilder sb = new System.Text.StringBuilder(); System.IO.TextWriter tw = new System.IO.StringWriter(sb); XmlTextWriter m_XmlWriter = new XmlTextWriter(tw); //Write the bytes in the StringBuilder in Base 64 m_XmlWriter.WriteBase64(bufByte, 0, bufByte.Length); //Build the Xml document string sRes = "<App><OfficeSupplyRequest><PurchaseOrderFile><File fileName=\"PurchaseOrder.pdf\">"; sRes += sb.ToString(); sRes += "</File></PurchaseOrderFile></OfficeSupplyRequest></App>"; XmlDocument xDoc = new XmlDocument(); xDoc.LoadXml(sRes); //Return de Xml document return xDoc; }
En el proyecto, creamos la clase CBizagiReports.cs con el siguiente código:
using System; using System.IO; using org.apache.fop.apps; using org.xml.sax; using java.io; namespace OfficeSupplyWS { public class CBizagiReports { internal static sbyte[] GeneratePDF(string sInput) { sbyte[] buf; try { InputSource source = new InputSource(new java.io.StringReader(sInput)); ByteArrayOutputStream stream = new ByteArrayOutputStream(); Driver driver = new Driver(source, stream); driver.setRenderer(1); driver.run(); buf = stream.buf; } catch (Exception exception) { throw new ApplicationException(exception.Message); } return buf; } } }
Recuerde convertir a "aplicación" el proyecto en el IIS, para que éste pueda ser referenciado remotamente por URL como un servicio web.
De esta forma, el servicio web quedará publicado como: "http://[my_server]/OfficeSupplyWS/OfficeService.asmx" (para el ejemplo, "OfficeSupplyWS" es nuestro proyecto).
Nótese que para las ediciones Enterprise, el PDF puede ser creado por medio del servicio web o también usando la Librería de Componente. Por lo tanto para la edición Xpress, es completamente necesario seguir lo indicado a continuación en este artículo.
Configurar la invocación a ese servicio web en Bizagi
El último paso para nuestro ejemplo es la configuración para la invocación del servicio web creado en el paso anterior.
A través del Asistente de Interfaces, en nuestro proyecto podemos completar este paso de la siguiente manera:
En Bizagi Studio, ubique el sexto paso del asistente de proceso (Integrar) y haga clic en la tarea de servicio Generate Purchase Order ("Generar Orden de compra").
Ingrese la URL del servicio publicado en el paso previo, y seleccione el método "GeneratePurchaseOrder".
Marque la opción de Usar opciones avanzadas ("Use Advanced Options") en el asistente de configuración de interfaces.
Una vez que el usuario hace clic en siguiente, se deben ingresar los parámetros de entrada. Para hacer esto, se debe hacer doble clic en Parámetros y seleccionar la entidad del Modelo de Datos.
Para los parámetros de entrada de la invocación, seleccione el XPath para el proceso (OfficeSupplyRequest) y defina nuevamente el esquema que contiene los datos necesarios para nuestro PDF: OfficeSupplyRequest
-- OrderTotal
-- ProductRequest
-- -- Approved
-- -- Comments
-- -- ProductType
-- -- -- ProductType
-- -- Quantity
-- -- TotalPrice
-- -- UnitPrice
-- PurchaseDate
-- PurchaseOrderNumber
-- VendorRequest
-- -- Vendor
-- -- -- VendorAddress
-- -- -- VendorCity
-- -- -- -- CityName
-- -- -- VendorEMail
-- -- -- VendorName
-- -- -- VendorTelephone
Cuando el esquema haya sido definido, asociamos el archivo de transformación XLS-que creamos con Altova Stylevision (SPS1_PurchaseOrder.xslt) haciendo doble clic en la opción de Definir la Transformación XSL
Para este ejemplo, no necesitamos ninguna acción o configuración para los parámetros de salida ("Output") del servicio web.
Esto se debe a que el servicio web desarrollado devuelve la información del PDF con el formato del modelo de datos del proceso para que Bizagi actualice el atributo "Purchase Order File" de manera automática.
En la ventana final, haga clic en "Terminar".
Ejecución
En este punto, el proceso de OfficeSupplyRequest está configurado para la creación del archivo PDF para que pueda ser visto en la actividad Recibir productos ("Receive Products").
Para ver su creación, ejecute el proceso de Office Supply Request desde el portal de Bizagi.
Podemos ver que el archivo PDF es adjuntado al proceso en nuestro atributo:
Temas Relacionados
- Cómo crear archivos PDF con caracteres Unicode.
- Bizagi ofrece un modo de generar archivos RTF configurando una plantilla, aprenda aquí sobre Cartas de Bizagi.
- Subir archivos usando la Capa SOA.
- Para la edición Enterprise .NET hay otra manera de crear los archivos PDF, aprenda aquí sobre la Librería de Componente.
- Cómo soportar la creación de PDFs a partir de plantillas dinámicas
Lea más sobre la creación de archivos PDF con .NET en estos enlaces externos:
<comments />