Ошибка при сохранении 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