SOA 方法动态生成 DOCX-PDF 报表 - 第二部分






4.75/5 (4投票s)
基于 Docx 模板和业务逻辑 XML 序列化数据生成自动 PDF 报表
引言
在之前的文章"一种基于SOA的动态DOCX-PDF报告生成方法 - 第1部分"中,我们已经实现了与MsOffice无关的自动化Docx报告生成,并采用了客户端-服务器架构。现在,我们将研究如何从托管代码自动将这些docx文件打印为PDF,并通过HTTP传输PDF字节。
PDF转换基于免费的BullZip PDF产品,它提供了一个免费、功能齐全、可编程且文档非常完善的PDF打印机,可以将任何文件打印为PDF,包括Docx文件。
毋庸置疑,PDF可能是不同平台之间最常用的文档交换格式,因此,大多数以数据为中心的应用程序都需要某种类型的PDF报告。
1. 安装PDF打印机
首先要做的是下载并安装BullZipPdf。 它将在系统中创建一个PDF打印机,并在安装目录中包含帮助文件。请仔细阅读帮助文件,了解如何使用Bullzip.PdfWriter
命名空间。
2. 将PDF转换添加到现有的Visual Studio解决方案
首先,我们需要将包导入到解决方案中。 和它一样好,我们可以在GAC中找到该包,因此只需转到“添加引用” ->“.NET”并找到BullZip PDF Writer。 这会将Bullzip.PDFWriter
程序集添加到解决方案中,该程序集在其Bullzip.PDFWriter
命名空间下公开其类和方法。 接下来要做的是配置PDF打印机。 这可以通过.ini文件来实现,但我不会对此进行说明,您可以在Bullzip
文档中阅读有关它的很多信息。 打印机设置由一个名为PdfSettings
的类管理,而PDF创建方法位于一个名为PdfUtils
的类中。 一切都准备好了,我们现在就可以开始转换为PDF!
3. 转换为PDF
这是测试应用程序所做的
- 它在templates目录中包含一些带有示例数据的docx模板
- 基于docx模板和一些XML序列化的业务逻辑数据生成自定义的docx报告,这些数据的结构对应于docx模板中的自定义XML部分
- 将docx报告保存到临时目录中
- 将docx报告打印为PDF
- 通过HTTP发送PDF字节
- 销毁docx和PDF文件
此PrintToPdf
方法从".ini"文件加载打印机设置,从临时目录“读取”docx文件,创建PDF文件,然后销毁原始的docx和PDF。
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;
using System.ComponentModel;
using System.Configuration;
using System.ServiceModel;
using Bullzip.PdfWriter;
namespace DocxGenerator.SL.WCF
{
public class PdfMaker
{
internal static byte[] PrintToPdf(string appFolder, string tempDocxFileName)
{
try
{
string tempFolder = appFolder + @"\temp";
string tempDocxFilePath = tempFolder + @"\" + tempDocxFileName;
PdfSettings pdfSettings = new PdfSettings();
pdfSettings.PrinterName = ConfigurationManager.AppSettings["PdfPrinter"];
string settingsFile = pdfSettings.GetSettingsFilePath(PdfSettingsFileType.Settings);
pdfSettings.LoadSettings(appFolder + @"\App_Data\printerSettings.ini");
pdfSettings.SetValue("Output", tempFolder + @"\<docname>.pdf");
pdfSettings.WriteSettings(settingsFile);
PdfUtil.PrintFile(tempDocxFilePath, pdfSettings.PrinterName);
string tempPdfFilePath =
tempFolder + @"\Microsoft Word - " + tempDocxFileName + ".pdf";
bool fileCreated = false;
while (!fileCreated)
{
fileCreated = PdfUtil.WaitForFile(tempPdfFilePath, 1000);
}
byte[] pdfBytes = File.ReadAllBytes(tempPdfFilePath);
File.Delete(tempDocxFilePath);
File.Delete(tempPdfFilePath);
return pdfBytes;
}
catch (Exception ex)
{
throw new FaultException("WCF ERROR!\r\n" + ex.Message);
}
}
}
关注点
本文的范围仅限于对通过此架构可以实现的功能进行简单的说明。 稍加思考,您就可以对其进行扩展,并将其变成PDF转换服务器(有没有人想到免费版本的Adobe Distiller ???),计划的批处理打印机,存档系统等。
如果集成到上述SOA报告生成解决方案中,这将使您可以摆脱docx文件并使用PDF作为文档交换格式。
玩得开心!
服务器上需要的软件环境
这是在该服务器上实现此解决方案所需的软件环境
- Microsoft Word 查看器
Word文档将立即打开并关闭,以便及时发送到PDF打印队列。
- Bullzip PDF 打印机
这是将.docx文档转换为.pdf文件的PDF打印机。
如果作为企业解决方案实施,尽管这并不理想,但是可以通过编写安全的代码来使其稳定,以防止MsWord或打印队列挂起。 根据个人经验,它确实有效并且稳定。
历史
这是之前(必须阅读才能理解SOA集成概念)导致这篇文章的文章:"一种基于SOA的动态DOCX-PDF报告生成方法 - 第1部分"。