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++; }
}
}
}