none
Adobe PDF und PrintDocument.PrintToFile RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen

    Ich habe eigentlich kein VB Problem sondern ehr eins mit Adobe aber vielleicht hat jemand eine Idee oder Lösung dafür.

    Ich habe eine Anwendung geschrieben welche Daten aus einer Datenbank aufbereitet und Bescheide druckt. Dabei kann es vorkommen das bis zu 3000-5000 Bescheide erstellt werden. Diese Bescheide werden aber nicht an einen normalen Drucker gesendet (Was man aber auch könnte) sondern die Bescheide sollen in einem vorher definierten Verzeichnis erstellt werden als PDF. Der Microsoft eigene Drucker "Microsoft Print To PDF" funktioniert zwar beim erstellen, aber die PDF Datei ist nicht konform für die Übersendung an ein Briefversende-Programm. Dieses Programm erkennt die Adresse nicht korrekt. 

    Wenn ich den "Adobe PDF" Drucker automatisiert benutze wird eine defekte PDF-erzeugt. Wenn ich die Option "PrintToFile" = False setzte dann wird eine Korrekte PDF-Datei erzeugt, aber ich muss jedem einzelnen Dokument sagen "Speichern unter" und den Dateinamen angeben was bei 3-5000 Dokumenten nicht sinnvoll ist.  

    Hat jemand zufällig eine Idee?

    • Typ geändert Stefan FalzModerator Samstag, 31. März 2018 18:53 Thread inaktiv, keine weitere Aktivität
    Dienstag, 27. Februar 2018 09:11

Alle Antworten

  • Hallo,

    Du könntest einen virtuellen Drucker wie printer++ benutzen. Dieser lässt sich so konfigurieren das er die PDF in einen bestimmten Ordner ablegt. Eine andere Möglichkeit ist z.B. GhostScript beachte hier aber die Lizenzen. Funktionieren tut beides sehr gut. Habe ich beides im Einsatz. 


    Gruß Thomas
    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!
    Dev Apps von mir: Icon für UWP,  UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    Dienstag, 27. Februar 2018 09:27
  • Hallo Thomas

    Hab mir den virtuellen Drucker Printer++ installiert und es ist das selbe als wenn ich mit Adobe direkt ausdrucke die PDF-Datei ist defekt.

    Bei GhostScript müsste ich mich einarbeiten und alles komplett neu schreiben und dafür ist im Moment keine Zeit vorhanden.

    Was funktioniert
    -Bescheide direkt an den Drucker schicken (geht nicht wollen es online versenden)
    -Bescheide als XPS-Datei im Verzeichnis ablegen (muss später dann konvertiert werden)
    -Bescheide als PDF-Datei mit Microsoft erstellen (Datei ist okay wird aber vom Briefprogramm nicht erkannt)
    -Bescheide an Adobe oder Briefprogramm Drucker schicken (man muss jeden Bescheid manuell bestätigen.)

    Dim prntDoc As New System.Drawing.Printing.PrintDocument()

    prntDoc.DocumentName = "Aktenzeichen des Bescheid"
    prntDoc.PrinterSettings.PrinterName = "Adobe PDF" <-- Wird vorher ausgewählt und übergeben.
    prntDoc.PrinterSettings.PrintFileName = "d:\bescheide2017\aktenzeichen.pdf"
    prntDoc.PrinterSettings.PrintToFile = True
    

    Dienstag, 27. Februar 2018 11:20
  • Hi,

    wenn das Briefversendeprogramm nicht mit dem Format zurechtkommt, das eine korrekt erstellte PDF Datei bietet, verlangt das Programm wohl irgendwelche Besonderheiten, die dir nur der Hersteller dieser Software sagen kann.

    Daher würde ich diesen mal fragen, wie Du automatisiert anwendungskonforme Dateien erstellen kannst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 27. Februar 2018 15:26
    Moderator
  • Hallo Stefan 

    Da gebe ich Dir Recht und ich hatte mit dem Support gesprochen und der sagte mir das der Adobe und ihr eigener PDF Druckertreiber (welcher auf Adobe basiert) irgendwas anders Rendern. 

    Wenn ich die PDF-Datei öffne, welche von dem "Microsoft Print To PDF" Drucker erzeugt wurde, und sage nochmals im Drucken -> "Adobe PDF" dann ist die Datei wieder korrekt. (Ein Schelm wer böses dabei denkt ;-))

    Ich habe für mich jetzt folgendes gefunden.

    1. Die Dateien werden über den XPS-Dokumenten Drucker erzeugt.
    2 Danach wird die XPS-Datei über ein Prozess "GhostXps" umgewandelt. 

    Der Aufruf kann folgendermaßen erfolgen

    Public Function ConvertToPdf(ByVal target As String, ByVal source As String) As Boolean
    Dim pz As New Process()
    '
    Try
      pz.StartInfo.FileName = "App-Pfad"
      pz.StartInfo.Arguments = String.Format("-sDEVICE=pdfwrite -sOutputFile={0} -dNOPAUSE {1}", New Object(){target, source})
      pz.Start()
      pz.WaitForExit()
      pz.Close
      '
      Return True
      '
    Catch ex As Exception
      Return False
    End Try
    '
    End Function
    

    Gruß Thomas 

    Dienstag, 27. Februar 2018 15:52
  • Wenn Du Word Dokumente erzeugst und Office auf dem Rechner hast, könntest Du auch die WordApi nutzen und die Dokumente als PDF zu speichern. Ich nutze dafür NetOffice

    Der C# Code würde so aussehen

    using Word = NetOffice.WordApi;
    private static void docx(string file)
            {
                try
                {
                    using (Word.Application appWord = new Word.Application())
                    {
                        appWord.DisplayAlerts = Word.Enums.WdAlertLevel.wdAlertsNone;
                        appWord.Visible = false;
    
                        Word.Document wordDocument = appWord.Documents.Add(file);
    
                        var name = System.IO.Path.GetFileNameWithoutExtension(file);
                        var path = System.IO.Path.GetDirectoryName(file);
                        var pdf = path + "\\" + name + ".pdf";
    
    
                        wordDocument.ExportAsFixedFormat(pdf, Word.Enums.WdExportFormat.wdExportFormatPDF);
    
                        wordDocument.Close(false);
                        appWord.Quit();
                        System.IO.File.Delete(file);
                    }
                    
                }
                catch (Exception ex)
                {
                    LogHelper.Log(ex.Message);
                }
            }
    Auf einem Server wo kein Benutzer angemeldet ist, solltest Du das nicht benutzen. Man kann die COM zwar so konfigurieren das die ohne Benutzeranmeldung funktionieren. Aber wirklich schön ist das nicht. Als zwischen Lösung könnte man das aber benutzen


    Gruß Thomas
    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!
    Dev Apps von mir: Icon für UWP,  UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App



    Dienstag, 27. Februar 2018 16:24
  • Hallo Thomas

    Wäre eine Möglichkeit, aber die Anwendung muss schon so laufen das keine Programme eingesetzt werden müssen, die extra gekauft werden müssen. Also möglichst mit Windows Bordmitteln oder halt frei.

    Das Grundproblem für mich ist halt das der Druckertreiber von Adobe sich nicht so verhält wie man es annehmen könnte. Aber das hat nichts mit vb.Net oder c# zu tun sondern scheint ein allgemeines Problem mit Adobe zu sein. Nicht umsonst gibt es im Netz viele Fragen "Wie kann ich mit viele Dateien unbeaufsichtigt von Format x in PDF konvertieren oder drucken*

    Ich hatte mich für diese Art der Druck-Schnittstelle entschieden, weil ich per Auswahl sowohl auf einen normalen Drucker als auch auf einem Dokumenten Drucker drucken kann. Wenn ich halt 1-10 Dokumente hätte wäre es nicht so schlimm wenn nach der Druckerzeugung bei Adobe oder sonstigen hat ein Fenster aufgeht wo man den Dateinamen und Pfad bestätigen muss. Aber bei 1000-5000 Dokumenten geht das halt nicht.
    Deswegen meine Frage ob jemand auch schon das Problem hatte und es vielleicht gelöst bekommen hatte.

    LG Thomas

    Mittwoch, 28. Februar 2018 07:09