AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi SynPdf - ungültige Gleitkommaoperation
Thema durchsuchen
Ansicht
Themen-Optionen

SynPdf - ungültige Gleitkommaoperation

Ein Thema von Bjoerk · begonnen am 13. Okt 2016 · letzter Beitrag vom 21. Okt 2016
Antwort Antwort
Seite 1 von 2  1 2      
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

SynPdf - ungültige Gleitkommaoperation

  Alt 13. Okt 2016, 12:31
Ich hab einen ViewerBilder der je Seite eine Metafile erstellt. Das können schon mal mehrere hundert Seiten sein. Zum pdf export werden diese aufs Pdf.VCLCanvas von SynPdf gezeichnet.

Bei machen Metafiles bekomme ich aber eine Exception. // *** Siehe dort
Kann dazu vielleicht jemand was sagen?

Delphi-Quellcode:
/// EMF enumeration callback function, called from GDI
// - draw most content on PDF canvas (do not render 100% GDI content yet)
function EnumEMFFunc(DC: HDC; var Table: THandleTable; R: PEnhMetaRecord;
   NumObjects: DWord; E: TPdfEnum): LongBool; stdcall;
var i: integer;
    InitTransX: XForm;
    polytypes: PByteArray;
begin
  result := true;

  with E.DC[E.nDC] do
  case R^.iType of
    ..
  EMR_EXTTEXTOUTA, EMR_EXTTEXTOUTW:
      E.TextOut(PEMRExtTextOut(R)^); // *** ungültige Gleitkommaoperation
Delphi-Quellcode:
procedure TViewerBuilder.BuildPdf;
var
  I, Count: integer;
  Pdf: TPdfDocumentGdi;
  MF: TMetaFile;
begin
  MF := TMetaFile.Create;
  Pdf := TPdfDocumentGdi.Create;
  try
    Pdf.Info.Author := 'Abel-Software';
    Pdf.Info.Creator := 'Abel-Software';
    Pdf.Info.CreationDate := Now;
    Pdf.DefaultPaperSize := psA4;
    Pdf.ScreenLogPixels := Round(FPlot.DotsPerInch);
    Count := 0;
    while FileExists(Tea.ViewFileName(FFileName, Count)) do Inc(Count);
    for I := 0 to Count - 1 do
    begin
      MF.LoadFromFile(Tea.ViewFileName(FFileName, I));
      Pdf.AddPage;
      Pdf.VCLCanvas.Draw(0, 0, MF);
    end;
    Pdf.SaveToFile(ChangeFileExt(FFileName, '.pdf'));
  finally
    Pdf.Free;
    MF.Free;
  end;
end;
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: SynPdf - ungültige Gleitkommaoperation

  Alt 13. Okt 2016, 13:13
Was mir direkt auffällt:
Delphi-Quellcode:
  Count := 0;
    while FileExists(Tea.ViewFileName(FFileName, Count)) do Inc(Count);
    for I := 0 to Count - 1 do
    begin
      MF.LoadFromFile(Tea.ViewFileName(FFileName, I));
      Pdf.AddPage;
      Pdf.VCLCanvas.Draw(0, 0, MF);
    end;
Warum nicht:

Delphi-Quellcode:
Count := 0;
    while FileExists(Tea.ViewFileName(FFileName, Count)) do
    begin
      MF.LoadFromFile(Tea.ViewFileName(FFileName, count));
      Pdf.AddPage;
      Pdf.VCLCanvas.Draw(0, 0, MF);
     inc(count)
    end;

Aber um auf Dein eigentlicher Problem zu kommen, hast Du mal im Debugger nachgeschaut was in
PEMRExtTextOut(R)^ drinsteht?

oder wenn es machbar ist hänge doch bitte so ein Metafile mal hier an
Fritz Westermann
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: SynPdf - ungültige Gleitkommaoperation

  Alt 13. Okt 2016, 14:49
Hab erst mal gern ein Count, ist ja auch sowas von wurschd..

Man kann emfs wohl nicht hochladen? Jedenfalls sagt "er" mir -> ungültige Datei.

Geändert von Bjoerk (13. Okt 2016 um 14:52 Uhr) Grund: Hochladen failed
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#4

AW: SynPdf - ungültige Gleitkommaoperation

  Alt 13. Okt 2016, 15:03
Man kann emfs wohl nicht hochladen? Jedenfalls sagt "er" mir -> ungültige Datei.
Es steht ja da, was geht ... "Erlaubte Dateierweiterungen"

Also ab in 'ne ZIP und hoch damit.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: SynPdf - ungültige Gleitkommaoperation

  Alt 13. Okt 2016, 15:45
Ja, das geht natürlich.
Angehängte Dateien
Dateityp: zip Page_0214.zip (49,8 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: SynPdf - ungültige Gleitkommaoperation

  Alt 13. Okt 2016, 16:19
Hallo

Du benutzt bei der MetafIle Erzeugung die
function SetWorldTransform mit (0, -1, 1, 0, 252, 3313) die fliegt Dir um die Ohren
Das setzt intern die Transformation auf 0 --> Param 1 und 4 dürfen eigentlich nie 0 sein da durch diese die Skalierung berechnet wird.

Mit dem aktuellen Stand von Synpdf hast Du verloren, die Worldtransformationen der GDI werden nur im Bereich skalierung und translation unterstützt.
Und das auch nicht wirklich richtig.......

Lustigerweise sitze ich seit 2 Tagen genau vor diesem Problem
Fritz Westermann
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: SynPdf - ungültige Gleitkommaoperation

  Alt 13. Okt 2016, 18:24
Hey, hey, du bist ja richtig gut. Danke Kumpel.

Aber, was machen wir da??

Bringts was, die 90 Grad gedrehte Metafile nachmal auf eine andere zu zeichnen?

Was darf da nicht null sein? Das Drehen (-90°) mache ich so, das funktioniert eigentlich schon immer problemlos? eM sind ja nichts ander als die cos/sin.

Delphi-Quellcode:
procedure TFemGraphic.SaveToDefaultEmfFile(const FileName: string);
begin
  FMetafile.SaveToFile(FileName);
end;

procedure TFemGraphic.SaveToEmfFile(const FileName: string);
var
  MF: TMetafile;
  MC: TMetafileCanvas;
  XForm: tagXFORM;
begin
  if not FWantHaveRotate90 then
    SaveToDefaultEmfFile(FileName)
  else
  begin // -90°;
    MF := TMetafile.Create;
    try
      MF.Width := FMetafile.Height;
      MF.Height := FMetafile.Width;
      MC := TMetafileCanvas.Create(MF, 0);
      try
        XForm.eM11 := 0;
        XForm.eM12 := -1;
        XForm.eM21 := 1;
        XForm.eM22 := 0;
        XForm.eDx := 0;
        XForm.eDy := FMetafile.Width;
        SetGraphicsMode(MC.Handle, GM_ADVANCED);
        SetWorldTransform(MC.Handle, XForm);
        MC.Draw(0, 0, FMetafile);
      finally
        MC.Free;
      end;
    finally
      MF.SaveToFile(FileName);
      MF.Free;
    end;
  end;
end;
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: SynPdf - ungültige Gleitkommaoperation

  Alt 13. Okt 2016, 18:36
Zitat:
Aber, was machen wir da??

Bringts was, die 90 Grad gedrehte Metafile nachmal auf eine andere zu zeichnen?

Was darf da nicht null sein? Das Drehen (-90°) mache ich so, das funktioniert eigentlich problemlos? eM sind ja nichts ander als die cos/sin.
Du machst da eigentlich nichts falsch. Es ist die SYNPDF die das nicht berücksichtigt.
Es werden nur Skalierung und Translation übernommen.

Habe im Moment genau das gleiche Problem. Wir wollten den bestehenden Export ersetzen durch SynPDF aber in der aktuellen Form geht das nicht.


Die einzige Möglichkeit die Du aktuell hast ist
  • Etwas anderes verwenden
  • Das Metafile gleich richtig zu zeichnen. (Mit gedrehtem Font ala Logfont.direction oder so) kann gerade nicht schauen
  • Etwas warten. Ich bin gerade daran die synPDF umzubauen so das dort auch Koordinatensystem gedreht werden können. Ist leider nicht so einfach da im PDF-Format kein Setzen sondern nur ein modifizieren des Aktuellen Systems möglich ist. Bin nur noch nicht sicher wie lange mir mein Chef dafür noch gibt
Fritz Westermann
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: SynPdf - ungültige Gleitkommaoperation

  Alt 13. Okt 2016, 21:03
Ok. Ist bei mir genauso (hab PowerPdf gegen SynPdf ausgetauscht). Möchte das eigentlich nicht mehr rückgängig machen. Die 90 Grad Drehung lass ich dann lieber weg.
Sollen wir uns mal an die SynPdf Gemeinde wenden? Die ist für doch solche gravierenden Erweiterungen der Ansprechpartner und dein Chef hat dich auch wieder lieb?
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: SynPdf - ungültige Gleitkommaoperation

  Alt 14. Okt 2016, 10:17
Ok. Ist bei mir genauso (hab PowerPdf gegen SynPdf ausgetauscht). Möchte das eigentlich nicht mehr rückgängig machen. Die 90 Grad Drehung lass ich dann lieber weg.
Sollen wir uns mal an die SynPdf Gemeinde wenden? Die ist für doch solche gravierenden Erweiterungen der Ansprechpartner und dein Chef hat dich auch wieder lieb?
Hallo

wir können versuchen das direkt by Synopse zu melden, ich denke aber das wir
damit keinen grossen Erfolg haben werden. Für den Anwendungsfall wie es dort eingesetzt
wird, funktioniert es ja wirklich gut.
Ich habe mich jetzt schon gute 2 Tage durch die Source und Die Adobe PDF Beschreibung gewühlt.
Mit dem aktuellen Design der SynPdf geht das nicht so einfach.
Was da im PDF Format wirklich fehlt ist eine komplettes setzen der Transformation.
Im Moment kann man nur verändern




Dann noch was habe ich gestern nicht aufgepasst
Du solltest für Manipulationen am WorldTransform aufpassen das die Werte auch stimmen

Da Du die ganze Transformation setzt solltest Du die eM11 und eM22 auf 1 setzen
Windows selber ist da zwar unempfindlich aber die Werte stimmen sonst nicht also:


Delphi-Quellcode:
procedure TFemGraphic.SaveToEmfFile(const FileName: string);
var
  MF: TMetafile;
  MC: TMetafileCanvas;
  XForm: tagXFORM;
begin
  if not FWantHaveRotate90 then
    SaveToDefaultEmfFile(FileName)
  else
  begin // -90°;
    MF := TMetafile.Create;
    try
      MF.Width := FMetafile.Height;
      MF.Height := FMetafile.Width;
      MC := TMetafileCanvas.Create(MF, 0);
      try
        XForm.eM11 := 1; //0; change
        XForm.eM12 := -1;
        XForm.eM21 := 1;
        XForm.eM22 := 1; // 0; change
        XForm.eDx := 0;
        XForm.eDy := FMetafile.Width;
        SetGraphicsMode(MC.Handle, GM_ADVANCED);
        SetWorldTransform(MC.Handle, XForm);
        MC.Draw(0, 0, FMetafile);
      finally
        MC.Free;
      end;
    finally
      MF.SaveToFile(FileName);
      MF.Free;
    end;
  end;
end;
Besser wäre folgendes dann ist es egal was vorher schon da war
Wie gesagt windows ist unempfindlich aber andere EMF Interpreter reagieren da schon mal komisch

Delphi-Quellcode:
procedure TFemGraphic.SaveToEmfFile(const FileName: string);
var
  MF: TMetafile;
  MC: TMetafileCanvas;
  XForm: tagXFORM;
  
begin
  if not FWantHaveRotate90 then
    SaveToDefaultEmfFile(FileName)
  else
  begin // -90°;
    MF := TMetafile.Create;
    try
      MF.Width := FMetafile.Height;
      MF.Height := FMetafile.Width;
      MC := TMetafileCanvas.Create(MF, 0);
      try
        XForm.eM11 := 1;
        XForm.eM12 := -1;
        XForm.eM21 := 1;
        XForm.eM22 := 1;
        XForm.eDx := 0;
        XForm.eDy := FMetafile.Width;
        SetGraphicsMode(MC.Handle, GM_ADVANCED);
        
        GetWorldTransform(MC.Handle, orgXForm);
        // So wird nur zusätzlich die Drehung eingebaut
        ModifyWorldTransform(MC.Handle, XForm, MWT_LEFTMULTIPLY);
        MC.Draw(0, 0, FMetafile);
         // und wieder zurück auf Normal
        ModifyWorldTransform(MC.Handle, XForm, MWT_IDENTITY);
      finally
        MC.Free;
      end;
    finally
      MF.SaveToFile(FileName);
      MF.Free;
    end;
  end;
end;
Fritz Westermann
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:40 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