在我的网络项目中,我使用 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. 。您可以在以下位置查看更多相关信息 这个网站. 。您的使用非常简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top