65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (4投票s)

2011年1月13日

CPOL

3分钟阅读

viewsIcon

53716

基于 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

这是测试应用程序所做的

  1. 它在templates目录中包含一些带有示例数据的docx模板
  2. 基于docx模板和一些XML序列化的业务逻辑数据生成自定义的docx报告,这些数据的结构对应于docx模板中的自定义XML部分
  3. 将docx报告保存到临时目录中
  4. 将docx报告打印为PDF
  5. 通过HTTP发送PDF字节
  6. 销毁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作为文档交换格式。

玩得开心!

服务器上需要的软件环境

这是在该服务器上实现此解决方案所需的软件环境

  1. Microsoft Word 查看器

    Word文档将立即打开并关闭,以便及时发送到PDF打印队列。

  2. Bullzip PDF 打印机

    这是将.docx文档转换为.pdf文件的PDF打印机。

如果作为企业解决方案实施,尽管这并不理想,但是可以通过编写安全的代码来使其稳定,以防止MsWord或打印队列挂起。 根据个人经验,它确实有效并且稳定。

历史

这是之前(必须阅读才能理解SOA集成概念)导致这篇文章的文章:"一种基于SOA的动态DOCX-PDF报告生成方法 - 第1部分"

© . All rights reserved.