15

在我的 Web 项目中,我使用 DocX 文件类型来包含报告模板。我需要将 DocX 文件类型转换为 PDF。您有任何 .Net 托管代码来执行此操作吗?

我知道解决这个问题的几种方法。但它不是托管代码,并且像以下项目一样免费。

  • Word 12.0 对象库以编程方式将 Word 2007 文档另存为 PDF 文档或 XPS 文档。但它需要在服务器上安装 Office 2007。

  • 使用一些免费的 PDF 打印机(如PDFCreator )进行打印。但是我需要一些程序来在 Office 2007 等服务器上打开 DocX。这是个非常糟糕的主意。

  • 通过免费的转换器程序进行转换。但结果并不完美。

  • 使用XF Rendering Server 之类的框架。这是个好主意,但它不是免费的。

  • 在 PDF Api 中创建所有文档内容,例如iTextSharp。但我必须努力创建好的文档。

  • 或者创建具有其他文件格式的模板文档,可以将其导出为 DocX 和 PDF 文件格式。此外,最终用户应轻松编辑此文件。如果你知道,请告诉我。

谢谢,

4

5 回答 5

8

我没有将 DocX 转换为 PDF 的代码,但您对 DocX 的要求似乎并不严格。你的最后一个子弹说:

或者创建具有其他文件格式的模板文档,可以将其导出为 DocX 和 PDF 文件格式。此外,最终用户应轻松编辑此文件。如果你知道,请告诉我。

我读到这意味着您希望能够创建一个模板文档,用数据填充它并将其转换为 PDF,但允许维护模板,对吗?

解决方案:XSL-FO

XSL-FO 是一个类似于 HTML 的 W3C 标准,可以被许多开源和商业产品转换为 PDF、WordML、XPS、PS、PCL、SVG、TIFF 等。我用它来交付数十万个文档每月,以 PDF 格式在线和离线(例如批量支票打印)。

为了帮助您入门,这里是XML-FO 的 W3C 页面。那里有很多很好的信息,包括左侧的软件列表(开源和商业)。我个人使用了 RenderX 的两个名为IBEX PDF CreatorXEP 的商业产品。两者都是优秀的产品,并且有一个 100% 托管的 C# 实现可以在 CodePlex 上获取名为FO.NET的 PDF。我没有尝试过,但它应该满足您的“免费”标准。

有多种方法可以编辑要在 XSL-FO 中创建的文档的模板。通常,此模板是应用于 XML 数据的 XSLT,但这不是必需的。我是手工制作的,但这有点学习曲线。您可以从 XSL-FO 中的文档开始,然后用代码填充其中的各个部分,就像使用 HTML 一样。好消息是那里 许多 XSL-FO 编辑器。坏消息是,我所知道的没有一个是免费的,但其中有几个很便宜,你可以通过谷歌搜索找到符合免费标准的东西。但是,一种选择是您可以使用样式表(商业免费)从 Word 转换。

于 2009-10-18T05:17:37.637 回答
3

安装 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 每次都会为您提供完美的结果,而且您​​已经拥有该软件。如果你不使用它,你将不得不做出牺牲——无论是成本还是质量。

于 2009-09-08T14:27:36.503 回答
1

我已经使用名为Free Spire.Doc的免费组件解决了 docX 到 pdf 转换的问题。你可以在这个网站上看到更多关于它的信息。你的使用很容易。

于 2017-04-10T22:22:27.403 回答
0

Open Office 有 API 吗?这至少是一个免费的选择?

使用 ActiveReports/Crystal Reports 等报告工具创建 PDF(比使用 iTextSharp 容易得多)

于 2009-09-04T17:21:14.773 回答
0

您可以尝试使用 OpenOffice.org

http://abdulmunim.com/how-to-convert-office-documents-to-pdf-using-open-office-in-csharp/

于 2013-12-26T09:29:42.393 回答