我使用的是Ghostscript.NET,一个方便的C#包装器,用于Ghostscript功能。我有一批的PDF是从客户端发送,以转换为图像上的ASP .NET WebAPI服务器,并返回给客户端。
public static IEnumerable<Image> PdfToImagesGhostscript(byte[] binaryPdfData, int dpi)
{
List<Image> pagesAsImages = new List<Image>();
GhostscriptVersionInfo gvi = new GhostscriptVersionInfo(AppDomain.CurrentDomain.BaseDirectory + @"\bin\gsdll32.dll");
using (var pdfDataStream = new MemoryStream(binaryPdfData))
using (var rasterizer = new Ghostscript.NET.Rasterizer.GhostscriptRasterizer())
{
rasterizer.Open(pdfDataStream, gvi, true);
for (int i = 1; i <= rasterizer.PageCount; i++)
{
Image pageAsImage = rasterizer.GetPage(dpi, dpi, i); // Out of Memory Exception on this line
pagesAsImages.Add(pageAsImage);
}
}
return pagesAsImages;
}这通常工作得很好(我通常使用500dpi,我知道这很高,但即使降到300,我也可以重现这个错误)。但是,如果我从客户端给它许多PDF(例如,150个1页PDF),它经常会在Ghostscript.NET光栅化器中遇到内存不足的异常。我该如何克服这个问题呢?这应该被线程化吗?如果是这样的话,它是如何工作的?使用64位版本的GhostScript会有帮助吗?提前谢谢。
发布于 2015-12-23 06:14:26
我自己也是新手,在这里寻找技术。
根据documentation here中的示例,它们显示:
for (int page = 1; page <= _rasterizer.PageCount; page++)
{
var docName = String.Format("Page-{0}.pdf", page);
var pageFilePath = Path.Combine(outputPath, docName);
var pdf = _rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
pdf.Save(pageFilePath);
pagesAsImages.Add(pdf);
}看起来你没有保存你的文件。
我仍然在努力让类似的东西在我这一端也能工作。目前,我有两个方法要尝试,首先使用GhostscriptProcessor:
private static void GhostscriptNetProcess(String fileName, String outputPath)
{
var version = Ghostscript.NET.GhostscriptVersionInfo.GetLastInstalledVersion();
var source = (fileName.IndexOf(' ') == -1) ? fileName : String.Format("\"{0}\"", fileName);
var gsArgs = new List<String>();
gsArgs.Add("-q");
gsArgs.Add("-dNOPAUSE");
gsArgs.Add("-dNOPROMPT");
gsArgs.Add("-sDEVICE=pdfwrite");
gsArgs.Add(String.Format(@"-sOutputFile={0}", outputPath));
gsArgs.Add(source);
var processor = new Ghostscript.NET.Processor.GhostscriptProcessor(version, false);
processor.Process(gsArgs.ToArray());
}下面的版本与你的类似,我开始使用的版本,直到我开始寻找其他代码示例:
private static void GhostscriptNetRaster(String fileName, String outputPath)
{
var version = Ghostscript.NET.GhostscriptVersionInfo.GetLastInstalledVersion();
using (var rasterizer = new Ghostscript.NET.Rasterizer.GhostscriptRasterizer())
{
rasterizer.Open(File.Open(fileName, FileMode.Open, FileAccess.Read), version, false);
for (int page = 0; page < rasterizer.PageCount; page++)
{
var img = rasterizer.GetPage(96, 96, page);
img.Save(outputPath);
}
}
}这对你有什么帮助吗?
发布于 2020-05-22 21:49:46
您不必栅格化同一GhostscriptRasterizer实例中的所有页面。在每个页面上使用一次性光栅化器,并在List Image或List byte[]中收集结果。Jpeg编码字节数组结果列表的示例。
List<byte[]> result = new List<byte[]>();
for (int i = 1; i <= pdfPagesCount; i++)
{
using (var pageRasterizer = new GhostscriptRasterizer())
{
pageRasterizer.Open(stream, gsVersion, true);
using (Image tempImage = pageRasterizer.GetPage(dpiX, dpiY, i))
{
var encoder = ImageCodecInfo.GetImageEncoders().First(c => c.FormatID == System.Drawing.Imaging.ImageFormat.Jpeg.Guid);
var encoderParams = new EncoderParameters() { Param = new[] { new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 95L) } };
using (MemoryStream memoryStream = new MemoryStream())
{
tempImage.Save(memoryStream, encoder, encoderParams);
result.Add(memoryStream.ToArray());
}
}
}
}如果你不知道PDF中的页数,你可以调用光栅化器一次,并获得PageCount属性。
https://stackoverflow.com/questions/33508801
复制相似问题