![]() |
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; |
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: ![]() PDFXChange: ![]() PDFA: ![]() 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: ![]() |
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. |
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:
Die PNG ist ein Screenshot vom Programm.
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; |
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 11:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz