Создать миниатюру в формате 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, который включен в проект.

Другие вопросы по тегам