Einzelnen Beitrag anzeigen

DelphiApostel

Registriert seit: 12. Apr 2005
10 Beiträge
 
Delphi 2010 Enterprise
 
#1

Ändern der Druckeinstellungen beim Drucken von PRN-Dateien

  Alt 7. Apr 2011, 12:28
Hallo,

mit der unten aufgeführten Funktion ist es möglich eine PRN-Datei direkt zu drucken (über einen zuvor ausgewählten Drucker). Auch nach zahlreichen Versuchen (und ausgiebigen Recherchen im Internet) gelingt es mir leider nicht vor dem Drucken die Druckeinstellungen zu ändern (wie Anzahl der Kopien, Druckerschacht, Orientation usw...).
Laut einer MSDN-FAQ werden die Druckeinstellungen in der PRN-Datei favorisiert, so dass die Standardeinstellungen des Druckers nicht berücksichtigt werden.

Ich weiß wie man temporär (über Delphi Printer-Objekt und über die JEDI-Unit JclPrint) oder global (über die WinSpool-Funktionen "DocumentProperties" und "SetPrinter") die Druckereinstellungen ändern kann. Das klappt ohne Probleme.

Aber ich kann einfach nicht daran glauben, dass man beim Drucken von PRN-Dateien (mit OpenPrinter und WritePrinter) keinen Druckerschacht vorgeben oder ihn nachträglich ändern kann!

Die Funktion, die ich oben erwähnt habe:
Delphi-Quellcode:
  Printer.PrinterIndex := PrIndex; //einen Drucker auswählen
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);

  If Not WinSpool.OpenPrinter(@Device, hPrinter, nil) Then Exit;

  DocInfo.pDocName := 'C:\Druckdatei.prn'; //die Datei, die an einen Drucker weitergeleitet werden soll
  DocInfo.pOutputFile := Nil;
  DocInfo.pDatatype :='RAW';

  StartDocPrinter(hPrinter, 1, @DocInfo);

  StartPagePrinter(hPrinter);

  //die PRN-Datei mit WritePrinter ausdrucken:
  System.Assign(f, string(sFileName));
  try
    Reset(f, 1);
    GetMem(Buffer, cBUFSIZE);
    While Not Eof(f) Do
    begin
      Blockread(f, Buffer^, cBUFSIZE, Count);
      If Count > 0 Then
      begin
        If Not WritePrinter(hPrinter, Buffer, Count, BytesWritten) Then
        begin
          EndPagePrinter(hPrinter);
          EndDocPrinter(hPrinter);
          WinSpool.ClosePrinter(hPrinter);
          FreeMem(Buffer, cBUFSIZE);
          Exit;
        end;
      end;
    end;
    FreeMem(Buffer, cBUFSIZE);
    EndDocPrinter(hPrinter);
    WinSpool.ClosePrinter(hPrinter);
  finally
    System.CloseFile(f);
  end;

Das Drucken von einfachem Text funktioniert ja (auch mit Vorgabe des Druckerschachts und Anzahl der Kopien). Hier ein Beispiel mit JCLPrint:

Delphi-Quellcode:

procedure TForm1.Button1Click(Sender: TObject);
var
  PSet:TJclPrintSet;
begin
  PSet:= TJclPrintSet.Create;
  Pset.Copies:=2; //Anzahl der Kopien
  Pset.BinIndex:=4; //Druckerschacht

  printer.Orientation:=poLandscape;
  printer.BeginDoc;
  printer.Canvas.textout(0,0,'Ein Test'); //kommt im Schacht Nr. 4 zwei mal raus!
  printer.EndDoc;
end;
Ich bin euch für jeden Hinweis dankbar!

Die Hintergrundinformationen findet ihr im Anhang:
Miniaturansicht angehängter Grafiken
diagramm.jpg   druckereinstellungen.jpg  

Geändert von DelphiApostel ( 7. Apr 2011 um 12:30 Uhr)
  Mit Zitat antworten Zitat