Benutzer mit den meisten Antworten
PrintDocument auf Fax-Drucker drucken

Frage
-
Hallo,
ich habe ein UserControl entwickelt, welche alle Druckfunktionen für den Ausdruck eines DataGridView kapselt.
An dieses Control kann ein beliebiges DataGridView übergeben werden. Es sorgt dafür, dass das DGV bei Bedarf auf mehrere Seiten aufgeteilt wird (vertikal und horizontal). Mit diesem Control ist es möglich, das Dokument als PDF zu speichern, als E-Mail oder Fax zu versenden und natürlich kann man das DGV auch ausdrucken. Weiterhin stehen Events zur Verfügung, mit denen man das Zeichnen der Zellen individuell anpassen kann. Intern werden die Seiten als Bitmaps verwaltet. Als Vorschau dient eine PictureBox. Alles funktioniert so weit auch, tja, bis auf den Fax-Versand. Als Drucker verwende ich in diesem Fall den Fax-Drucker. Der Quellcode für den eigentlichen Druckvorgang sieht so aus:
C#-Code: private void _PrintDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) {
using (Bitmap bmp = new Bitmap(_Bitmaps[_nCurrentBitmap]))
{
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
e.Graphics.DrawImage((Image)bmp, 0, 0, bmp.Width, bmp.Height);
_nCurrentBitmap++;
if (_nCurrentBitmap < _Bitmaps.Count)
{
e.HasMorePages = true;
}
}
}_Bitmaps ist eine Liste mit Bitmap-Dateien, welche temporär erzeugt werden und jeweils einer Seite entsprechen. Nach dem Start des Druckvorganges öffnet sich nach kurzer Zeit der Fax-Dialog, der als Anhang das zu sendende Fax als TIF-Datei enthält. Das Problem ist nun, dass diese TIF-Datei mit der Windows-Foto-Anzeige nicht angezeigt werden kann, d.h., diese Datei ist fehlerhaft und kann demzufolge nicht als Fax versendet werden. Das Problem tritt aber auch nur dann auf, wenn das zu druckende Dokument mehr als eine Seite enthält. Was mache ich falsch, bzw., hat jemand 'ne Idee wie man das anders machen kann.
Grüße
EDIT: Sorry. Ich hoffe, man kann es jetzt besser lesen.
- Bearbeitet jbu63 Mittwoch, 25. Januar 2012 08:35
Antworten
-
Hallo Jürgen,
ich habe mal einen FaxController vom StandardPrintController abgeleitet:
http://www.elmarboye.de/download/FaxPrint.7z
Die Angaben von Peter Noyes haben sich bestätigt:
Ohne ResetDC funktioniert der Ausdruck mehrseitiger Dateien mit dem Windows 7 / Faxdrucker,
und die erzeugte TIFF-Datei lässt sich in der Fotoanzeige öffnen,
während die Standardversion bei mehrseitigen Dateien streikt.Da die benötigten Daten zu größeren Teilen internal sind, ging das nur über Reflection.
Einziger funktionaler Unterschied ist, dass kein ResetDC aufgerufen wird.Ob das nun ein Fehler des Faxdruckertreibers ist oder .NET dafür eine Sonderbehandlung
kennen müsste, lassen wir mal dahingestellt.Wobei ich zum Test nur eine einfache Textdatei habe ausdrucken lassen, wie es ein MSDN-Beispiel zeigt.
Ich würde Dich bitten, dass für Deine Umgebung (und wenn möglich auch für XP usw.) zu testen.
Zumindest für .NET 2.0 SP2/3.5 SP1 und 4.0 funktionierte der Zugriff über Reflection.
Garantien für zukünftige Versionen kann ich naturgemäß nicht übernehmen, deshalb gilt:
Alle Angaben ohne Gewähr und Einsatz auf eigene Gefahr.Gruß Elmar
- Bearbeitet Elmar BoyeEditor Freitag, 27. Januar 2012 12:55
- Als Antwort vorgeschlagen Marcel RomaModerator Freitag, 3. Februar 2012 18:40
- Als Antwort markiert jbu63 Montag, 6. Februar 2012 14:29
Alle Antworten
-
Hi,
könntest Du das Posting neu formatieren? Das Forum stellt das Ganze leider ohne Zeilenumbruche, Absätze, ... dar und daher ist dein Posting nicht wirklich leserlich.
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 -
Kann es sein, dass es sich hierbei um einen Bug im .NET-Framework handelt? Ich habe zu diesem Problem folgendes gefunden:
---------
After further investigation, this issue has turned out to be a bug in .NET.
Currently, it is not possible to print a multi page document to Windows Fax using .NET:
http://connect.microsoft.com/VisualS...ws-fax-printer
If you would like to get the bug in .NET solved, please vote for it on the Microsoft Connect site.
---------
The workaround is to fall back to the Win32 API to do printing, which is possible from .NET using p/invoke:
Here are some resources on Win32 Printing using GDI
http://msdn.microsoft.com/en-us/library/gg263344(v=vs.85).aspx
These samples could be rewritten using C#. Everywhere you see a Win32 printing function call such as OpenPrinter:
BOOL OpenPrinter(
__in LPTSTR pPrinterName,
__out LPHANDLE phPrinter,
__in LPPRINTER_DEFAULTS pDefault
);
could be rewritten in C# as:
[DllImport("winspool.drv", SetLastError=true)]
static extern int OpenPrinter(string pPrinterName, out IntPtr phPrinter, IntPtr pDefault);
It will take some work, but it is entirely possible.
I also now understand why .NET could be calling .ResetDC between pages. Calling .ResetDC between pages allows the page size to be altered, so you can print a mix of page sizes / orientations in the same job. It would be nice if .NET allowed this to be an option, whether or not to call .ResetDC.
--------- -
Hallo,
naja, wo der "Fehler" liegt ist bei solchen Sachen eine Frage der Definition.
Ich habe es bis jetzt nicht selbst testen können:
Wenn die Aussage von Peter Noyes zutrifft, läge das Problem in der Behandlung von ResetDC
durch den Faxdruckertreiber.
Da Du schreibst, auch die Photo-Anzeige könnte mit dem TIFF-Dateien nichts anfangen,
wird dabei vermutlich ein falsches Format erzeugt.
(Und den Treiber hatte Microsoft bei Vista schon mal beerdigt, siehe auch FAX)Die Lösung läge dann darin einen eigenen PrintController zu erstellen, der in der Standard-Version
nämliches ResetDC ausführt - was i. a. dazu dient unterschiedliche Papierformate/Schächte usw. einzustellen -
die man bei Fax nicht verwendet.Mit einem OpenPrinter alleine wäre es jedoch nicht getan.
Wenn Du bereit bist etwas zu testen, so könnte ich anhand des StandardControllers
eine angepasste Version erstellen.Gruß Elmar
-
Hallo Elmar,
vielen Dank für deine Antwort. Bin schon (fast) am Verzweifeln ;-) .
Du hast natürlich Recht, dass es nicht mit einem simplen OpenPrinter getan ist. Peter Noyes verweist in einem früheren Post (siehe obiger Link) noch auf andere API-Funktionen. Nur wie er es letztendlich gelöst hat, geht aus seinen Postings leider nicht hervor.
Du fragst mich, ob ich bereit bin etwas zu testen? Natürlich bin ich das :-D ! Ich bin nämlich mit meinem Latein echt am Ende und freue mich über jede erdenkliche Unterstützung.
Ich bedanke mich im Voraus für deine Bemühungen und warte auf deine erste angepasste Version des StandardControllers.
Grüße
Jürgen -
Hallo Jürgen,
ich habe mal einen FaxController vom StandardPrintController abgeleitet:
http://www.elmarboye.de/download/FaxPrint.7z
Die Angaben von Peter Noyes haben sich bestätigt:
Ohne ResetDC funktioniert der Ausdruck mehrseitiger Dateien mit dem Windows 7 / Faxdrucker,
und die erzeugte TIFF-Datei lässt sich in der Fotoanzeige öffnen,
während die Standardversion bei mehrseitigen Dateien streikt.Da die benötigten Daten zu größeren Teilen internal sind, ging das nur über Reflection.
Einziger funktionaler Unterschied ist, dass kein ResetDC aufgerufen wird.Ob das nun ein Fehler des Faxdruckertreibers ist oder .NET dafür eine Sonderbehandlung
kennen müsste, lassen wir mal dahingestellt.Wobei ich zum Test nur eine einfache Textdatei habe ausdrucken lassen, wie es ein MSDN-Beispiel zeigt.
Ich würde Dich bitten, dass für Deine Umgebung (und wenn möglich auch für XP usw.) zu testen.
Zumindest für .NET 2.0 SP2/3.5 SP1 und 4.0 funktionierte der Zugriff über Reflection.
Garantien für zukünftige Versionen kann ich naturgemäß nicht übernehmen, deshalb gilt:
Alle Angaben ohne Gewähr und Einsatz auf eigene Gefahr.Gruß Elmar
- Bearbeitet Elmar BoyeEditor Freitag, 27. Januar 2012 12:55
- Als Antwort vorgeschlagen Marcel RomaModerator Freitag, 3. Februar 2012 18:40
- Als Antwort markiert jbu63 Montag, 6. Februar 2012 14:29
-
Mensch, Elmar, das ging ja fix!
Ich habe die Datei schon mal herunter geladen und werde diese schnellstmöglich in meine Anwendung einbinden. Sobald ich mit den Tests fertig bin, werde ich hier das Ergebnis selbstverständlich bekannt geben.
Vielen Dank erst mal.
Grüße
Jürgen -
Hallo Elmar,
ich bin leider erst gestern zum Testen gekommen. Ja, was soll ich sagen. Elmar, du bist ein Held! Jetzt klappt es auch wieder mit dem Fax. Ob es auch unter Windows XP funktioniert, werde ich in den nächsten Stunden testen und das Ergebnis hier veröffentlichen.
Bleibt die Frage, warum dieses Problem scheinbar nur bei .NET-Anwendungen auftritt. Bei MS Access bzw. bei Office-Anwendungen allgemein ist mir dieses Problem noch nicht untergekommen. Jedenfalls hat mich das Probieren und die Suche nach dem "Fehler" einige Stunden meiner wertvollen Zeit gekostet. Dank deiner freundlichen Unterstützung kann ich jetzt einen weiteren schwierigen Punkt auf meiner Todo-Liste streichen :-) .
Grüße
Jürgen -
Hallo Jürgen,
Danke für die Rückmeldung!
Und schön dass es funktioniert hat.In Office mag man das für viele, viele Drucker getestet haben, weil es dort zu den Hauptfunktionen gehört.
Aber ich bezweifle, dass die .NET Entwickler dafür soviel Zeit gehabt haben.Und ein "kaputtes" TIF, wie es die Fotoanzeige auswirft, ist IMHO eher ein Hinweis,
dass der "Faxdrucker" etwas falsch macht - aber das wird sich kaum schnell klären/ändern lassen.Gruß Elmar