不使用“另存为”对话框打印到XPS

时间:2014-02-20 19:49:45

标签: vb.net printing xps

如何在不使用“另存文件为”对话框的情况下通过打印到虚拟打印机来保存xps文件?当我调用print方法时,会弹出一个对话框,要求用户指定文件名和路径。这仅适用于创建全新文件;如果我试图覆盖现有文件,它会抛出一个错误'你没有权限写入该文件......'无论如何,我希望用户能够在我自己的对话框中指定文件名,而不是printDocument的Print方法自动调用的文件名。

Public Event PrintPage As System.Drawing.Printing.PrintPageEventHandler
Private WithEvents Doc As New Printing.PrintDocument

Public Sub SaveXPSFile()
    Doc.PrinterSettings.PrinterName = "Microsoft XPS Document Writer"
    Doc.PrinterSettings.PrintFileName = "C:\Users\POConnell\Documents\t.xps"
    Doc.Print()
    Doc.Dispose()
End Sub

Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles Doc.PrintPage
   'drawing commands go here
End sub

1 个答案:

答案 0 :(得分:4)

已经晚了几个月,但我们走了。

2个问题,2个答案。

问题1: 如何在不使用“另存为文件”对话框的情况下通过打印到虚拟打印机来保存xps文件?

答案1:你很亲密。我想你正在寻找

Doc.DefaultPageSettings.PrinterSettings.PrintToFile = True Doc.DefaultPageSettings.PrinterSettings.PrintFileName =“C:\ Users \ POConnell \ Documents \ t.xps”

这是我的实施: (法定纸张尺寸,横向模式)

        Using prn As New PrintDocument
            With prn
                .PrinterSettings.PrinterName = "Microsoft XPS Document Writer"
                AddHandler .PrintPage, _
                   AddressOf Me.PrintPageHandler
                .DefaultPageSettings.Landscape = landscape
                .DefaultPageSettings.PaperSize = New PaperSize("Legal", 850, 1400)
                If My.Computer.FileSystem.FileExists("C:\temp\Log.oxps") Then My.Computer.FileSystem.DeleteFile("C:\temp\Log.oxps")
                .DefaultPageSettings.PrinterSettings.PrintToFile = True
                .DefaultPageSettings.PrinterSettings.PrintFileName = "C:\temp\Log.oxps"
                .Print()
                RemoveHandler .PrintPage, _
                   AddressOf Me.PrintPageHandler
            End With
        End Using

正如您所看到的,我使用的是oxps文件格式,但它仍然适用于您。

问题2:如果我试图覆盖现有文件,则会抛出错误“您无权写入该文件...”。

答案2:在打印文件之前检查文件是否已存在,如果存在则将其删除。当然,尝试创建已存在的文件会失败。

由于某些原因,使用My.Computer.FileSystem.DeleteFile比传统的Kill()和System.IO.File.Delete更快,它们都需要线程在重新创建文件之前休眠~1-200ms,或者否则将发生不同的访问被拒绝错误。

希望这有助于将来的某个人!