【问题标题】:Convert Microsoft Visio Drawing (vsd) to PDF automatically自动将 Microsoft Visio 绘图 (vsd) 转换为 PDF
【发布时间】:2010-12-24 01:37:26
【问题描述】:

我正在处理的一个开源项目使用 Visio 绘图作为文档,这些绘图已签入源代码管理。对于那些不拥有 Visio 的项目工作人员,我们一直在将 vsd 文件转换为 PDF,以便他们仍然可以查看它们。在对文档进行更改时,将副本另存为 PDF 并不难,但我们想要一种自动化的方式来进行这种转换,以便我们可以将其设置为 SVN 客户端中的预签入脚本。如果有人知道如何做到这一点,或者使用 Visio 内置的东西,或者使用外部脚本或命令行工具,我们将不胜感激。

编辑:感谢下面的建议,我找到了Visio Viewer 2010。这将有助于我们使用 Windows 的贡献者。不过,我们仍然希望能够创建 PDF,因为每个主要操作系统上都有可用的阅读器,而且我们的贡献者不会只使用 Windows。

【问题讨论】:

  • 在网上四处看看。曾经有一个来自 Microsoft 的免费 Visio Viewer 应用程序。
  • @JohnS,感谢您的提示;我会四处看看。你还记得它是否适用于 OS X 吗?该项目是一个网络应用程序,我们的一些贡献者使用 OS X 作为他们的主要操作系统。
  • 我认为 Visio 查看器是一个 ActiveX 控件,所以它只能是 Windows。我可能是错的。

标签: automation visio


【解决方案1】:

我找到了这个不错的 vbs 脚本并将其改编为 visio。它可以通过 cygwin 调用(适用于所有类型的 Office 东西)

 Option Explicit

Main()

Sub Main()
  If WScript.Arguments.Count > 0 Then 
      Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")
      Dim i
      For i = 0 to wscript.arguments.count - 1
          Dim strFilePath : strFilePath = WScript.Arguments.Item(i)
          Dim dirPath : dirPath = objFSO.GetParentFolderName(strFilePath)
          Dim fileBaseName : fileBaseName = objFSO.GetBaseName(strFilePath)
          'WScript.Echo strFilePath
          Dim strNewFileName : strNewFileName = dirPath & "\" & fileBaseName & ".pdf"
          'WScript.Echo strNewFileName
          Dim strFileExt : strFileExt = UCase(objFSO.GetExtensionName(strFilePath))
          Select Case strFileExt
              Case "DOC"
                  DOC2PDF strFilePath, strNewFileName
              Case "XLS"
                  XLS2PDF strFilePath, strNewFileName
              Case "PPT"
                  PPT2PDF strFilePath, strNewFileName
              Case "VSD"
                  VSD2PDF strFilePath, strNewFileName
              Case Else
                  WScript.Echo "Extension Type:  " & strFileExt
          End Select
      Next
  Else
      msgbox("Sie muessen eine Datei zum konvertieren auswählen.")
  End If
End Sub

Sub PPT2PDF(strSourceFile, strDestFile)
  Const ppWindowMinimized = 2
  Const ppWindowNormal = 1
  Const ppSaveAsPDF = 32

  Dim objPPT : Set objPPT = CreateObject("PowerPoint.Application")
  objPPT.Visible = True
  objPPT.WindowState = ppWindowMinimized
  objPPT.Presentations.Open strSourceFile
  objPPT.ActivePresentation.SaveAs strDestFile, ppSaveAsPDF 
  objPPT.Quit()
End Sub

Sub DOC2PDF(strSourceFile, strDestFile)
  Const wdExportAllDocument = 0
  Const wdExportOptimizeForPrint = 0
  Const wdExportDocumentContent = 0
  Const wdExportFormatPDF = 17
  Const wdExportCreateHeadingBookmarks = 1

  Dim objWord : Set objWord = CreateObject("Word.Application")
  Dim objDoc : Set objDoc = objWord.Documents.Open(strSourceFile,,TRUE)    
  objWord.ActiveDocument.ExportAsFixedFormat strDestFile, wdExportFormatPDF, False, _
                  wdExportOptimizeForPrint, wdExportAllDocument,,, _
                  wdExportDocumentContent, False, True, wdExportCreateHeadingBookmarks
  objWord.Quit()
End Sub

Sub XLS2PDF(strSourceFile, strDestFile)
  Const xlTypePDF = 0

  Dim objExcel : Set objExcel = CreateObject("Excel.Application")
  Dim objeDoc : Set objeDoc = objExcel.Workbooks.Open(strSourceFile,,TRUE)    
  objExcel.ActiveWorkbook.ExportAsFixedFormat xlTypePDF, strDestFile
  objExcel.ActiveWorkbook.Close(False)
  objExcel.Quit
End Sub

Sub VSD2PDF(strSourceFile, strDestFile)
  Const xlTypePDF = 1
  Const visOpenRO = 2
  Const visOpenMinimized = 16
  Const visOpenHidden = 64
  Const visOpenMacrosDisabled = 128
  Const visOpenNoWorkspace = 256

  Dim objVisio : Set objVisio = CreateObject("Visio.Application")
  Dim objeDoc : Set objeDoc = objVisio.Documents.OpenEx(strSourceFile, visOpenRO + visOpenMinimized + visOpenHidden + visOpenMacrosDisabled + visOpenNoWorkspace)    
  objeDoc.ExportAsFixedFormat xlTypePDF, strDestFile, 1, 0
  objeDoc.Close
  objVisio.Quit
End Sub

【讨论】:

【解决方案2】:

您可以在转换过程中使用 vsd2svg 和 svg2pdf - 如果您想在命令行上执行此操作。或者底层库。

http://dia-installer.de/vsd2svg

http://cgit.freedesktop.org/~cworth/svg2pdf/

【讨论】:

    【解决方案3】:

    这个项目真的很酷:https://github.com/cognidox/OfficeToPDF

    超级容易集成到 Python 进程任务中。提供编译后的版本(OfficeToPDF.exe)。

    【讨论】:

      【解决方案4】:

      Visio 2007 向 Visio API 添加了 ExportAsFixedFormat 方法,让您可以在 Visio 中以编程方式创建 PDF 文件。

      棘手的部分是以对您的项目有意义的方式部署代码。您可以创建一个仅充当插件的模板,并将该模板附加到项目中的所有 Visio 文档中。模具中的代码只会监视 Visio 应用程序对象的 DocumentSaved 事件,并将文档的 pdf 保存在同一文件夹中。

      【讨论】:

        【解决方案5】:

        我为此编写了一个小 Python 脚本:

        import pathlib
        import sys
        import win32com.client
        
        
        def set_ps(page, cell, value):
            page.PageSheet.Cells(cell).Formula = value
        
        
        def convert(visio, path, out_path):
            doc = visio.Documents.Open(str(path))
        
            for page in doc.Pages:
                set_ps(page, "PageLeftMargin", "0mm")
                set_ps(page, "PageRightMargin", "0mm")
                set_ps(page, "PageTopMargin", "0mm")
                set_ps(page, "PageBottomMargin", "0mm")
                page.ResizeToFitContents()
        
            pdf_format = 1
            intent_print = 1
            print_all = 0
            doc.ExportAsFixedFormat(pdf_format, out_path, intent_print, print_all)
            doc.Close()
        
        
        def main():
            visio = win32com.client.Dispatch("Visio.Application")
            visio.AlertResponse = 7  # Answer "no" to all save dialogs
        
            basedir = pathlib.Path(sys.argv[1])
            files = list(basedir.glob('*.vsdx'))
            for i, path in enumerate(files, start=1):
                print(f"[{i:3}/{len(files):3}] {path.stem}")
                out_path = path.with_suffix(path.suffix + '.pdf')
                if out_path.exists():
                    continue
                convert(visio, path, out_path)
        
        
        if __name__ == '__main__':
            main()
        

        您将需要 Python 和 pywin32 库,然后使用包含 .vsdx 文件的文件夹的路径运行它。它也可能适用于.vsd,尽管我没有对此进行测试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-05
          • 1970-01-01
          • 2015-04-26
          • 2016-10-04
          • 2021-01-13
          相关资源
          最近更新 更多