Einzelnen Beitrag anzeigen

Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
146 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Frage zu "Foxit Quick PDF Library and Debenu Product Line End-of-Life announcemen

  Alt 14. Dez 2021, 11:56
Ich teste gerade mal, lädt PDF-Dateien sehr schnell. Was ich noch nicht ganz verstanden habe, wie ich pdf.RenderpageToImage anwende, wenn ich das Image nicht als datei auf die Festplatte speichern, sonder in den Imagebuffer (Memory) schreiben möchte.

Und wie lese ich den (mit GetImageBuffer) wieder aus?

Hast Du da evtl. ein Beispiel zur Hand?
Ich verwende die Funktion nicht, sondern zeichne mit einem Rasterizer in einen Device Context. Dazu gibt es bei DynaPDF auch Beispiele in Delphi.

Wenn Du mit RenderPageToImage arbeiten willst, müsstest Du den Rückgabewert von GetImageBuffer direkt als Bild im angegebenen Format weiterverarbeiten.
Ich habe das mal versucht und das Beispiel (render_page_to_image) so abgewandelt, dass das Bild im Speicher erzeugt wird:

Delphi-Quellcode:
procedure RenderPageToImage(Image: TImage);
var
  w: Integer;
  pdf: TPDF;
  BufSize: Cardinal;
  Buffer: PAnsiChar;
  Stream: TMyStream;
begin
  pdf := nil;
  try
    pdf := TPDF.Create;
    pdf.CreateNewPDF('');
    pdf.SetImportFlags(ifImportAll or ifImportAsPage);
    if pdf.OpenImportFile('test.pdf', ptOpen, '') < 0 then
    begin
      pdf.Free;
      Exit;
    end;
    pdf.Append;
    pdf.ImportPageEx(1, 1.0, 1.0);
    pdf.EndPage;
    w := 1024;
    if pdf.RenderPageToImage(1, '', 0, w, 0, rfDefault, pxfRGB, cfFlate,
      ifmPNG) then
    begin
      buffer := pdf.GetImageBuffer(BufSize);
      Stream := TMyStream.Create;
      try
        Stream.SetPointer(Buffer, BufSize);
        Image.Picture.LoadFromStream(Stream);
      finally
        pdf.FreeImageBuffer;
        Stream.Free;
      end;
    end;
  except
    on E: Exception do
    begin
      Showmessage(E.Message);
    end;
  end;
  if pdf <> nil then
    pdf.Free;
end;
MyStream ist einfach ein MemoryStream in der gleichen Unit, damit man die Protected-Funktion "setPointer" aufrufen kann:

Delphi-Quellcode:
type
  TMyStream = class(TMemoryStream)
  end;
Zum Testen braucht man nur ein TImage im Form und ruft bei ButtonClick die Funktion auf. Die DLL muss neben der Exe liegen und natürlich eine test.pdf.

Vielleicht hat auch jemand eine bessere Idee hat, wie man das Bild aus dem Buffer laden kann?
  Mit Zitat antworten Zitat