Как использовать метод CreateTiff от Itext7 в параллельном цикле foreach? - PullRequest
0 голосов
/ 12 апреля 2019

Я написал некоторый код для преобразования TIFF-файлов в PDF-файлы с помощью Itext7. Но когда я запускаю его, он блокируется на методе Image.ImageDataFactory.CreateTiff. Если заменить Parallel.Foreach на foreach, все работает правильно. Что я делаю не так?


void Run(List<string> tiffsPaths)
{
   Parallel.ForEach(tiffsPaths, ConvertTiffToPdf)
}

void ConvertTiffToPdf(string tiffPath)
{
   var fileName = Path.GetFileNameWithoutExtension(tiffPath);
   var pdfPath = Path.Combine(this.outputPicPath, fileName + ".pdf");

   var pdfWriter = new PdfWriter(pdfPath);
   var document = new PdfDocument(pdfWriter);
   var workDir = Path.GetDirectoryName(SourceFile) ?? string.Empty;
   var pageNum = 1;

   var tiffImage = Image.ImageDataFactory.CreateTiff(new Uri(tiffPath), true, pageNum, true);
   var tiffPageSize = new Geom.Rectangle(tiffImage.GetWidth(), 
   tiffImage.GetHeight());
   var newPage = document.AddNewPage(new Geom.PageSize(tiffPageSize));
   var canvas = new PdfCanvas(newPage);
   canvas.AddImage(tiffImage, tiffPageSize, false);

   document.Close();
   pdfWriter.Close();
}

UPD Найден, где внутри тупика находится исходный код IText7 в методе public IRandomAccessSource CreateSource(Uri url) класса itext.io.source.RandomAccessSourceFactory. Там эта часть кода:

WebRequest wr = WebRequest.Create(url);
wr.Credentials = CredentialCache.DefaultCredentials;
Stream isp = wr.GetResponse().GetResponseStream();

1 Ответ

0 голосов
/ 12 апреля 2019

Заменил var tiffImage = Image.ImageDataFactory.CreateTiff(new Uri(tiffPath), true, pageNum, true); на var tiffImage = Image.ImageDataFactory.CreateTiff(File.ReadAllBytes(path), true, pageNum, true); и все отлично работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...