Ошибка при сохранении PDF файла через Synopse

имеется код, производящий выгрузку картинок с одного ресурса:

procedure DownProc;
var
  i:integer;
  MS: TMemoryStream;
  lPdf: TPdfDocument;
  lPage: TPdfPage;
  GifImage:TGifImage;
  pdfimage: TPdfImage;

  begin


    lPdf := TPdfDocument.Create; // создали документ
    lPdf.Info.Author := 'User'; // задали автора
    lPdf.Info.CreationDate := Now; // задали дату создания документа
    lPdf.DefaultPaperSize := psA4; // указали формат страниц (А4)
    Form2.ProgressBar1.Min := 1;
    Form2.ProgressBar1.Max := 862;


  for i := 1 to 862 do
   begin

   MS := TMemoryStream.Create; //Создали поток
   GifImage:=TGifImage.Create; //Создали объект картинки
   lPage := lPdf.AddPage;      //Добавили страничку

    try
      Form2.IdHTTP1.Get('https://example'+IntToStr(i)+'.com', MS);  //Загрузили картинку в поток

      MS.Position := 0; // Для того, чтобы позиция читалась с 0

      GifImage.LoadFromStream(MS);
      pdfimage := TPdfImage.Create(lPdf, GifImage, true); //Создали объект картинки в PDF

      try
        lPdf.AddXObject(AnsiString(IntToStr(i)), pdfimage); //Добавили картинку к PDF
        lPdf.Canvas.DrawXObject(0, 0, (GifImage.Width/2), (GifImage.Height/2), 
                                AnsiString(IntToStr(i)));   //Нарисовали картинку
        
        Form2.ProgressBar1.Position := i;
        Form2.Memo1.Lines.Add(IntToStr(i));

      finally
          pdfimage.Free; //Освободили память
      end;

    finally
      MS.Free; //Освободили память
      GifImage.Free; //Освободили память
    end;

   end;

  try
    Form2.Memo1.Lines.Add('SAVING');
    lpdf.SaveToFile('C:\_Books\Example.pdf');
    Form2.Memo1.Lines.Add('SAVED');

    Form2.ProgressBar1.Position := 0;
  except
    Form2.ProgressBar1.Position := 1;
  end;

    isDownload:= true;
    MyThread.DoTerminate;
  end;

Однако данный код не работает, крашится при второй итерации на строчке: lPdf.AddXObject(AnsiString(IntToStr(i)), pdfimage);

В библиотеке крашится на следующем куске:

function TPdfDocument.GetXObject(const AName: PDFString): TPdfXObject;
var i: integer;
begin
  for i := 0 to FXObjectList.ItemCount-1 do begin
    result := TPdfXObject(FXObjectList.FArray.List[i]);
    if result.FObjectType=otVirtualObject then begin
      result := TPdfXObject(FXRef.GetObject(result.FObjectNumber));
      if (result=nil) or not result.InheritsFrom(TPdfXObject) then
        continue;
    end;
    if result.Attributes<>nil then
      if TPdfName(result.Attributes.ValueByName('Name')).Value=AName then //ОШИБКА ЗДЕСЬ!
        exit;
  end;
  Result := nil;
end;

При этом компилятор выдает ошибку: "Access violation"

Однако, если в коде выкачивания картинки убрать строчку:

pdfimage.Free;

То программа работает нормально. Но, лишь до 255 элемента (смотри цикл for), затем, завершая работу по объективным причинам "Out of memory".

Ну, собственно сам вопрос: каким образом можно нормально выкачать все 862 изображения? Почему программа ругается на освобождение памяти?

З.Ы. Delphi 10.3


Ответы (0 шт):