Delphi使用Word ActiveX将doc转换为pdf

5

有人已经编写了代码,使用Word 2007或Word 2010的pdf导出功能将doc或docx转换为pdf吗?

2个回答

9
我目前还没有尝试过,但这应该不难实现:

以下是基本框架:

uses
  ComObj;
const
  wdExportFormatPDF = 17;
var 
  Word, Doc: OleVariant;
begin
  Word := CreateOLEObject('Word.Application');
  Doc := Word.Documents.Open('C:\Document.docx');
  Doc.ExportAsFixedFormat('C:\Document.pdf', wdExportFormatPDF);
end;

请注意,我已将WordDoc变量声明为OleVariants,以便实现版本无关性(即,无论您使用Word 2007还是2010,此代码都可以工作)。如果您想要的话,也可以使用VCL Office组件库。如果您在文档本身中进行了大量处理,那肯定会更快。

1
好的,这个可以工作(我只是用ComObj替换了OleAuto,因为我知道OleAuto已经被弃用了)。请问您能告诉我在哪里找到VCL Office组件库吗?我记得在Delphi 7调色板中看到过它们,但我在2009中没有看到它们。 - UnDiUdin
@user193655:我记得在安装程序中有一个单独的选项,但我不能确定。我的D2010设置中也没有它们(但我几乎总是使用变量,以便更灵活 - 我使用VBA的对象浏览器来找出要使用的对象和方法)。 - Martijn

3

我使用以下vbs脚本来实现。如果您需要Delphi代码,则很容易进行转换:

Const wdDoNotSaveChanges = 0
Const wdRevisionsViewFinal = 0
Const wdFormatPDF = 17

Dim arguments
Set arguments = WScript.Arguments

Function DOC2PDF(sDocFile)

  Dim fso ' As FileSystemObject
  Dim wdo ' As Word.Application
  Dim wdoc ' As Word.Document
  Dim wdocs ' As Word.Documents

  Set fso = CreateObject("Scripting.FileSystemObject")
  sDocFile = fso.GetAbsolutePathName(sDocFile)
  sPdfFile = fso.GetParentFolderName(sDocFile) + "\" + fso.GetBaseName(sDocFile) + ".pdf"

  Set wdo = CreateObject("Word.Application")
  Set wdocs = wdo.Documents
  WScript.Echo "Opening: " + sDocFile
  Set wdoc = wdocs.Open(sDocFile)
  if fso.FileExists(sPdfFile) Then
    fso.DeleteFile sPdfFile, True
  End If
  WScript.Echo "Converting to PDF: " + sPdfFile
  Set wview = wdoc.ActiveWindow.View
  wview.ShowRevisionsAndComments = False
  wview.RevisionsView = wdRevisionsViewFinal
  wdoc.SaveAs sPdfFile, wdFormatPDF
  WScript.Echo "Conversion completed"
  wdo.Quit wdDoNotSaveChanges

  Set fso = Nothing
  Set wdo = Nothing

End Function

If arguments.Count=1 Then 
  Call DOC2PDF(arguments.Unnamed.Item(0))
Else
  WScript.Echo "Generates a PDF file from a Word document using Word PDF export."
  WScript.Echo ""
  WScript.Echo "Usage: doc2pdf.vbs <doc-file>"
  WScript.Echo ""
End If

我选择这个答案,因为它包含了"wdDoNotSaveChanges",这帮助了我很多!我浪费了一天的时间,然后我又读了一遍这个问题!如果不使用那个词语来询问是否保存,非常令人恼火。 - UnDiUdin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接