【问题标题】:Delphi convert doc to pdf using Word ActiveXDelphi 使用 Word ActiveX 将 doc 转换为 pdf
【发布时间】:2011-03-30 09:50:12
【问题描述】:

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

【问题讨论】:

    标签: delphi ms-word pdf-generation activex


    【解决方案1】:

    到目前为止我还没有,但应该不难:

    这是一个基本的骨架:

    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;
    

    请注意,我已将 Word 和 Doc 变量声明为 OleVariants,以便与版本无关(即无论您使用的是 Word 2007 还是 2010,此代码都可以使用)。如果需要,您还可以使用 VCL Office 组件库。如果你要在文档本身做大量的处理,那肯定会更快。

    【讨论】:

    • 好吧,这行得通(我刚刚用 ComObj 替换了 OleAuto,因为我知道 OleAuto 已被弃用)。您能否告诉我在哪里可以找到 VCL Office 组件库:我记得在 Delphi 7 Palette 中看到过它们,但我在 2009 年没有看到它们。
    • @user193655:我似乎记得它是安装程序中的一个单独选项,但我不能确定。我的 D2010 设置中也没有它们(但我几乎总是使用变体,以便更灵活——我使用 VBA 的对象浏览器来找出要使用的对象和方法)
    【解决方案2】:

    我使用以下 .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,这对我有很大帮助!我失去了 1 天,然后我再次阅读了这个问题!不使用这个词要求保存,这很烦人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多