Einzelnen Beitrag anzeigen

stefanniehaus

Registriert seit: 3. Mär 2005
11 Beiträge
 
Delphi XE2 Professional
 
#1

Druckausgabe über Printer / Problem mit einigen Schriftarten

  Alt 29. Jan 2013, 17:17
Hallo zusammen,

als langjähriger Mitleser bin ich leider jetzt auch auf ein Problem gestoßen, für das ich so spontan keine Lösung parat habe. Vielleicht kommt ihr ja auf ne Idee.

Folgende (aufs wesentliche reduzierte) Druckroutine:

Delphi-Quellcode:
procedure TForm1.btnSchreibenClick(Sender: TObject);
var
  liY : Integer; // Positionierung auf der Y-Achse in 1/10mm
const
  liSpacerMM : Integer = 5; // Platz zwischen den Zeilen -> 0,5mm
  liBlockMM : Integer = 50; // Platz zwischen den Blöcken -> 5mm
  liFontSizeMM : Integer = 40; // Schriftgrösse -> 4mm
begin

  printer.BeginDoc;

  liY := 200; // Startwert auf y-Achse: 20mm

  SetMapMode(printer.canvas.handle, MM_TEXT);
  printer.Canvas.Font.Height := MMtoPX(liFontSizeMM);
  printer.Canvas.Font.Name := 'Gill Sans MT';
  printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+0*(liFontSizeMM+liSpacerMM)),'MUSTERMANN');
  printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+1*(liFontSizeMM+liSpacerMM)),'Testfall und sonstiges GmbH');
  printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+2*(liFontSizeMM+liSpacerMM)),'Musterstraße 2');
  printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+3*(liFontSizeMM+liSpacerMM)),'12345 Musterort');
  printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+4*(liFontSizeMM+liSpacerMM)),'info@MustermannGmbH');

  liY := liY + 5 * (liSpacerMM+liFontSizeMM) + liBlockMM;

  SetMapMode(printer.canvas.handle, MM_LOMETRIC);
  printer.Canvas.Font.Height := liFontSizeMM;
  printer.Canvas.Font.Name := 'Gill Sans MT';
  printer.Canvas.TextOut(200,-(liY+0*(liFontSizeMM+liSpacerMM)),'MUSTERMANN');
  printer.Canvas.TextOut(200,-(liY+1*(liFontSizeMM+liSpacerMM)),'Testfall und sonstiges GmbH');
  printer.Canvas.TextOut(200,-(liY+2*(liFontSizeMM+liSpacerMM)),'Musterstraße 2');
  printer.Canvas.TextOut(200,-(liY+3*(liFontSizeMM+liSpacerMM)),'12345 Musterort');
  printer.Canvas.TextOut(200,-(liY+4*(liFontSizeMM+liSpacerMM)),'info@MustermannGmbH');

  liY := liY + 5 * (liSpacerMM+liFontSizeMM) + 2 * liBlockMM;

  SetMapMode(printer.canvas.handle, MM_TEXT);
  printer.Canvas.Font.Height := MMtoPX(liFontSizeMM);
  printer.Canvas.Font.Name := 'Arial';
  printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+0*(liFontSizeMM+liSpacerMM)),'MUSTERMANN');
  printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+1*(liFontSizeMM+liSpacerMM)),'Testfall und sonstiges GmbH');
  printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+2*(liFontSizeMM+liSpacerMM)),'Musterstraße 2');
  printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+3*(liFontSizeMM+liSpacerMM)),'12345 Musterort');
  printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+4*(liFontSizeMM+liSpacerMM)),'info@MustermannGmbH');

  liY := liY + 5 * (liSpacerMM+liFontSizeMM) + liBlockMM;

  SetMapMode(printer.canvas.handle, MM_LOMETRIC);
  printer.Canvas.Font.Height := liFontSizeMM;
  printer.Canvas.Font.Name := 'Arial';
  printer.Canvas.TextOut(200,-(liY+0*(liFontSizeMM+liSpacerMM)),'MUSTERMANN');
  printer.Canvas.TextOut(200,-(liY+1*(liFontSizeMM+liSpacerMM)),'Testfall und sonstiges GmbH');
  printer.Canvas.TextOut(200,-(liY+2*(liFontSizeMM+liSpacerMM)),'Musterstraße 2');
  printer.Canvas.TextOut(200,-(liY+3*(liFontSizeMM+liSpacerMM)),'12345 Musterort');
  printer.Canvas.TextOut(200,-(liY+4*(liFontSizeMM+liSpacerMM)),'info@MustermannGmbH');

  printer.EndDoc;
end;

function TForm1.MMtoPX(inMM:Integer) : Integer;
begin
  result := Round(inMM * printer.Canvas.Font.PixelsPerInch / 254)
end;

function TForm1.PXtoMM(inPX:Integer) : Integer;
begin
  result := Round(inPX *254 / printer.Canvas.Font.PixelsPerInch)
end;
Was wird gemacht?
Es wird 4x derselbe Adressblock gedruckt; alles in ein und dasselbe Dokument.
- Block1: Schriftart "Gill Sans MT" - MapMode MM_TEXT - FontHeight 4mm (umgerechnet in Pixel)
- Block2: Schriftart "Gill Sans MT" - MapMode MM_LOMETRIC - FontHeight 4mm
- Block3: Schriftart "Arial" - MapMode MM_TEXT - FontHeight 4mm (umgerechnet in Pixel)
- Block4: Schriftart "Arial" - MapMode MM_LOMETRIC - FontHeight 4mm

Das Ergebnis findet ihr im Anhang.
Obwohl ich zwischen Block 1 und Block 2 eigentlich nur SetMapMode aufgerufen und die Schriftgröße auf den analogen mm-Wert umgestellt habe, ist der 2. Textblock zusammen geschoben.
Die Höhe scheint gleich zu sein, nur die Breite hat sich verändert.

Als Gegenbeispiel dienen Block 3 und 4. Hier das identische vorgehen mit der Schriftart Arial; dort wird jedoch nichts zusammen geschoben.

Es scheint also mit der Schriftart zusammen zu hängen (ist mit mehreren nachvollziehbar) und evtl. auch mit dem ausgewählten Drucker (hier: PDF-Printer; bei einem anderen Drucker auf demselben PC waren Block 1 und Block 2 beide zusammengeschoben, Block 3 und 4 hingegen nicht).

Kann sich das jemand erklären?
Kann man das Problem irgendwie umgehen ohne dass man die Schriftart wechselt?
Angehängte Dateien
Dateityp: pdf Ergebnis.pdf (19,0 KB, 46x aufgerufen)
  Mit Zitat antworten Zitat