以编程方式将Word(docx)转换为PDF

好吧,在你想到“不是这样的另一个问题”之前,请先阅读此内容。

我有一个应用程序(ASP.NET MVC 3中的Web应用程序)使用DocX库在DocX中生成Word文件。

应用程序采用模板并使用数据库中的所有数据填充它。 现在我想创建一个创建的docx文件的PDF版本。

我知道箴言是一种选择,但不适合我,因为我的预算很少。 其他我需要花钱的库也是不可能的。

我没有sharepoint服务器,因此Word Automation Services也不是一个选项。

所以我有两个选项(我知道),他们都使用了iTextSharp 。 不知道哪个更好。

  1. 我可以使用docx文件中生成的XML并将其转换为iTextSharp可用的版本。
  2. 我可以创建PDF,就像我用模板创建docx一样。

任何人都知道它有多少工作,哪两个有更好的性能,如果有可能的话。

我知道第二个选项的缺点是,当我更改模板时,我必须为两个版本更改它。

如果您有更好的解决方案(免费),欢迎您分享。

另一个选项,即使它需要一些工作:在服务器上安装OpenOffice,并使用UNO库(包括它们作为应用程序中的程序集),您可以打开docx文档并直接将其保存为PDF。
几分钟后我发布了一个例子……

部分例子:
这是我很久以前创建的一个类,用于将文件转换为pdf

using unoidl.com.sun.star.lang; using unoidl.com.sun.star.uno; using unoidl.com.sun.star.container; using unoidl.com.sun.star.frame; using unoidl.com.sun.star.beans; using unoidl.com.sun.star.view; using System.Collections.Generic; using System.IO; namespace QOpenOffice { public enum AppType { Writer, Calc, Impress, Draw, Math } public enum ExportFilter{ Word97, WriterPDF, CalcPDF, DrawPDF, ImpressPDF, MathPDF } class OpenOffice { private XComponentContext context; private XMultiServiceFactory service; private XComponentLoader component; private XComponent doc; private List filters = new List(); #region Constructors public OpenOffice() { /// This will start a new instance of OpenOffice.org if it is not running, /// or it will obtain an existing instance if it is already open. context = uno.util.Bootstrap.bootstrap(); /// The next step is to create a new OpenOffice.org service manager service = (XMultiServiceFactory)context.getServiceManager(); /// Create a new Desktop instance using our service manager component = (XComponentLoader)service.createInstance("com.sun.star.frame.Desktop"); // Getting filters XNameContainer filters = (XNameContainer)service.createInstance("com.sun.star.document.FilterFactory"); foreach (string filter in filters.getElementNames()) this.filters.Add(filter); } ~OpenOffice() { if (doc != null) doc.dispose(); doc = null; } #endregion #region Private methods private string FilterToString(ExportFilter filter) { switch (filter) { case ExportFilter.Word97: return "MS Word 97"; case ExportFilter.WriterPDF: return "writer_pdf_Export"; case ExportFilter.CalcPDF: return "calc_pdf_Export"; case ExportFilter.DrawPDF: return "draw_pdf_Export"; case ExportFilter.ImpressPDF: return "impress_pdf_Export"; case ExportFilter.MathPDF: return "math_pdf_Export"; } return ""; } #endregion #region Public methods public bool Load(string filename, bool hidden) { return Load(filename, hidden, "", ""); } public bool Load(string filename, bool hidden, int filter_index, string filter_options) { return Load(filename, hidden, filters[filter_index], filter_options); } public bool Load(string filename, bool hidden, string filter_name, string filter_options) { List pv = new List(); pv.Add(new PropertyValue("Hidden", 0, new uno.Any(hidden), PropertyState.DIRECT_VALUE)); if (filter_name != "") { pv.Add(new PropertyValue("FilterName", 0, new uno.Any(filter_name), PropertyState.DIRECT_VALUE)); pv.Add(new PropertyValue("FilterOptions", 0, new uno.Any(filter_options), PropertyState.DIRECT_VALUE)); } try { doc = component.loadComponentFromURL( "file:///" + filename.Replace('\\', '/'), "_blank", 0, pv.ToArray()); return true; } catch { doc = null; return false; } } public bool Print() { return Print(1, ""); } public bool Print(int copies, string pages) { List pv = new List(); pv.Add(new PropertyValue("CopyCount", 0, new uno.Any(copies), PropertyState.DIRECT_VALUE)); if (pages != "") pv.Add(new PropertyValue("Pages", 0, new uno.Any(pages), PropertyState.DIRECT_VALUE)); //if (doc is XPrintable) try { ((XPrintable)doc).print(pv.ToArray()); return true; } catch { return false; } } public bool Save(string filename, ExportFilter filter) { return Save(filename, FilterToString(filter)); } public bool Save(string filename, string filter) { List pv = new List(); pv.Add(new PropertyValue("FilterName", 0, new uno.Any(filter), PropertyState.DIRECT_VALUE)); pv.Add(new PropertyValue("Overwrite", 0, new uno.Any(true), PropertyState.DIRECT_VALUE)); try { filename = filename.Replace("\\", "/"); ((XStorable)doc).storeToURL("file:///" + filename, pv.ToArray()); return true; } catch { return false; } } public bool ExportToPdf(string filename) { filename = Path.ChangeExtension(filename, ".pdf"); bool ret = Save(filename, "writer_pdf_Export"); if (!ret) ret = Save(filename, "impress_pdf_Export"); if (!ret) ret = Save(filename, "calc_pdf_Export"); if (!ret) ret = Save(filename, "draw_pdf_Export"); if (!ret) ret = Save(filename, "impress_pdf_Export"); if (!ret) ret = Save(filename, "math_pdf_Export"); return ret; } public void Close() { doc.dispose(); doc = null; } public bool New(AppType app, bool hidden) { try { string sapp = "private:factory/"; switch (app) { case AppType.Writer: sapp += "swriter"; break; case AppType.Calc: sapp += "scalc"; break; case AppType.Impress: sapp += "simpress"; break; case AppType.Draw: sapp += "sdraw"; break; case AppType.Math: sapp += "smath"; break; } PropertyValue pv = new PropertyValue("Hidden", 0, new uno.Any(hidden), PropertyState.DIRECT_VALUE); doc = component.loadComponentFromURL(sapp, "_blank", 0, new PropertyValue[1] { pv }); return true; } catch { doc = null; return false; } } #endregion #region Properties public List Filters { get { return filters; } } #endregion } }