【问题标题】:Print to XPS without a Save As dialog在没有“另存为”对话框的情况下打印到 XPS
【发布时间】:2014-03-22 00:00:12
【问题描述】:

如何在不使用“文件另存为”对话框的情况下通过打印到虚拟打印机来保存 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

【问题讨论】:

  • 这就是我最终切换到 PDF 的原因。有几个不错的 PDF SDK 和免费的。
  • 我想使用 PDF 但我不能。这不是我的选择...
  • 并非所有计算机都有XPS 驱动程序,然后只有浏览器才能打开该文件。这对广泛使用的 PDF 文件类型毫无意义。
  • 既然我必须使用XPS,这可能吗?
  • 据我所知没有。希望其他人可以帮助您。

标签: vb.net printing xps


【解决方案1】:

这已经晚了几个月,但我们开始吧。

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-200 毫秒,或者否则会出现不同的拒绝访问错误。

希望这对将来的某人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 2011-04-05
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    相关资源
    最近更新 更多