Einzelnen Beitrag anzeigen

Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#1

SynPDF und TMetaFile

  Alt 2. Mär 2022, 15:29
Hallo Delphianer,

ich bastele gerade an einer Druckvorschau-Komponente. Zum Erzeugen der einzelnen Druckseiten nutze ich TMetafile, Druckvorschau und Ausdruck funktioniert so wie es sein soll.
Nun möchte ich als Sahnehäubchen noch eine direkte PDF-Ausgabe dabei haben - also flugs SynPDf eingebunden.

Mit folgendem Code gebe ich den Inhalt des Metafiles seitenweise als PDF-Dokument aus:

Delphi-Quellcode:
procedure TSDPrintPreview.Document2PDF(FN: string;);
var lPdf : TPdfDocumentGDI;
    i : integer;
    TempMetaFile : TMetafile;
    Stream : TFileStream;
begin
  lPdf := TPdfDocumentGDI.Create;
  lPdf.ScreenLogPixels := CurrentPrinterRes.X;
  lPdf.DefaultPaperSize := psA4; //das reicht für meine Zwecke erst mal
  lPdf.DefaultPageLandscape := FPHeightMM < FPWidthMM;
  lPdf.ForceNoBitmapReuse := false;
  lPdf.EmbeddedTTF := true;
  lPdf.GeneratePDF15File := true;
  lPdf.ForceJPEGCompression := 90; //Wert vlt. noch skalierbar machen
  try
  Stream := TFileStream.Create(FN, fmCreate);
   try
   lPdf.SaveToStreamDirectBegin(Stream);
   //FMFList ist eine TObjectList<TMetaFile>;
     for I := 0 to FMFList.Count-1 do
        begin
        lPdf.AddPage;
        TempMetaFile := FMFList.Items[I];
        TempMetafile.SetSize(FPWidthPrintPxUnscaled,FPHeightPrintPxUnscaled);
        lPdf.VCLCanvas.StretchDraw(Rect(0,0,TempMetaFile.Width,TempMetaFile.Height),TempMetaFile);
        lPdf.SaveToStreamDirectPageFlush; // direct writing
        end;
     lPdf.SaveToStreamDirectEnd;
   finally
     Stream.Free;
  end;
  finally
  lPdf.Free;
  end;
end;
Mein Problem ist die Ausgabe von Bildern (JPG, PNG ...).

Alle im Testdokument enthaltenen Bilder werden korrekt in der Druckvorschau angezeigt oder ausgedruckt.
Im erzeugten PDF jedoch fehlen Grafiken vollständig die
  • vertikal mehr als 1446px vom oberen Seitenrand positioniert sind
  • horizontal mehr als 2566px vom linken Seitenrand entfernt sind
Befinden sich Grafiken innerhalb der genannten Grenzen, werden sie vollständig ausgegeben, egal wie breit oder hoch die Grafik ist. Auch über die genannten Pixelgrenzen hinaus.
Auch Text oder grafische Elemente (Linien, Rechtecke) werden komplett über die gesamte Seitenbreite und -höhe ausgegeben.

Es ist also nicht so, dass das Druckbild irgendwie abgeschnitten wird, sondern es fehlen ausschließlich Bilder unter den oben genannten Bedingungen.

Hab ich bei der Initialisierung des lPdf-Objektes irgendwas übersehen?

Vielen Dank schon mal für eure Mithilfe
  Mit Zitat antworten Zitat