我发现了几个开源/免费程序,可让您将.doc文件转换为.pdf文件,但它们都是应用程序/打印机驱动程序的全部,没有附带SDK。

我发现有一些程序确实具有SDK,可让您将.doc文件转换为.pdf文件,但是它们都是专有类型,许可费为2,000美元左右。

有人知道使用C#或VB.NET可以解决我的问题的任何干净,廉价(最好是免费)的编程解决方案吗?

谢谢!

评论

检查Pandoc是否具有您喜欢的语言的绑定。命令行界面也很简单pandoc manual.docx -o manual.pdf

另外,检查GemBox.Document SDK。它有一个免费版本和一个廉价版本。它既不使用打印机驱动程序也不使用ms office将Word文件转换为PDF。

您可以使用docx2pdf进行此转换:github.com/AlJohri/docx2pdf

#1 楼

使用foreach循环而不是for循环-它解决了我的问题。

int j = 0;
foreach (Microsoft.Office.Interop.Word.Page p in pane.Pages)
{
    var bits = p.EnhMetaFileBits;
    var target = path1 +j.ToString()+  "_image.doc";
    try
    {
        using (var ms = new MemoryStream((byte[])(bits)))
        {
            var image = System.Drawing.Image.FromStream(ms);
            var pngTarget = Path.ChangeExtension(target, "png");
            image.Save(pngTarget, System.Drawing.Imaging.ImageFormat.Png);
        }
    }
    catch (System.Exception ex)
    {
        MessageBox.Show(ex.Message);  
    }
    j++;
}


这里是对我有用的程序的修改。它使用安装了“另存为PDF”加载项的Word 2007。它在目录中搜索.doc文件,在Word中打开它们,然后将它们另存为PDF。请注意,您需要在解决方案中添加对Microsoft.Office.Interop.Word的引用。

using Microsoft.Office.Interop.Word;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

...

// Create a new Microsoft Word application object
Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();

// C# doesn't have optional arguments so we'll need a dummy value
object oMissing = System.Reflection.Missing.Value;

// Get list of Word files in specified directory
DirectoryInfo dirInfo = new DirectoryInfo(@"\server\folder");
FileInfo[] wordFiles = dirInfo.GetFiles("*.doc");

word.Visible = false;
word.ScreenUpdating = false;

foreach (FileInfo wordFile in wordFiles)
{
    // Cast as Object for word Open method
    Object filename = (Object)wordFile.FullName;

    // Use the dummy value as a placeholder for optional arguments
    Document doc = word.Documents.Open(ref filename, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing);
    doc.Activate();

    object outputFileName = wordFile.FullName.Replace(".doc", ".pdf");
    object fileFormat = WdSaveFormat.wdFormatPDF;

    // Save document into PDF Format
    doc.SaveAs(ref outputFileName,
        ref fileFormat, ref oMissing, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing,
        ref oMissing, ref oMissing, ref oMissing, ref oMissing);

    // Close the Word document, but leave the Word application open.
    // doc has to be cast to type _Document so that it will find the
    // correct Close method.                
    object saveChanges = WdSaveOptions.wdDoNotSaveChanges;
    ((_Document)doc).Close(ref saveChanges, ref oMissing, ref oMissing);
    doc = null;
}

// word has to be cast to type _Application so that it will find
// the correct Quit method.
((_Application)word).Quit(ref oMissing, ref oMissing, ref oMissing);
word = null;


评论


谢谢!如果它比Word自动化要快的话,我可能还是会选择Aspose。但是,如果我可以忍受一点点迟缓,我会适当地使用您的解决方案。再次感谢!

– Shaul Behr
09年3月4日在7:54

是的,它不是最快的,但很难超过价格。 :-) 很高兴我能帮助你。

–埃里克·内斯(Eric Ness)
09年3月4日在14:28

使用Office 2007 SP2,您不再需要另存为PDF下载。我还成功地将这种技术用于Excel和Powerpoint。

–RichardOD
09年9月30日在9:07

您是否在具有Web应用程序的服务器上使用此方法?我遇到了很多问题,更不用说MS不推荐它了。 support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2我听说ASPose很棒,但它确实很亲切。

–普拉布
09-12-22在4:43

嗯...如果没有安装word,我认为打包互操作程序集将是您最少的麻烦。此代码需要安装单词。

– BrainSlugs83
2011-10-25 2:25

#2 楼

为vb.net用户总结一下,免费选项(必须安装Office):

Microsoft Office组件下载:



pia适用于Office 2010
用于Office 2007的pia
向Microsoft.Office.Interop.Word.Application添加引用
向Microsoft.Office.Interop.Word添加使用或导入(vb.net)语句。应用程序

VB.NET示例:

        Dim word As Application = New Application()
        Dim doc As Document = word.Documents.Open("c:\document.docx")
        doc.Activate()
        doc.SaveAs2("c:\document.pdf", WdSaveFormat.wdFormatPDF)
        doc.Close()


评论


在2015年仍然可以使用。借助Office 2013,您无需单独下载PIA。

–亚当·安德森(Adam Anderson)
2015年4月9日在19:47

还有BOOM,如果它打开一个消息框并询问某些内容-例如在Web应用程序中...或同时执行两个文档...

– Stefan Steiger
16-3-1在14:59



一个免费增值选项(通过nodejs和edge.js或Javascript.NET)是npmjs.com/package/@nativedocuments/docx-wasm(不需要Word)

– JasonPlutext
19年1月25日在0:00

#3 楼

PDFCreator具有一个COM组件,可从.NET或VBScript调用(下载中包含示例)。

但是,在我看来,打印机正是您所需要的-只需将其与Word的自动化功能相结合,您就可以使用了。

评论


这个COM组件在哪里? “ mik”是什么意思?那是“混合”吗?

– Shaul Behr
09年3月3日在19:49

下载中包含COM组件以及示例。是的,那应该是“混合”。

– Mark Brackett
09年3月4日在11:01

仅供参考-如果您采用这种方法,PDFCreator会在安装程序中捆绑恶意软件。自2009年以来,这是PDFCreator的一个持续存在的问题。

– Phil Gorley
15年5月28日在20:22

@PhilGorley恶意软件?这个答案是+8 ...

– Mzn
15年8月5日在10:18

@Mzn-FWIW,请注意并取消选中插件安装对我来说总是可行的。我认为它与Java安装程序中的Oracle捆绑废话没有什么不同。这很烦人,但不值得为我避免使用该软件(是的,好吧,PdfCreator的广告软件可能比Oracle如今所推动的功能无限地少用,而且更具侵入性……我仍然不想要其中任何一个)。

– Mark Brackett
2015年8月5日在16:09



#4 楼

只是想补充一点,我使用了Microsoft.Interop库,特别是我在该线程中没有看到的ExportAsFixedFormat函数。

using Microsoft.Office.Interop.Word;
using System.Runtime.InteropServices;
using System.IO;
using Microsoft.Office.Core;

Application app;

public string CreatePDF(string path, string exportDir)
{
    Application app = new Application();
    app.DisplayAlerts = WdAlertLevel.wdAlertsNone;
    app.Visible = true;

    var objPresSet = app.Documents;
    var objPres = objPresSet.Open(path, MsoTriState.msoTrue, MsoTriState.msoTrue, MsoTriState.msoFalse);

    var pdfFileName = Path.ChangeExtension(path, ".pdf");
    var pdfPath = Path.Combine(exportDir, pdfFileName);

    try
    {
        objPres.ExportAsFixedFormat(
            pdfPath,
            WdExportFormat.wdExportFormatPDF,
            false,
            WdExportOptimizeFor.wdExportOptimizeForPrint,
            WdExportRange.wdExportAllDocument
        );
    }
    catch
    {
        pdfPath = null;
    }
    finally
    {
        objPres.Close();
    }
    return pdfPath;
}


评论


只是为那些不知道您需要在计算机上安装Office才能使用Microsoft Interop库的人员提供的注释。

– Sam Rueby
18-2-23在15:31

真好!我建议设置app.Visible = false;并添加对app.Quit()的调用;在最后一块。

–丹·科恩
5月5日20:29

#5 楼

在Joel的论坛上,有一个关于将Word转换为PDF的库的完整讨论。来自线程的一些建议:


Aspose
pdfcreator
PDFsharp


评论


谢谢,但是那里的所有建议都属于我上面描述的两类:不是程序性的,或者是非常昂贵的。我特别需要.doc以编程方式来.pdf。

– Shaul Behr
09年3月3日在19:41

#6 楼

当有人将10000个Word文件丢给我以转换为PDF时,我经历了Word到PDF的痛苦。现在,我使用C#进行了操作,并使用了Word互操作,但是如果我完全尝试使用PC,它会很慢并且崩溃。.非常令人沮丧。

这使我发现我可以转储互操作及其缓慢。 ....对于Excel我使用(EPPLUS),然后我发现您可以获得一个名为Spire的免费工具,该工具可以转换为PDF ...但有限制!

http://www.e-iceblue.com/Introduce/free-doc-component.html#.VtAg4PmLRhE

评论


谢谢您-无需使用Interop的绝佳解决方案。为什么很难找到免费的docx转PDF转换器?

–mbdavis
18年2月14日在20:03

我对此寄予厚望,但免费版本仅限于3页PDF输出。如果您需要无限的部署,则完整版非常昂贵。

– grinder22
19年2月27日在0:28

grinder22 GemBox.Document也有一个免费版本,带有大小限制和收费版本。但是,它包括免版税的部署,因此您可以构建和发布无限数量的项目而无需支付额外费用。

–hertzogth
2月11日8:51

#7 楼

使用Microsoft.Office.Interop.Word转换PDF中的WORD的简单代码和解决方案

using Word = Microsoft.Office.Interop.Word;

private void convertDOCtoPDF()
{

  object misValue = System.Reflection.Missing.Value;
  String  PATH_APP_PDF = @"c:\..\MY_WORD_DOCUMENT.pdf"

  var WORD = new Word.Application();

  Word.Document doc   = WORD.Documents.Open(@"c:\..\MY_WORD_DOCUMENT.docx");
  doc.Activate();

  doc.SaveAs2(@PATH_APP_PDF, Word.WdSaveFormat.wdFormatPDF, misValue, misValue, misValue, 
  misValue, misValue, misValue, misValue, misValue, misValue, misValue);

  doc.Close();
  WORD.Quit();


  releaseObject(doc);
  releaseObject(WORD);

}


添加此过程以释放内存:

private void releaseObject(object obj)
{
  try
  {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
      obj = null;
  }
  catch (Exception ex)
  {
      //TODO
  }
  finally
  {
     GC.Collect();
  }
}


评论


是否有必要调用GC.Collect?是否有其他方法可以只标记与此相关的内存部分以在下一个自动GC上释放?

– Preza8
1月30日11:48

#8 楼

似乎是一些相关信息:

在ASP.NET中将MS Word文档转换为PDF

此外,由于Office 2007已发布为PDF功能,我想您可以使用办公室自动化以在Word 2007中打开* .DOC文件并另存为PDF。我不太热衷于办公室自动化,因为它很慢并且容易挂起,但是只是把它扔在那里...

评论


Aspose可能可以工作,但是非常昂贵。

– Shaul Behr
09年3月3日在19:43

#9 楼

Microsoft Word的Word外接程序似乎是目前最好的解决方案,但是您应该考虑到它不能将所有Word文档正确地转换为pdf,在某些情况下,您会看到word与输出pdf之间的巨大差异。不幸的是,我找不到任何可以正确转换所有Word文档的api。
我发现唯一可以确保转换100%正确的解决方案是通过打印机驱动程序转换文档。缺点是文档要排队并逐一转换,但是您可以确保生成的pdf与word文档布局完全相同。
我个人更喜欢使用UDC(通用文档转换器)并安装Foxit Reader(免费)然后在服务器上也通过启动“进程”并将其Verb属性设置为“打印”来打印文档。您也可以使用FileSystemWatcher在转换完成后设置信号。