Вы не сможете сделать это с помощью iText, так как он не может отображать или растеризовать векторную графику в файлах PDF.
Вариант 1:
Если GPL лицензия работает для вас, вы можете растеризации файл PDF с ImageMagick + GNU Ghostscript, но AFAIK вам придется записать вывод в файл в этом случае.
пример командной строки:
convert -density 300 -depth 8 c:\temp\mydoc.pdf c:\temp\myrasterimage.png
Существует также .net обертка в Codeplex, которые могли бы работать для вас: ImageMagick.NET
Вариант А:
Если коммерческая библиотека является вариантом вы можете попробовать с Amyuni PDF Creator .Net. Вы можете использовать метод IacDocument.ExportToJpg, который требует записи в файл, или вы можете использовать метод IacDocument.DrawCurrentPage, который может быть полезен для записи вывода в поток памяти.
Пример кода для экспорта одной страницы с помощью IacDocument.DrawCurrentPage
в поток памяти:
const int twipsPerInch = 1440;
const int MM_ISOTROPIC = 7;
private static MemoryStream RasterizePDF(string filePath, int pageIndex, int targetDPI)
{
Amyuni.PDFCreator.IacDocument doc = new Amyuni.PDFCreator.IacDocument();
doc.SetLicenseKey("Evaluation", "07EFC00...77C23E29");
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
doc.Open(fs, "");
//Get the width and height of the target page
Amyuni.PDFCreator.IacPageFormat format = doc.GetPage(pageIndex).GetPageFormat();
doc.CurrentPageNumber = pageIndex;
//Create Image
Bitmap img = new Bitmap((int)(format.Width * targetDPI/twipsPerInch), (int)(format.Length * targetDPI/twipsPerInch), PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(img);
//set image object background to white
g.Clear(Color.White);
//Get a device context for the grahics object
IntPtr hdc = g.GetHdc();
SetMapMode(hdc, MM_ISOTROPIC);
// set scaling factor
SetWindowExtEx(hdc, twipsPerInch, twipsPerInch, 0);
SetViewportExtEx(hdc, targetDPI, targetDPI, 0);
//draw the contents of the PDF document on to the graphic context
doc.DrawCurrentPage(hdc, false);
//clean up
g.ReleaseHdc(hdc);
g.Dispose();
// Save the bitmap as png into the resulting stream
MemoryStream resultStrm = new MemoryStream();
img.Save(resultStrm, ImageFormat.Png);
//Prepare the stream to be read later on
resultStrm.Position = 0;
}
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern int SetMapMode(IntPtr hdc, int MapMode);
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern int SetWindowExtEx(IntPtr hdc, int nXExtent, int nYExtent, int not_used);
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern int SetViewportExtEx(IntPtr hdc, int nXExtent, int nYExtent, int not_used);
Отказ от ответственности: В настоящее время я работаю как разработчик библиотеки
Это звучит как одноразовый прецедент. Поскольку ваш клиент создал изображение и предоставил его вам, вы могли бы запросить, чтобы они просто поставляли его в формате PNG? Или вы можете открыть PDF, размер его на экране, как вы хотите, и сделать захват экрана. – mbmcavoy
К сожалению, клиент будет поставлять ВСЕ их изображения, как это. Причина в том, что сайт будет выплевывать изображения разных размеров на основе запроса размера изображения, или если пользователь хочет, они могут загрузить его векторную версию. – JohnathanKong
ОК, так будет значительное количество изображений, которые будут обработаны таким образом? Тем не менее, похоже, что PDF - это плохой выбор формата. Возможно, SVG? Поскольку это открытый формат с широкой поддержкой, я уверен, что вы можете программно конвертировать в PNG или PDF по запросу. – mbmcavoy