Member 10268466 Ответов: 2

Генерация PDF в изображение с помощью ghostscript работает неправильно


Я пытаюсь создать PDF-файл для изображения с помощью ghostscript. Он хорошо смотрится на моем местном сайте. Теперь я установил свой веб-сайт на IIS с помощью приложения App для сайта по умолчанию, и доступ к нему с другого ПК с помощью подключения к локальной сети Мой сайт выглядит хорошо, но ghostscript не генерирует Pdf в изображение. Есть ли что-нибудь, что я упустил?

Я использую gsdll32.dll файл

Что я уже пробовал:

GhostscriptWrapper.GenerateOutput(sourcePdfFilePath, destinationPngFilePath,
новые GhostscriptSettings
{
Устройство = GhostscriptDevices.pngalpha,
Стр = новый GhostscriptPages
{
Старт = 1,
Конец = 1,
AllPages = false
},
Разрешение = новый размер
{
Высота = 72,
Ширина = 72
},
Размер = новый GhostscriptPageSize
{
Родной = GhostscriptPageSizes.А4
}
}
);

2 Ответов

Рейтинг:
2

NathanRO

Я только что сделал это для пакетного приложения OCR и обнаружил, что с помощью Ghostscript.NET (видеть здесь) работал отлично и был надежен. Самая большая проблема, которую я обнаружил, заключалась в том, что только потому, что на станции разработки установлен Ghostscript, это не означает, что система, выполняющая эту процедуру, делает это. В этом случае лучше всего предоставить средство для инициализации Ghostscript в памяти с помощью указанного gsdll32.dll путь к файлу. Это слегка измененная версия моего рабочего кода. Единственная разница заключается в том, что мы не предоставляем и входной путь, мы предоставляем объект, который имеет эти данные в нем.

using Ghostscript.NET;

static GhostscriptVersionInfo GetVersionInfo(string dllPath)
        {
            GhostscriptVersionInfo gsVersion = null;

            try { gsVersion = GhostscriptVersionInfo.GetLastInstalledVersion(GhostscriptLicense.GPL | GhostscriptLicense.AFPL, GhostscriptLicense.GPL); }
            catch { }

            if (gsVersion == null)
            {
                try { gsVersion = new GhostscriptVersionInfo(new Version(0, 0, 0), dllPath, string.Empty, GhostscriptLicense.GPL); }
                catch { }
            }

            return gsVersion;
        }


        static void ExtractPagesAsPngs(GhostscriptVersionInfo gsVersion, string scrFilePath, string destFilePath, int[] sheetsToExtract, int[] allowedDpiValues)
        {
            if ((allowedDpiValues == null) || (allowedDpiValues.Length < 1)) { allowedDpiValues = new int[] {300, 256, 150, 128, 96, 72, 64, 32, 16, 8}; }
            
            // Set up the GhostscriptPngDevice object.
            var gsDev = new GhostscriptPngDevice(GhostscriptPngDeviceType.Png256);
            gsDev.GraphicsAlphaBits = GhostscriptImageDeviceAlphaBits.V_4;
            gsDev.TextAlphaBits = GhostscriptImageDeviceAlphaBits.V_4;
            gsDev.CustomSwitches.Add("-dDOINTERPOLATE");
            
            // Iterate thought the sheets to extract, and extract them.
            for (var i = 0; i < sheetsToExtract.Length; i++)
            {
                // Specify the PDF and sheet number.
                gsDev.InputFiles.Add(scrFilePath);
                gsDev.Pdf.FirstPage = sheetsToExtract[i];
                gsDev.Pdf.LastPage = sheetsToExtract[i];

                // Set the output file path (if multiple sheets, place sheet number in parenthsies.
                if (sheetsToExtract.Length == 1) { gsDev.OutputPath = destFilePath; }
                else { gsDev.OutputPath = destFilePath.Replace(".png", " (" + sheetsToExtract[i].ToString() + ").png"); }

                // Prevent zero (0) or negative DPI values.
                for (var j = 0; j < allowedDpiValues.Length; j++)
                {
                    if (allowedDpiValues[j] < 1) { allowedDpiValues[j] = 1; }
                }

                // Remove duplicate allowed DPI values.
                var dpiToTry = allowedDpiValues.Distinct().OrderBy(x => x).ToArray();

                // Attempt to extect the image at highest allowed DPI, and decrementing by using the next approved DPI
                // specified until successfull or no more allowed DPI values exsist.
                int dpiIdx = 0;
                bool extracted = false;
                while (!extracted && (dpiIdx < dpiToTry.Length))
                {
                    // Set the resolution.
                    gsDev.ResolutionXY = new GhostscriptImageDeviceResolution(dpiToTry[dpiIdx], dpiToTry[dpiIdx]);

                    // Try to extract the image.
                    try { gsDev.Process(gsVersion, true, null); }
                    catch { }

                    // Check if successful.
                    if (File.Exists(gsDev.OutputPath)) { extracted = true; }
                    else { dpiIdx++; }
                }
            }
        }


Рейтинг:
0

David_Wimbley

Вы не опубликовали сообщение об ошибке, но одна распространенная проблема, с которой я столкнулся с ghostscript и gsdll32.dll это то, что он должен быть расположен в вашем развернутом каталоге projects /bin (например: c:\inetpub\wwwroot\yourprojectname\bin). Я верю, что gsdll32.dll не может быть включен в качестве ссылки в ваш проект, поэтому он не будет автоматически подхвачен при публикации при развертывании вашего приложения.


Member 10268466

Да, может быть, вы и правы.Но мой вопрос не для этого. Пожалуйста, прочтите вопрос еще раз. Меня беспокоит другое.

David_Wimbley

Мой ответ остается прежним. Убедитесь, что развернутое приложение содержит указанную библиотеку dll. Кроме того, вам было бы полезно опубликовать сообщение об ошибке, так как догадка о том, что делает ваш код, ни к чему вас не приведет.

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