Drucken von PDF mit individuellen Druckeinstellungen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von DerBrain.

    Drucken von PDF mit individuellen Druckeinstellungen

    Hallo zusammen,
    ich denke ich habe das gleiche bzw. ein sehr ähnlich gelagertes Problem.
    Drucken mittels Process und Print ist ja schön und gut, aber imo verwendet er immer den Standarddrucker und die Druckereinstellungen die in Windows hinterlegt sind.
    Wie kann ich ihm den sagen, dass er den Drucker XY nehmen soll und doch bitte alles z.B. auf A3 ausdrucken soll?
    Denke dies wäre auch die Stelle, wo sash1307 gerne sagen würde, drucke mir das ding 17x.

    Gruß DerBrain

    ausgelagert aus Einstellungen beim Drucken als PDF ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @DerBrain Wenn Du das Drucken per PrintDocument im PrintPage-Event machst, dann so:
    Drucken mehrseitiger Dokumente
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich seh den Zusammenhang leider nicht.
    Wie verheirate ich den Process mit dem Verb 'print' mit dem PrintDocument bzw. dessen Settings (die genauso das können, was ich gerne hätte)?

    Ich habe eine PDF die ich in einem vorgegeben Papierformat drucken möchte.
    Folgendes habe ich bisher:

    VB.NET-Quellcode

    1. Dim oStartInfo As New ProcessStartInfo("c:\temp\test.pdf")
    2. oStartInfo.CreateNoWindow = False
    3. oStartInfo.Verb = "print"
    4. oProcess = Process.Start(oStartInfo)
    5. oProcess.WaitForExit()
    6. oProcess.CloseMainWindow()
    7. oProcess.Close()

    Das Problem ist, es wird immer auf den Standarddrucker gedruckt UND es kommt immer das Papierformat raus, welches in den Druckereinstellungen ausgewählt ist.
    IMO hab ich 2 möglichkeiten das Problem zu lösen:

    Möglichkeit 1:
    ich erkläre dem Prozess, auf welchen Drucker er mit welchem Papierformat geht. Könnte mir vorstellen, dass es so eine Art 'printTo'-Verb geben könnte um dies anzugeben..

    Möglichkeit 2:
    ich stelle den gewünschten Drucker sowie das Papierformat vor dem Process.start um und stelle es nach ausführen wieder zurück (wären zwar eingriffe in windows aber vermutlich die realisierbarere Lösung)

    DerBrain schrieb:

    was ich gerne hätte
    Beschreibe detailliert, was Du gern hättest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    DerBrain schrieb:

    Na dass ich sagen kann:
    Das ist nicht das, was ich unter detailliert verstehe.
    Dazu kann ich nur sagen:
    Tue es genau so.
    Öffne das PDF im Adobe und drucke jedes wie Du es haben willst.
    Was allerdings hat das Problem mit VB.NET zu tun :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo,
    mir ist zwar nicht 100% klar, was unklar ist aber ich schreib jetzt einfach vollstädnig, was ich möchte, was ich hab und was noch fehlt...

    Mein Ziel:
    Aus Inventor via AddIn per Knopfdruck sehr viele Zeichnungen in verschiedensten Papierformate in möglichst wenig (idealfall 1) Druckaufträgen vollautomatisch ausdrucken.

    Mein bisheriges Vorgehen:
    Ich habe bereits ein AddIn für Inventor mit ettlichen Funktionen die tadellos funktionieren. Ebenfalls ist das Grundgrüst für die neue Funktion bereits fertig.
    Es ist nicht möglich, in Inventor einen "Sammeldruck"-Befehl zu geben. Daher werden zunächst lokal PDFs der gewünschten Zeichnungen erstellt.
    Diese werden dann per Batch-Befehl mit dem einem Tool von pdf24 lokal zu weniger PDF-Dateien zusammengeführt.
    Nettes Feature von diesem Tool ist, dass es nicht installiert sein muss. Es genügt, wenn die EXE und eine Handvoll DLLs auf dem Server liegen :)

    Diese wenigen PDFs (vermutlich maximal 7), sollen nun im korrekten Papierformat VOLLAUTOMATISCH ausgedurckt werden.
    Hier tritt letztlich das Problem auf.

    Meine Lösungsideen / Ansätze:
    - Schön wäre, wie bei Excel auf Acrobat Reader zuzugreifen und die Druckaufträge via API starten könnte.
    Das wäre, wenn es so einfach möglich wäre die eleganteste Lösung, da es hier funktionieren würde 1 PDF zu verwenden, da Acrobat beim Drucken die Option "Papierquelle gemäß PDF-Seitengröße auswählen" besitzt.
    So könnte ich tatsächlich, alles was gedruckt werden soll in eine PDF mergen und diese dann dennoch im richtigen Papierformat ausdrucken.
    Das dies nur Funktionieren kann, wenn die korrekte Version vom Reader installiert ist, ist mir bekannt. Das wäre hinnehmbar.

    - Möglichkeit 2 betrachte ich in dem von mir oben geposteten Code-Schnipsel.
    Hier ist das Problem, dass Drucker als auch Papierformat aus dem Standarddrucker von Windows und dessen Einstellungen gewählt werden.
    Lösung hierfür wäre, dass ich den Standarddrucker sowie dessen Settings vor dem ausdrucken ändere. Leider finde ich zu letzterem keine Codeschnipsel im Netz.

    - Möglichkeit 3 ähnelt der zweiten stark.
    Das Tool von PDF24, mit welchem ich die PDFs zusammenführe kann auch Druckaufträge starten. Hier kann ich sogar einen Drucker auswählen.
    Allerdings bleibt bei dem pdf24-DocTool das Problem, dass das Papierformat von den Windows-Druckereinstellungen verwendet wird.


    Hoffe, mein Problem ist nun verständlicher geschildert.
    Gruß DerBrain
    @DerBrain damit kann man doch arbeiten.
    Ich hab mal gemeldet, dass Dein Teil hier in einen separaten Thread von Dir ausgelagert wird.
    Was Du brauchst, ist ein eigenes Tool oder eine mit .NET ansprechbare DLL oder halt mehrere davon, mit denen Du das Problem insgesamt lösen kannst.
    Ich hab mal nach Standarddrucker einrichten gesucht und bin hier vorbeigekommen:
    stackoverrun.com/de/q/5966296
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe die Codeschnipsel nun an mein Problem angepasst:

    VB.NET-Quellcode

    1. Dim oPrintDocument As New PrintDocument
    2. oPrintDocument.PrinterSettings.PrinterName = "Drucker Büro"
    3. For Each oPaperSize As PaperSize In oPrintDocument.PrinterSettings.PaperSizes
    4. Dim paperName As String = oPaperSize.PaperName
    5. If paperName = "A3" Then
    6. oPrintDocument.DefaultPageSettings.PaperSize = oPaperSize
    7. Dim oStartInfo As New ProcessStartInfo("C:\TEMP\A3.PDF")
    8. oStartInfo.CreateNoWindow = False
    9. oStartInfo.Verb = "print"
    10. oProcess = Process.Start(oStartInfo)
    11. oProcess.WaitForExit()
    12. oProcess.CloseMainWindow()
    13. oProcess.Close()
    14. Exit For
    15. End If
    16. Next


    Mein Hoffnung war, dass durch das Umstellen des DefaultPapeSettings diese in Windows geändert werden und somit der Process-Aufruf das richtige Format verwendet.
    Leider ist dem nicht so. Ich vermute, dass die Umstellung eben nur in dem PrintDocument statt fand, nicht aber in Windows :(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DerBrain“ ()

    @DerBrain Probierma und beende den Prozess nicht.
    Pack dazu eine Process-Instanz in die Klasse, sorge dafür, dass auch die PrinterSettings-Instanz nicht zugemacht wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich verstehe nicht ganz, was ich probieren soll...
    imo wird die PrinterSettings erst nach Beendigung des Prozesses verworfen.
    Was du mit "beende den Prozess" meinst ist mir auch unklar. ich warte ja, bis er fertig ist bevor ich ihn schließe. Das kann ja an den Settings nix ändern.

    Habe aber nun evtl. eine andere Lösung gefunden. Ist zwar sehr dirty, aber solange es stabil läuft ist mir das egal.
    Ich habe mir den RegistryKey DevMode der Drucker angeschaut und festgestellt, dass sich dieses Byte-Array ändert, wenn ich in Windows die Einstellungen ändere.
    Mein Ansatz ist nun diese Byte-Arrays für alle für mich interessanten Einstellungen auszulesen und vor dem Drucken einfach in die Registry zu packen.
    Muss aber noch schauen ob und wie gut das funktioniert...
    @DerBrain Das mit dem Process ist OK.
    In der Registry rummatschen ist sehr unschön, allerdings wenn Du sicherstellst, dass danach das System richtig arbeitet, sollte das gehen.
    Ändere immer nur eine einzige Property und sieh Dir das Resultat an, da müsste was zu erkennen sein.
    Vielleicht lässt sich das auf eine möglicherweise bekannte Struktur abbilden, da wüssten wir wenigstens, wonach zu suchen ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ist mir durchaus bekannt und auch definitiv nur eine absolute Notlösung aber bisher offensichtlich der beste Weg:-(
    Ich konnte es jetzt auf das Registrykey DevMode in CurrentUser\Printers\Connections\* reduzieren. Funktioniert soweit auch.
    Leider ist die Struktur wohl Druckerabhängig.
    Ich habe die Byte-Arrays mittlerweile für unsere beiden Drucker/Plotter ausgelsen und kann leider kein wirkliches Muster erkennen.
    Werde wohl mit leben müssen diese 10 Byte-Arrays die ich für die verschiedenen Formate/Einstellungen benötige als Konstante in meinem Code habe.