编程转换字(DOCX)为PDF [英] Programmatically convert Word (docx) to PDF

查看:231
本文介绍了编程转换字(DOCX)为PDF的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好之前你觉得不喜欢这样一个问题请阅读此第一。

Ok before you think "Not another question like this" please read this first.

我有一个应用程序(在ASP.NET MVC 3 Web应用程序)使用 DOCX库

I have an application (web application in ASP.NET MVC 3) the generates Word files in DocX using the DocX library.

应用程序需要的模板,并与数据库中的所有数据填充进去。
现在,我想创建创建的docx文件的PDF版本。

The application takes a template and fills it in with all the data from a database. Now I want to create a PDF version of that created docx-file.

我知道<一个href=\"http://www.aspose.com/categories/.net-components/aspose.words-for-.net/default.aspx\">apose.word是一种选择,但不适合我,因为我没有多少预算。在这里我不得不花一些钱上的其他库也出了问题。

I know apose.word is an option, but not for me since I have little budget. Other libs where I have to spend some money on are also out of the question.

我没有在SharePoint服务器,以便字自动化服务是不是一种选择无论是。

I don't have a sharepoint server so Word Automation Services isn't an option either.

所以,我有2个选项(据我所知)离开了,他们都使用 iTextSharp的。不知道哪个好。

So I have 2 options (that I know) left and they both use iTextSharp. Don't know which is better.


  1. 我可以从DOCX文件中使用生成的XML并将它转换为一个版本是iTextSharp的使用。

  2. 像我创建一个模板的docx我可以创建PDF文件。

任何人有多少工作,这2者有更好的表现任何想法,如果它做的是甚至有可能。

Anybody has any idea on how much work it is, which of those 2 has better performance and if it is even possible to do.

我知道,第二个选项有不利的一面是,当我更改模板我必须改变它的两个版本。

I know that the second option has the downside that when I change a template I have to change it for both versions.

如果你有一个更好的解决方案(自由即是),欢迎你来分享。

If you have a better solution (free that is), you are welcome to share it.

推荐答案

另一种选择,即使它需要一些工作:在服务器上安装OpenOffice和使用UNO库(包括他们作为你的应用程序集),你可以打开DOCX文档并将其直接保存为PDF。结果
过了几分钟,我发布一个例子...

Another option, even if it needs some work: install OpenOffice on server and, using UNO libraries (including them as assemblies in your app), you can open docx document and save it in PDF directly.
In a few minutes I post an example...

偏例子:结果
这是一类我创建了一个很久以前并用于文件转换为PDF

PARTIAL EXAMPLE:
This is a class I created a long time ago and used to convert files to 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<string> filters = new List<string>();

        #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<PropertyValue> pv = new List<PropertyValue>();
            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<PropertyValue> pv = new List<PropertyValue>();
            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<PropertyValue> pv = new List<PropertyValue>();
            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<string> Filters
        {
            get { return filters; }
        }
        #endregion
    }
}

这篇关于编程转换字(DOCX)为PDF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆