Delphi-PRAXiS
Seite 5 von 10   « Erste     345 67     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Vektor Format anzeigen/drucken (https://www.delphipraxis.net/102812-vektor-format-anzeigen-drucken.html)

Gruber_Hans_12345 16. Nov 2007 09:17

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von torud
Ich habe nicht einmal die Komponenten installiert bekommen... :(

ich schon

ps.: übrigens tolle fehlerbeschreibung ...

xaromz 17. Nov 2007 13:14

Re: Vektor Format anzeigen/drucken
 
Hallo,

ich habe jetzt eine Routine, die Kerning berücksichtigt. Die Textdarstellung verlangsamt sich dadurch zwar etwas, aber nur um den Faktor 7-10 :wink: .
Die neue Version findet sich auf meiner Seite.

Gruß
xaromz

torud 17. Nov 2007 15:27

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von Gruber_Hans_12345
ps.: übrigens tolle fehlerbeschreibung ...

Ich muss zu meiner Schande gestehen, dass die Fehlermeldung wirklich nicht besonders aussagekräftig war, aber so wie ich den Ersteller verstanden habe, funktioniert der ganze Spass leider unter Delphi6 nicht - Schade!

Gruber_Hans_12345 17. Nov 2007 15:39

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von xaromz
Hallo,

ich habe jetzt eine Routine, die Kerning berücksichtigt. Die Textdarstellung verlangsamt sich dadurch zwar etwas, aber nur um den Faktor 7-10 :wink: .
Die neue Version findet sich auf meiner Seite.

Gruß
xaromz

super! :)

also die schrift funktioniert jetzt perfekt ...

kannst du mir mit dem drucken noch mal kurz helfen?
Ich versuche die Seite, die genau 210*297 ist, original auf den drucker auszugeben (den Offset habe ich schon ausgerechnet)

aber wie kann ich die seite nun verschieben?


Delphi-Quellcode:
function MarginToMM(const Value, dpi : integer) : Extended;
begin
    Result := ((Value * 254) / dpi) / 100;
end;

        temp.BeginDoc;

        grPrinter := TGPGraphics.Create(temp.Canvas.Handle);
        try
            grPrinter.SetPageUnit(UnitMillimeter);

            margin.x       := -MarginToMM(GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX), GetDeviceCaps(Printer.Handle, LOGPIXELSX));
            margin.y       := -MarginToMM(GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY), GetDeviceCaps(Printer.Handle, LOGPIXELSY));
            SVGImage1.SVG.PaintTo(grPrinter, Bounds, nil, 0);
        finally
            grPrinter.Free;
        end;

        temp.EndDoc;

xaromz 17. Nov 2007 16:32

Re: Vektor Format anzeigen/drucken
 
Hallo,

das Drucken ist immer so eine Sache... Ich verwende da folgende Routine:
Delphi-Quellcode:
type
  TDeviceCaps = record
    Name: WideString;
    Index: Integer;
    Width,
    Height,
    DPIX,
    DPIY,
    OffsetX,
    OffsetY: Integer;
    PhysicalWidth,
    PhysicalHeight: Integer;
    PixelWidth,
    PixelHeight: Real;
    Orientation: TPrinterOrientation;
  end;

function GetPrinterCaps: TDeviceCaps;
var
  DC: THandle;
  Caps: TDeviceCaps;
begin
  DC := Printer.Handle;
  Caps.Orientation   := Printer.Orientation;
  Caps.Index         := Printer.PrinterIndex;
  Caps.Name          := Printer.Printers[Caps.Index];
  Caps.Width         := GetDeviceCaps(DC, HorzSize); // mm
  Caps.Height        := GetDeviceCaps(DC, VertSize); // mm
  Caps.DPIX          := GetDeviceCaps(DC, LogPixelSX); // DPI
  Caps.DPIY          := GetDeviceCaps(DC, LogPixelSY); // DPI
  Caps.OffsetX       := GetDeviceCaps(DC, PhysicalOffsetX); // Pixel
  Caps.OffsetY       := GetDeviceCaps(DC, PhysicalOffsetY); // Pixel
  Caps.PhysicalWidth := GetDeviceCaps(DC, PhysicalWidth); // Pixel
  Caps.PhysicalHeight := GetDeviceCaps(DC, PhysicalHeight); // Pixel
  Caps.PixelWidth    := (Caps.Width / Printer.PageWidth);
  Caps.PixelHeight   := (Caps.Height / Printer.PageHeight);
  Result := Caps;
end;

function GetPageRect(const Width, Height: Integer;
  const Caps: TDeviceCaps; Center: Boolean = True): TRect;
begin
  Result.Left := -Caps.OffsetX;
  Result.Top := -Caps.OffsetY;
  Result.Right := Result.Left + Round(Width / Caps.PixelWidth);
  Result.Bottom := Result.Top + Round(Height / Caps.PixelHeight);

  if Center then
  begin
    if Result.Right < Caps.PhysicalWidth then
    begin
      Result.Left := (Caps.PhysicalWidth - Result.Right) div 2;
      Inc(Result.Right, Result.Left);
    end;

    if Result.Bottom < Caps.PhysicalHeight then
    begin
      Result.Top := (Caps.PhysicalHeight - Result.Bottom) div 2;
      Inc(Result.Bottom, Result.Top);
    end;
  end;
end;

procedure TForm1.Print;
var
  R: TRect;
  Bounds: TGPRectF;
  Graphics: TGPGraphics;
  Caps: TDeviceCaps;
begin
  Caps := GetPrinterCaps;
  R := GetPageRect(Round(SVG.Width), Round(SVG.Height), Caps, False);
  Printer.BeginDoc;
  Bounds.X       := R.Left;
  Bounds.Y       := R.Top;
  Bounds.Width   := R.Right - R.Left;
  Bounds.Height  := R.Bottom - R.Top;

  Graphics := TGPGraphics.Create(Printer.Canvas.Handle);
  try
    Graphics.SetPageUnit(UnitPixel);
    Graphics.SetSmoothingMode(SmoothingModeAntiAlias);
    SVG.PaintTo(Graphics, Bounds, nil, 0);
  finally
    Graphics.Free;
  end;
  Printer.EndDoc;
end;
Ob das bei Dir funktioniert, musst Du allerding selbst ausprobieren.

Gruß
xaromz

xaromz 17. Nov 2007 18:26

Re: Vektor Format anzeigen/drucken
 
Hallo,
Zitat:

Zitat von torud
Ich muss zu meiner Schande gestehen, dass die Fehlermeldung wirklich nicht besonders aussagekräftig war, aber so wie ich den Ersteller verstanden habe, funktioniert der ganze Spass leider unter Delphi6 nicht - Schade!

ich vermute mal, Du hast auf meiner Seite den Kommentar geschrieben. Gib doch mal die genaue Fehlermeldung an, dann kann man da vielleicht was machen.
Eventuell wäre dafür aber ein neuer Thread sinnvoll.

Gruß
xaromz

torud 18. Nov 2007 07:07

Re: Vektor Format anzeigen/drucken
 
Da liegst DU richtig. Eigentlich hatte ich doch schon die Fehlermeldung in Deinem Kommentarfenster geschrieben. Ich werde das Montag aber hier gern nochmal wiederholen, denn eigentlich wäre ich auch sehr an der Verwendung interessiert.

Mal nebenbei gefragt. Ist es eigentlich auch möglich andere Vektorgrafiken anzuzeigen? Ala *.ai von Adobe Illustrator?

xaromz 18. Nov 2007 08:44

Re: Vektor Format anzeigen/drucken
 
Hallo,
Zitat:

Zitat von torud
Da liegst DU richtig. Eigentlich hatte ich doch schon die Fehlermeldung in Deinem Kommentarfenster geschrieben. Ich werde das Montag aber hier gern nochmal wiederholen, denn eigentlich wäre ich auch sehr an der Verwendung interessiert.

das stimmt. Die Fehlermeldung war, dass NameValueSeparator nicht definiert ist. Ich vermute, der Fehler tritt in "WideStringList.pas" in Zeile 254 auf. Wenn ja, dann kannst Du die Zeile einfach auskommentieren.

Zitat:

Zitat von torud
Mal nebenbei gefragt. Ist es eigentlich auch möglich andere Vektorgrafiken anzuzeigen? Ala *.ai von Adobe Illustrator?

Klar ist das möglich. Du musst nur einen Parser für das Dateiformat schreiben und das Ergebnis irgendwie anzeigen :wink: . Die Arbeit werde ich mir aber momentan nicht machen. Freiwillige vor!

Gruß
xaromz

Gruber_Hans_12345 19. Nov 2007 07:33

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von xaromz
Hallo,

das Drucken ist immer so eine Sache... Ich verwende da folgende Routine:
Ob das bei Dir funktioniert, musst Du allerding selbst ausprobieren.

Gruß
xaromz

nein leider nicht, aber ich habe mir mal die SetBounds routine angeschaut, die verwendet ja x und y gar nicht ... zumindest sehe ich nix davon
daher wird das ganze dann ja auch sicher nicht um die ränder versetzt auf den drucker gezeichnet oder?

Bei mir ist auch die SVG.Height und SVG.Width beides 0, aber die proportionen stimmen bei mir ja beim drucken (wenn ich UnitMillimeter verwende)
mein SVG ist auch in millimeter ausgegben, und hat eine viewbox von genau 0,0,210,297

das problem ist nur, das die druckroutine das ganze in den druckbaren bereich druckt, und so habe ich einen versatz von 4 millimeter

Gruber_Hans_12345 19. Nov 2007 07:44

Re: Vektor Format anzeigen/drucken
 
so, habs nun hinbekommen, das er das ganz genau so druckt, wie es gehört ...

Delphi-Quellcode:
        bounds.X       := 0;
        bounds.Y       := 0;
        bounds.Width   := 210;
        bounds.Height  := 297;
        Printer.BeginDoc;

        Graphics := TGPGraphics.Create(Printer.Canvas.Handle);
        try
            Graphics.SetPageUnit(UnitMillimeter);
            Graphics.SetSmoothingMode(SmoothingModeAntiAlias);
            Graphics.TranslateTransform(-MarginToMM(GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX), GetDeviceCaps(Printer.Handle, LOGPIXELSX)), -MarginToMM(GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY), GetDeviceCaps(Printer.Handle, LOGPIXELSY)));
            SVGImage1.SVG.PaintTo(Graphics, Bounds, nil, 0);
        finally
            Graphics.Free;
        end;

        Printer.EndDoc;
danke nochmal für alles und diese extrem geniale komponente!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:43 Uhr.
Seite 5 von 10   « Erste     345 67     Letzte »    

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