如何在C#中引用Ghostscript DLL

时间:2016-12-31 12:43:00

标签: c# pdf ghostscript

我正在使用C#包装器使用Ghostscript将PDF转换为图像,但我似乎无法正确引用dll。 我将DLL存储在bin文件夹中(也不知道这是否是保存它的最佳位置) 这是我的代码:

 byte[] fileData = null;
            using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
            {
                fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
            }

    string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);

    Ghostscript.NET.Rasterizer.GhostscriptRasterizer rasterizer = null;
    Ghostscript.NET.GhostscriptVersionInfo vesion = new Ghostscript.NET.GhostscriptVersionInfo(new Version(0, 0, 0), path + @"\gsdll64.dll", string.Empty, Ghostscript.NET.GhostscriptLicense.GPL);
    Stream inStream = new MemoryStream(fileData);
    MemoryStream outStream = new MemoryStream();
    List<Image> imageList = new List<Image>();
    using (rasterizer = new Ghostscript.NET.Rasterizer.GhostscriptRasterizer())
    {
        rasterizer.Open(inStream, vesion, false);
         for (int i = 1; i <= rasterizer.PageCount; i++)
        {
            //string pageFilePath = Path.Combine(outputPath, Path.GetFileNameWithoutExtension(file) + "-p" + i.ToString() + ".jpg");
            int dpi = 200;
            Image img = rasterizer.GetPage(dpi, dpi, i);
            img.Save(outStream, ImageFormat.Jpeg);
            Image img = new Image
            {
                imgByteArray = outStream.ToArray()
            };
            imageList.Add(image);
        }
         rasterizer.Close();
    }

我无法找到 Ghostscript本机库错误。 这是我得到的路径

enter image description here

我认为它与DLLPath字符串中的double /和'file://'有关。我还应该指定LipPath吗? 任何帮助?

2 个答案:

答案 0 :(得分:3)

在你的情况下,你应该这样制作ghostscript dll路径:

string binPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string gsDllPath = Path.Combine(binPath, Environment.Is64BitProcess ? "gsdll64.dll" : "gsdll32.dll");

答案 1 :(得分:0)

即使这不能直接回答问题,但我认为值得一提,因为我在2016年发布的Ghostscript.NET 1.2.1版中使用OP的代码遇到了问题。这是我发现的解决方法:< / p>

在源代码中, Ghostscript.NET \ Helpers \ StreamHelper.cs:171

n = output.Read(buffer, 0, buffer.Length);

真的应该

n = input.Read(buffer, 0, buffer.Length);

如果您打开流而不是路径,而不修改上述代码,则会得到空结果,因为未复制输入流。

更深入地阅读代码会发现输入流已写入临时文件,然后再次读入内存。如果以 rasterizer.Open 作为开头的磁盘上PDF文件,则最好使用路径而不是流打开。