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?