Einzelnen Beitrag anzeigen

hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#1

QuickPDF 7.19: RenderPageToStream und MehrseitenPDF -> RAM-Verbrauch

  Alt 14. Apr 2011, 11:46
Hallo,

folgender Code (von der QPDF-Seite) zeigt eine Seite eines PDF's an.

Delphi-Quellcode:
procedure TForm.RenderPage;
var
  BM : TBitmap;
  MS : TMemoryStream;
  DPI : Integer;
  JpegStream : Tmemorystream;
  JPEG : TJpegImage;
  JpegImage : Timage;
begin
  MyTrace('RenderPage: Start');

  MyTrace('RenderPage: ScrollBar: Start');
  BM := TBitmap.Create;
  try
    imgPreview.Picture.Assign(BM);
    PreviewScrollBox.HorzScrollBar.Position := 0;
    PreviewScrollBox.VertScrollBar.Position := 0;
    imgPreview.Left := 0;
    imgPreview.Top := 0;
  finally
    BM.Free;
  end;
  MyTrace('RenderPage: ScrollBar: End');

  JPEG := TJpegImage.create;
  JpegStream := Tmemorystream.Create;
  JpegImage := Timage.Create(self);
  MS := TMemoryStream.Create;
  try
    DPI := ((cmbZoom.ItemIndex + 1) * 25 * 96) div 100;
    MyTrace('RenderPage: RenderPageToStream: DPI='+IntToStr(DPI)+' : Start');

    MessageBox(0, 'RenderPage: Start', '', 0);


// QPDF.RenderPageToStream(DPI, ViewPrintPageNum, 0{BMP}, MS);
// MyTrace('RenderPage: RenderPageToStream: Stream-Size='+IntToStr(MS.Size));

    JpegStream.Clear;
    QPDF.RenderPageToStream(DPI, ViewPrintPageNum, 1{JPG}, JpegStream);
    MyTrace('RenderPage: RenderPageToStream: Stream-Size='+IntToStr(JpegStream.Size));

    MessageBox(0, 'RenderPage: End', '', 0);

    MyTrace('RenderPage: RenderPageToStream: End');
// MS.Seek(0, soFromBeginning);
    JpegStream.Seek(0, soFromBeginning);
    BM := TBitmap.Create;
    try
      MyTrace('RenderPage: LoadFromStream: Start');

      JPEG.LoadFromStream(jpegstream);
      jpegimage.Picture.Assign(JPEG);

// BM.LoadFromStream(MS);
      MyTrace('RenderPage: LoadFromStream: End');

      imgPreview.AutoSize := True;
      MyTrace('RenderPage: Picture.Assign: Start');
// imgPreview.Picture.Assign(BM);
      imgPreview.Picture.Assign(jpegimage.Picture.Graphic);
      MyTrace('RenderPage: Picture.Assign: End');
    finally
      BM.Free;
    end;
  finally
    MS.Free;
    JPEG.Free;
    JpegStream.Free;
    JpegImage.Free;
  end;

  MyTrace('RenderPage: End');
end { RenderPage } ;
Problem: die Stelle QPDF.RenderPageToStream verballert 300-400 MB Speicher !!!
DPI ist 46, die PDF enthält nur Text (Stream-Size 30 kB).

Das Speicherproblem tritt nur auf, wenn das PDF mehr als eine Seite hat.
#Update#: Falsch, es tritt immer auf !


Wie man am Code sieht, hatte ich zuerst mit Bitmap, dann mit JPEG gespielt.


Kennt jemand das Problem ?


Danke


Heiko
Heiko

Geändert von hoika (14. Apr 2011 um 13:13 Uhr)
  Mit Zitat antworten Zitat