您有免费的 .Net 托管代码用于将 DocX 转换为 PDF 吗?
题
在我的网络项目中,我使用 DocX 文件类型来包含报告模板。我需要将 DocX 文件类型转换为 PDF。您有任何 .Net 托管代码可以执行此操作吗?
我知道解决这个问题的几种方法。但它不是托管代码并且像以下项目一样免费。
Word 12.0 对象库 以编程方式将 Word 2007 文档另存为 PDF 文档或 XPS 文档。但它需要在服务器上安装Office 2007。
使用一些免费的 PDF 打印机进行打印,例如 PDF创建器. 。但我需要一些在 Office 2007 等服务器上打开 DocX 的程序。这是非常糟糕的主意。
通过免费转换器程序进行转换。但结果并不完美。
使用类似的框架 XF渲染服务器. 。这是个好主意,但它不是免费的。
在 PDF Api 中创建所有文档内容,例如 iTextSharp. 。但我必须努力创建漂亮的文档。
或者使用其他文件格式创建模板文档,可以将其导出为 DocX 和 PDF 文件格式。此外,最终用户应该可以轻松编辑此文件。如果你知道,请告诉我。
谢谢,
解决方案
我没有将 DocX 转换为 PDF 的代码,但看来您对 DocX 的要求并不严格。你的最后一颗子弹说:
或使用其他文件格式创建模板文档,可以将其导出到DOCX和PDF文件格式。此外,最终用户应轻松编辑此文件。如果你知道,请告诉我。
我读到这意味着您希望能够创建一个模板文档,用数据填充它并将其转换为 PDF,但允许维护模板,对吧?
解决方案:XSL-FO
XSL-FO 与 HTML 一样是 W3C 标准,可以通过许多开源和商业产品转换为 PDF、WordML、XPS、PS、PCL、SVG、TIFF 等。我使用它每月交付数十万份文档,包括在线 PDF 和离线文档(例如批量支票打印)。
为了帮助您开始,这里是 XML-FO 的 W3C 页面. 。那里有很多有用的信息,包括左侧的软件列表(开源和商业)。我个人使用过两种商业产品 IBEX PDF 创建器 和 RenderX 的 XEP. 。两者都是优秀的产品,并且有一个 100% 托管的 C# 实现来获取 PDF,称为 FO网 在 CodePlex 上。我没有尝试过这个,但它应该满足你的“免费”标准。
您可以通过多种方式编辑要在 XSL-FO 中创建的文档的模板。通常,此模板是应用于 XML 数据的 XSLT,但这不是必需的。我已经手工构建了这些,但这有一点学习曲线。您可以从 XSL-FO 中的文档开始,然后用代码填充其中的各个部分,就像 HTML 一样。好消息是 那里 是 一些 XSL-FO 编辑器 在那里。坏消息是,据我所知,没有一个是免费的,但其中一些很便宜,您可能会通过谷歌搜索找到符合免费标准的东西。但是,一种选择是您可以使用样式表 (商业的 & 自由的).
其他提示
安装 Office 2007 并使用 Word 12 对象库绝对是我的选择(并且在我自己的一些项目中也这样做过)。
如果您不想在生产 Web 服务器上安装 Word,为什么不在辅助服务器上安装它呢?您可以让第二个服务器与第一个服务器进行通信(使用 Web 服务或类似的东西)——它可以请求下一个需要导出的 Word 文档,进行转换,然后返回 PDF 数据。
如果您想要执行此转换的 Word 自动化的 C# 示例,请告诉我(非常简单)。
阿德里安
这是我为 Jason 发布的代码。这适用于 Word 2007。您需要从 Office 网站下载并安装 PDF 导出器:
using Microsoft.Office.Interop.Word;
...
object _read_only = false;
object _visible = true;
object _false = false;
object _true = true;
object _dynamic = 2;
object _missing = System.Reflection.Missing.Value;
object _htmlFormat = 8;
object _pdfFormat = 17;
object _xpsFormat = 18;
object fileName = "C:\\Test.docx";
ApplicationClass ac = new ApplicationClass();
//ac.Visible = true; // Uncomment to see Word as it opens and converts the document
//ac.Activate();
Document d = ac.Documents.Open(ref fileName, ref _missing, ref _true, ref _read_only, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _visible, ref _missing, ref _missing, ref _missing, ref _missing);
object newFileName = ((string)fileName).Substring(0, ((string)fileName).LastIndexOf(".")) + ".pdf";
d.SaveAs(ref newFileName, ref _pdfFormat, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing);
d.Close(ref _false, ref _missing, ref _missing);
ac.Quit(ref _false, ref _missing, ref _missing);
ac = null;
所以,Soul_Master,你的意思是你不想使用互操作(尽管你没有说出为什么,我很想知道),你不想为商业出口商付费,并且你想要完美的结果吗?
恐怕我帮不了你。Interop 每次都会给您带来完美的结果,而且您已经拥有了该软件。如果你不使用它,你将不得不做出牺牲——要么是成本,要么是质量。
Open Office 有 API 吗?那至少是一个免费的选择?
使用 ActiveReports/Crystal Reports 等报告工具创建 PDF(比使用 iTextSharp 容易得多)
我已经使用名为 docX 的免费组件解决了 docX 到 pdf 转换的问题 免费尖塔.Doc. 。您可以在以下位置查看更多相关信息 这个网站. 。您的使用非常简单。
您可以尝试使用 OpenOffice.org
http://abdulmunim.com/how-to-convert-office-documents-to-pdf-using-open-office-in-csharp/