Создать миниатюру в формате PDF (с открытым исходным кодом / бесплатно)
Просматривая другие посты для этого не смог найти адекватного решения, которое бы отвечало моим потребностям. Попытка просто получить первую страницу документа PDF в виде эскиза. Это должно быть запущено как серверное приложение, поэтому не захочется записывать pdf-документ в файл, а затем вызывать третье приложение, которое читает pdf-файл для создания изображения на диске.
doc = new PDFdocument("some.pdf");
page = doc.page(1);
Image image = page.image;
Благодарю.
5 ответов
Мэтью Эфраим выпустил оболочку с открытым исходным кодом для Ghostscript, которая звучит так, как будто она делает то, что вы хотите, и находится в C#.
Ссылка на исходный код: https://github.com/mephraim/ghostscriptsharp
Ссылка на публикацию в блоге: http://www.mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/
Вы можете сделать простой вызов метода GeneratePageThumb, чтобы сгенерировать миниатюру (или использовать GeneratePageThumbs с номером начальной и конечной страницы, чтобы сгенерировать миниатюры для нескольких отдельных страниц, где каждая страница является отдельным выходным файлом), формат файла по умолчанию - jpeg, но вы можно изменить его и многие другие параметры, используя альтернативный вызов метода GenerateOutput и указав такие параметры, как формат файла, размер страницы и т. д.
Я думаю, что пакет кода Windows API для Microsoft .NET Framework мог бы сработать проще всего. Он может создать ту же миниатюру, что и Windows Explorer (и это первая страница), и вы можете выбрать несколько размеров, они будут иметь размер 1024x1024, так что этого должно быть достаточно. Это довольно просто, просто создайте ShellObject.FromParsingName(filepath) и найдите его подкласс Thumbnail.
Проблема может быть в том, что ваш сервер. Это работает в Windows 7, Windows Vista и, я полагаю, в Windows Server 2008. Кроме того, Windows Explorer должен отображать эскизы на этом компьютере. Самый простой способ обеспечить это - установить Adobe Reader. Если все это не проблема, я думаю, что это самый элегантный способ.
ОБНОВЛЕНИЕ: Adobe Reader прекратил поддержку миниатюр в последних версиях, поэтому необходимо использовать его старые версии.
ОБНОВЛЕНИЕ 2: Согласно комментарию от Роберто, вы все еще можете использовать последнюю версию Adobe Reader, если вы включите функцию миниатюр в Редактировать - Настройки - Общие.
Загрузите PDFLibNet и используйте следующий код
public void ConvertPDFtoJPG(string filename, String dirOut)
{
PDFLibNet.PDFWrapper _pdfDoc = new PDFLibNet.PDFWrapper();
_pdfDoc.LoadPDF(filename);
for (int i = 0; i < _pdfDoc.PageCount; i++)
{
Image img = RenderPage(_pdfDoc, i);
img.Save(Path.Combine(dirOut, string.Format("{0}{1}.jpg", i,DateTime.Now.ToString("mmss"))));
}
_pdfDoc.Dispose();
return;
}
public Image RenderPage(PDFLibNet.PDFWrapper doc, int page)
{
doc.CurrentPage = page + 1;
doc.CurrentX = 0;
doc.CurrentY = 0;
doc.RenderPage(IntPtr.Zero);
// create an image to draw the page into
var buffer = new Bitmap(doc.PageWidth, doc.PageHeight);
doc.ClientBounds = new Rectangle(0, 0, doc.PageWidth, doc.PageHeight);
using (var g = Graphics.FromImage(buffer))
{
var hdc = g.GetHdc();
try
{
doc.DrawPageHDC(hdc);
}
finally
{
g.ReleaseHdc();
}
}
return buffer;
}
Раньше я делал подобные вещи с помощью imagemagick (Convert). Для этого есть.Net Wrapper, возможно, стоит проверить: http://imagemagick.codeplex.com/releases/view/30302
http://www.codeproject.com/KB/cs/GhostScriptUseWithCSharp.aspx
Это работает очень хорошо. Единственными зависимостями являются GhostScript gsdll32.dll (вам нужно скачать GhostScript отдельно, чтобы получить это, но нет необходимости устанавливать GhostScript в вашей производственной среде), и PDFSharp.dll, который включен в проект.