2014-02-20 14 views
5

Wie kann ich eine XPS-Datei speichern, indem ich auf einen virtuellen Drucker drucke, ohne das Dialogfeld "Datei speichern unter" zu verwenden? Wenn ich die Druckmethode aufruft, wird automatisch ein Dialogfeld angezeigt, in dem der Benutzer aufgefordert wird, den Dateinamen und den Pfad anzugeben. Dies funktioniert nur beim Erstellen brandneuer Dateien. Es wird der Fehler "Sie haben keine Berechtigung, in diese Datei zu schreiben ..." angezeigt, wenn ich versuche, eine vorhandene Datei zu überschreiben. Wie auch immer, ich möchte, dass der Benutzer in der Lage ist, den Dateinamen in meinem eigenen Dialog anzugeben, nicht den, der automatisch von der printDocument-Methode Print aufgerufen wird.Drucken nach XPS ohne Dialogfeld "Speichern unter"

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 
+0

Deshalb habe ich am Ende zu PDFs gewechselt. Es gibt einige schöne PDF SDKs und kostenlose. – OneFineDay

+0

Ich wollte PDFs verwenden, aber ich kann nicht. Es war nicht meine Wahl ... –

+0

Nicht alle Computer haben den 'XPS' Treiber und dann kann nur ein Browser die Datei öffnen. Dies macht keinen Sinn gegenüber einem weitverbreiteten PDF-Dateityp. – OneFineDay

Antwort

4

Es ist ein paar Monate zu spät, aber hier gehen wir.

2 Fragen, zwei Antworten.

Frage 1: Wie kann ich eine XPS-Datei speichern, indem ich auf einen virtuellen Drucker drucke, ohne das Dialogfeld "Datei speichern unter" zu verwenden?

Antwort 1: Sie waren in der Nähe. Ich glaube, Sie suchen

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

Hier ist mein Umsetzung: (Legal Papierformat, Querformat)

 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 

Wie Sie sehen können, verwende ich die oxps Dateiformat, aber es sollte immer noch funktionieren genauso für Sie.

Frage 2: Es wird ein Fehler ausgegeben "Sie haben keine Berechtigung, in diese Datei zu schreiben ...", wenn ich versuche, eine vorhandene Datei zu überschreiben.

Antwort 2: Überprüfen Sie, ob die Datei bereits vor dem Drucken der Datei vorhanden ist, und löschen Sie sie, falls dies der Fall ist. Natürlich wird es fehlschlagen, eine Datei zu erstellen, die bereits existiert.

Aus irgendeinem Grund mit My.Computer.FileSystem.DeleteFile ist schneller als die traditionellen Kill() und System.IO.File.Delete, die beide den Thread benötigen, um ~ 1-200ms vor dem Erstellen der Datei zu schlafen, Andernfalls wird ein anderer Zugriff verweigert.

Hoffentlich hilft das jemand in der Zukunft!