我正在开发的一个开源项目使用Visio绘图作为文档,并将其检入源代码管理中。对于那些没有Visio的项目工作人员,我们一直在将vsd文件转换为PDF文件,以便他们仍然可以查看它们。在更改文档时将副本另存为PDF并不太困难,但我们希望以自动方式进行此转换,以便我们可以将其设置为SVN客户端中的预签入脚本。如果有人知道如何使用Visio内置的东西,或者使用外部脚本或命令行工具,我们将非常感激。
修改:感谢下面的建议,我找到了Visio Viewer 2010。这对我们使用Windows的贡献者很有帮助。我们仍然希望能够创建PDF,因为每个主要操作系统都有读者,我们的贡献者不会只使用Windows。
答案 0 :(得分:4)
我发现这个漂亮的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
答案 1 :(得分:2)
您可以将vsd2svg和svg2pdf用于转换过程 - 如果您想在命令行上执行此操作。或者底层的库。
答案 2 :(得分:0)
Visio 2007将ExportAsFixedFormat方法添加到Visio API,使您可以在Visio中以编程方式创建PDF文件。
棘手的部分是以对项目有意义的方式部署代码。您可以创建一个仅用作插件的模板,并将该模板附加到项目中的所有Visio文档。模板中的代码只会观察DocumentSaved事件的Visio应用程序对象,并将文档的pdf保存在同一文件夹中。
答案 3 :(得分:0)
这个项目真的很酷:https://github.com/cognidox/OfficeToPDF
超级易于集成到Python处理任务中。提供了编译版本(OfficeToPDF.exe)。
答案 4 :(得分:0)
我写了一个小的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
一起使用,尽管我没有对此进行测试。