AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Microsoft Print to PDF -> rectangle -> border fehlerhaft
Thema durchsuchen
Ansicht
Themen-Optionen

Microsoft Print to PDF -> rectangle -> border fehlerhaft

Ein Thema von bernau · begonnen am 10. Aug 2023 · letzter Beitrag vom 11. Aug 2023
Antwort Antwort
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#1

Microsoft Print to PDF -> rectangle -> border fehlerhaft

  Alt 10. Aug 2023, 12:14
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;
Miniaturansicht angehängter Grafiken
bild_2023-08-10_130543939.png  
Angehängte Dateien
Dateityp: pdf testmspdf2.pdf (1.005 Bytes, 8x aufgerufen)
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de

Geändert von bernau (10. Aug 2023 um 12:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Microsoft Print to PDF -> rectangle -> border fehlerhaft

  Alt 10. Aug 2023, 14:40
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
Miniaturansicht angehängter Grafiken
1_q_ms.jpg   1_q_pdfx.jpg   1_q_pdfa.jpg  

Geändert von ULIK (10. Aug 2023 um 14:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Microsoft Print to PDF -> rectangle -> border fehlerhaft

  Alt 10. Aug 2023, 15:18
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.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Microsoft Print to PDF -> rectangle -> border fehlerhaft

  Alt 11. Aug 2023, 12:03
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.
Miniaturansicht angehängter Grafiken
bild_2023-08-11_125604215.png  
Angehängte Dateien
Dateityp: pdf testmspdf6.pdf (78,0 KB, 4x aufgerufen)
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de

Geändert von bernau (11. Aug 2023 um 12:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Microsoft Print to PDF -> rectangle -> border fehlerhaft

  Alt 11. Aug 2023, 14:29
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:09 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