Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Print to XPS without a Save As dialog

How can I save an xps file by printing to a virtual printer without using the Save File As dialog? When I call the print method, a dialog automatically pops up asking the user to specify the file name and path. This only works when creating brand new files; it throws an error 'you do not have permission to write to that file...' if I attempt to overwrite an existing file. Anyways, I want the user to be able to specify the file name in my own dialog, not the one that is autamatically called by the printDocument's Print method.

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
like image 749
Bernoulli Lizard Avatar asked Oct 01 '22 13:10

Bernoulli Lizard


People also ask

Where does XPS printer save?

Where does Microsoft XPS Document Writer save to. The MXDW printer saves files in the Documents folder: C:\Users\user-name\Documents .

Can XPS document be printed?

To print XPS you can make use of available Microsoft Office tools, but the files in this case will be printed one by one. Batch XPS printing is possible with Print Conductor. This software provides support for all types of printers and has a trial version for free evaluation.


1 Answers

It's a couple of months late, but here we go.

2 questions, two answers.

Question 1: How can I save an xps file by printing to a virtual printer without using the Save File As dialog?

Answer 1: You were close. I think you're looking for

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

Here is my implementation: (Legal paper size, landscape mode)

        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

As you can see, I use the oxps file format, but it should still work just the same for you.

Question 2: it throws an error 'you do not have permission to write to that file...' if I attempt to overwrite an existing file.

Answer 2: Check if the file already exists prior to printing the file, and delete it if it does. Of course it will fail attempting to create a file that already exists.

For some reason using My.Computer.FileSystem.DeleteFile is faster than the traditional Kill() and System.IO.File.Delete, which both require the thread to sleep for ~1-200ms prior to recreating the file, or else a different access denied error will occur.

Hopefully this helps someone in the future!

like image 142
Matt Anderson Avatar answered Oct 04 '22 03:10

Matt Anderson