我发现有几个开源/免费程序,可以将.doc文件转换为.pdf文件,但是它们都是应用程序/打印机驱动程序的全部,没有附带SDK。
我发现有一些程序确实具有SDK,可让您将.doc文件转换为.pdf文件,但它们都是专有类型,许可证价格为2,000美元左右。
有人知道使用C#或VB.NET可以解决我的问题的任何干净,廉价(最好免费)的程序化解决方案吗?
谢谢!
我发现有几个开源/免费程序,可以将.doc文件转换为.pdf文件,但是它们都是应用程序/打印机驱动程序的全部,没有附带SDK。
我发现有一些程序确实具有SDK,可让您将.doc文件转换为.pdf文件,但它们都是专有类型,许可证价格为2,000美元左右。
有人知道使用C#或VB.NET可以解决我的问题的任何干净,廉价(最好免费)的程序化解决方案吗?
谢谢!
Answers:
使用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;
总结一下vb.net用户,免费选项(必须安装Office):
Microsoft Office组件下载:
添加对Microsoft.Office.Interop.Word.Application的引用
将using或import(vb.net)语句添加到Microsoft.Office.Interop.Word.Application
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()
PDFCreator具有一个COM组件,可从.NET或VBScript调用(下载中包含示例)。
但是,在我看来,打印机正是您所需要的-只需将其与Word的自动化功能相结合,您就可以使用了。
只是想补充一点,我使用了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;
}
app.Visible = false;
并添加呼叫app.Quit();
。
在Joel的论坛上,有一个关于将Word转换为PDF的库的完整讨论。来自线程的一些建议:
当有人将10000个Word文件丢给我以转换为PDF时,我经历了Word到PDF的痛苦。现在,我用C#进行了操作,并使用了Word互操作,但是如果我完全尝试使用PC,它会很慢并且崩溃。
这使我发现我可以转储互操作性和它们的缓慢性.....对于我使用的Excel(EPPLUS),然后我发现您可以获得一个名为Spire的免费工具,该工具可以转换为PDF ...但有限制!
http://www.e-iceblue.com/Introduce/free-doc-component.html#.VtAg4PmLRhE
简单的代码和解决方案,用于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();
}
}
似乎是一些相关信息:
另外,由于Office 2007具有发布到PDF的功能,我想您可以使用Office自动化在Word 2007中打开* .DOC文件并另存为PDF。我不太热衷于办公室自动化,因为它很慢并且容易挂起,但是只是把它扔在那里。
Microsoft Word的Word外接程序似乎是目前最好的解决方案,但是您应该考虑到它不能将所有Word文档正确转换为pdf,在某些情况下,您会看到word与输出pdf之间的巨大差异。不幸的是,我找不到任何可以正确转换所有Word文档的api。我发现唯一可以确保转换100%正确的解决方案是通过打印机驱动程序转换文档。不利之处在于文档排队并一个接一个地转换,但是您可以确定生成的pdf与word文档布局完全相同。我个人更喜欢使用UDC(通用文档转换器)并在服务器上安装了Foxit Reader(免费版),然后通过启动“进程”并将其Verb属性设置为“打印”来打印文档。
pandoc manual.docx -o manual.pdf