Ghost Script в формате PDF в.NET

Я хочу отобразить эскизы загруженных файлов PDF на моем веб-сайте (ASP.NET). До сих пор я сделал следующие вещи.

  1. По этой ссылке у меня появилась идея использовать ghostscript. Как создать миниатюру для некоторых страниц PDF-файла?

Вероятно, вы могли бы использовать одну из универсальных библиотек PDF: • Ghostscript - C, доступный по лицензии GPL • Poppler - C++, доступный по лицензии GPL • Adobe PDF Library SDK - дорогой Google показывает довольно много конвертеров PDF в изображения, которые Вы можете включить, если один из указанных выше вариантов не работает.

  1. Затем сгенерируйте миниатюру в формате pdf (с открытым исходным кодом / бесплатно) и попросили меня поискать упомянутую обертку.

Мэтью Эфраим выпустил оболочку с открытым исходным кодом для 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 и указать такие параметры, как формат файла, размер страницы и т. д.

Теперь, следуя инструкциям http://mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/ я установил ghostscript в моей системе, которая является 64-разрядной версией Windows 8.

Теперь я создал решение, содержащее тестовый проект вышеупомянутого парня, и в моем собственном проекте я вызываю функцию его проекта.

try
        {
            GhostscriptSharpTests.GhostscriptSharpTests ss = new GhostscriptSharpTests.GhostscriptSharpTests();
            ss.GenerateSinglePageThumbnail();
        }
        catch (Exception ex)
        { 

        }

но я получаю исключение:

Невозможно загрузить DLL 'gsdll32.dll': указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)

3 ответа

Решение

Об ошибке:

Ошибка, которую вы получаете, может быть связана с тем, что gsdll32.dll не может быть найден или установлена ​​неверная версия Ghostscript, которую вы использовали. Для 64-битной системы вам необходимо установить 64-битную библиотеку Ghostscript, в которой есть gsdll64.dll. Если вы компилируете приложение для цели AnyCPU platfrom, в 64-битной системе оно будет работать как 64-битный процесс, и вам потребуется gsdll64.dll. Если вы скомпилируете свое приложение как x86 и запустите его в 64-битной системе, ваше приложение будет работать как 32-битный процесс, и вы можете использовать gsdll32.dll. Когда вы используете DllImport, убедитесь, что dll, который вы пытаетесь вызвать, находится в той же (bin) папке, которую выполняет ваше приложение, или это может быть в windows \ system. Если вы хотите пользовательское расположение DLL, вы можете использовать полный путь в DllImport ([DllImport("C:\Program Files\gs\gs9.14\bin\gsdll32.dll", EntryPoint = "gsapi_new_instance")]) что обычно не рекомендуется.

Почему бы вам просто не использовать библиотеку Ghostscript.NET? Это хорошо проверенная оболочка библиотеки Ghostscript, которая позволит вам делать все, что вам нужно, и она совместима с библиотеками x86 и x64 Ghostscript.

Пример кода, который показывает, как растеризовать pdf в изображение, можно найти здесь: https://ghostscriptnet.codeplex.com/SourceControl/latest.

Попробуйте разные (более низкие) значения с "требуемым_x_dpi" и "желаемым_у_dpi", и выходное изображение будет меньше.

Я использовал Ghostscript.NET с помощью NuGet в своем проекте ASP.NET Core 1.0. Не забудьте установить GhostScript из here,

Также обратите внимание на 32/64-битную версию DLL, используемую в зависимости от конфигурации вашей платформы + приложения.

Я хотел бы, чтобы эта функция поддерживала другие типы файлов с именем и общим значком типа, например Word / Excel и т. Д.

private void createThumbnail(string sourcePath, Guid targetFile, string fileExtension, string uploadPath, string Name)
    {
        if (fileExtension.ToUpper() != ".PDF") // todo: Use "Name" to create thumbnail for other types
            return;
        try
        {
            int dpi = 72;

            //GhostscriptVersionInfo gvi = new GhostscriptVersionInfo(@"C:\Program Files\gs\gs9.20\bin\gsdll64.lib");
            GhostscriptVersionInfo gvi = new GhostscriptVersionInfo(_AppSettings.GhostscriptLibPath);
            _logger.LogInformation("[createThumbnail] gvi.DllPath: {0}, gvi.Version: {1}", gvi.DllPath, gvi.Version);

            GhostscriptProcessor proc = new GhostscriptProcessor(gvi);

            using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
            {
                rasterizer.Open(sourcePath, gvi, false);
                int pageNumber = 1;
                string targetPath = Path.Combine(uploadPath, targetFile + ".png");
                Image img = rasterizer.GetPage(dpi, dpi, pageNumber);
                Image newImage = img.GetThumbnailImage(_AppSettings.DocThumbnailWidth, _AppSettings.DocThumbnailHeight, null, new System.IntPtr());
                newImage.Save(targetPath, ImageFormat.Png);
                _logger.LogInformation("[createThumbnail] Thumbnail image saved, targetPath: {0}", targetPath);
            }
        }
        catch (Exception e)
        {
            _logger.LogError("Thumbnail could not be generated for file: {0}", sourcePath, e);
            //throw;
        }
    }

Сохраните gsdll32.dll в проекте, но настройте его на копирование в папку output / bin, и он должен забрать его в вашем приложении.

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