Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Microsoft Print to PDF -> rectangle -> border fehlerhaft (https://www.delphipraxis.net/213516-microsoft-print-pdf-rectangle-border-fehlerhaft.html)

bernau 10. Aug 2023 12:14

Microsoft Print to PDF -> rectangle -> border fehlerhaft
 
Liste der Anhänge anzeigen (Anzahl: 2)
Wenn ich auf dem Canvas mit canvas.rectangle ein Rechteck zeichne, dann wird bei einem pen in der Stärke 0 und 1 das rectangle fehlerhaft gezeichnet, wenn ich auf den "Microsoft Print to PDF"-printer-canvas zeichne.

Das ganze fällt erst mal nicht wirklich auf. Wenn man mit dem Actrobat-Reader die PDF anschaut, dann fühlt man, dass etwas nicht richtig ist. Grade, wenn Rechtecke sehr nah bei einander sind. Aber wenn man stark vergrößert, dann wird es sichtbar.

Die linken beiden Rechtecke wurden mit Pen=0 bzw. Pen=1 gezeichnet. Ab Pen=2 ist alles OK


Ist das eine dokumentierte Eigenschaft, oder ein Fehler?



Das angehängte Bild wurde mit folgendem Code erzeugt. aCanvas ist der printer.canvas

Delphi-Quellcode:
var
  lRect: TRect;
begin
  aCanvas.Pen.Color := clBlack;
  aCanvas.Pen.Mode := pmCopy;
  aCanvas.Pen.Style := psSolid;
  aCanvas.Brush.Color := clGreen;
  lRect.Create(0, 0, 40, 40);
  lRect.Offset(50, 50);

  for var a := 0 to 5 do
    begin
      aCanvas.Pen.Width := a;
      aCanvas.Rectangle(lRect);
      lRect.Offset(50, 0);
    end;
end;

ULIK 10. Aug 2023 14:40

AW: Microsoft Print to PDF -> rectangle -> border fehlerhaft
 
Liste der Anhänge anzeigen (Anzahl: 3)
Ich nehme an Du meinst die gerundeten Rahmen bei den beiden ersten Strichstärken. Hier wird von MS oder auch von anderen Druckern nicht nur ein gefüllter Pfad erstellt sondern zwei: ein gefüllter innerer und ein Rahmen außen.

MS: https://www.delphipraxis.net/attachm...1&d=1691674208
PDFXChange: https://www.delphipraxis.net/attachm...1&d=1691674216
PDFA: https://www.delphipraxis.net/attachm...1&d=1691674654

Ich denke, damit versuchen die Treiber zu dünne Strichstärken auszugleichen um ein besseres Bild zu erhalten. Du kannst auch sehen, daß jeder Treiber andere LineCaps dafür verwendet.

Allerdings hätte ich vom Code her eher erwartet, daß ein Rechteck mit Strichstärke 0 keinen Rahmen ergibt.

Edit:
Grad noch gefunden: einen GDI-Stift der Strichstärke 0 gibt es nicht: https://learn.microsoft.com/en-us/wi...ngdi-createpen

bernau 10. Aug 2023 15:18

AW: Microsoft Print to PDF -> rectangle -> border fehlerhaft
 
Hi ULIK,


Bei Pen=0 wird auch auf dem Bildschirm ein Rahmen gezeichnet. War schon immer so. Habe einfach mal als Versuch die 0 mit verwendet.

Gut zu wissen, dass Pen=1 nicht nur bei mir den Fehler ergibt. Ab Pen=2 ist ja alles OK.

Übrigens verhalten sich rectangle und fillrect auch unterschiedlich. Es ist eine leicht andere Position. In einer dummen Konstellation gibt es dann Blitzer die grade beim Druck auffallen.

Lösung ist dann natürlich Pen=1 zu vermeiden und immer eine Korrektur nach Pen=2 durchzuführen.


Danke noch mal für deine Mühe.

bernau 11. Aug 2023 12:03

AW: Microsoft Print to PDF -> rectangle -> border fehlerhaft
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich will euch mal an meinen weiteren Versuchen teilhaben lassen.

Rectangle und Fillrect haben in der resultierenden PDF unterschiedliche Abmaße.

Auf dem Bildschirm hat das gelbe Rechteck (mit Fillrect gezeichnet) genau die gleiche Breite wie das Rechteck, welches mit Rectangle gezeichnet wurde.

In der PDF sieht man bei den Rechtecken, die mit einer ungraden Penbreite gezeichnet werden, einen leichten Versatz. Pen 0 und 1 ist sowiso nicht zu gebrauchen. aber bei Pen 3,5,7,9 sieht man (wenn man vergrößert) diesen unschönen schwarzen strich.

Also: Die Kombination aus rectangle und fillrect auf dem Bildschirm ist OK. Diese Kombination sollte aber nicht in einer PDF und für eine Druckvorstufe verwendet werden. Da kann es dann unschöne Überraschungen geben.

Delphi-Quellcode:
var
  lRect_Base: TRect;
  lRect_FillRect:TRect;
begin
  aCanvas.Pen.Color := clBlack;
  aCanvas.Pen.Mode := pmCopy;
  aCanvas.font.Height := 20;
  lRect_Base.Create(0, 0, 40, 80);
  lRect_Base.Offset(50, 100);

  for var a := 0 to 9 do
    begin
      lRect_Base.Offset(50, 0);
      // Titel schreiben
      aCanvas.Brush.Style := bsClear;
      aCanvas.TextOut(lRect_Base.Left,lRect_Base.Top-30,'Pen='+a.ToString);
      //rectangle mit schwarzem Rahmen - grün
      aCanvas.Brush.Style := bsSolid;
      aCanvas.Brush.Color := clGreen;
      aCanvas.Pen.Width := a;
      aCanvas.Rectangle(lRect_Base);
      //Fillrect mit gleicher Breite und Höhe - Rot
      lRect_FillRect := lRect_Base;
      lRect_FillRect.Offset(0, 30);
      aCanvas.Brush.Color := clRed;
      aCanvas.fillrect(lRect_FillRect);
      //Fillrect mit angepasster Breite und Höhe um die Pen.width vom Rectangle auszugleichen - Gelb
      lRect_FillRect.Offset(0, 30);
      lRect_FillRect.left := lRect_FillRect.left - a div 2;
      lRect_FillRect.width := lRect_FillRect.Width + ((a-1) div 2);
      aCanvas.Brush.Color := clyellow;
      aCanvas.fillrect(lRect_FillRect);
    end;
end;
Die PNG ist ein Screenshot vom Programm.

ULIK 11. Aug 2023 14:29

AW: Microsoft Print to PDF -> rectangle -> border fehlerhaft
 
Ohne es selbst getestet zu haben: experimentier doch einmal mit einem geometrischen Stift und Stil PS_INSIDEFRAME, also mit ExtCreatePen.
Wenn Du mit GDI zeichnest, dann hast Du immer das Problem, daß Du nur einen Pixel Auflösung bekommst. Für einen Drucker kann das eventuell aber mehr als einen Pixel ausmachen, je nach dem, wie Du deine Zeichnung an die Druckauflösung anpaßt. MS Print to PDF arbeitet standardmäßig mit 300 PPI, wenn ich das recht in Erinnerung habe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz