C#”;参数无效“;when Image in using语句

本文关键字:Image in using when 语句 参数 无效 | 更新日期: 2023-09-27 18:16:25

Windows 8.1 Pro、Visual Studio 2015 Update 3、C#、.NET Framework 4.5。Ghostscript.NET(最新版本(,Ghostscript 9.20。

我正在将PDF转换为PDF。哈。嗯,我正在制作一个"可编辑"的PDF"硬"PDF,无法编辑,质量较低。这个过程是我获取可编辑的PDF,将其保存为PNG文件的x页,将这些PNG文件转换为多页TIFF,然后将多页TIFF转换为我需要的PDF。

这与Visual Studio 2012(GhostScript.NET和GS 9.10的早期版本(配合得很好。

public static Tuple<string, List<string>> CreatePNGFromPDF(string inputFile, string outputfile)
{
    Tuple<string, List<string>> t = null;
    List<string> fileList = new List<string>();
    string message = "Success";
    string outputFileName = string.Empty;
    int desired_x_dpi = 96;
    int desired_y_dpi = 96;
    try
    {
        using (GhostscriptViewer gsViewer = new GhostscriptViewer())
        {
            gsViewer.Open(inputFile);
            using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer(gsViewer))
            {
                for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
                {
                    using (System.Drawing.Image img = rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber))
                    {
                        outputFileName = outputfile.Replace(".png", string.Empty) + "_page_" + pageNumber.ToString() + ".png";
                        img.Save(outputFileName, ImageFormat.Png);
                        if (!fileList.Contains(outputFileName))
                        {
                            fileList.Add(outputFileName);
                        }
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        message = ex.Message;
    }
    t = new Tuple<string, List<string>>(message, fileList);
    return t;
}

这现在在以下线路上失败:

using (System.Drawing.Image img = rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber))

处理第二个页面时。第一页还可以。

我下载了GhostScript.NET的源代码,将其添加到我的解决方案中,进行调试等,并花了很长时间试图弄清楚这一点。

然后,我决定将这些功能分离出来,并在一个简单的控制台应用程序中提供最低限度的功能供我进一步检查:

static void Main(string[] args)
{
    int xDpi = 96;
    int yDpi = 96;
    string pdfFile = @"Inputfilenamehere.pdf";
    GhostscriptVersionInfo gsVersionInfo = GhostscriptVersionInfo.GetLastInstalledVersion(GhostscriptLicense.GPL | GhostscriptLicense.AFPL, GhostscriptLicense.GPL);
    List<GhostscriptVersionInfo> gsVersionInfoList = GhostscriptVersionInfo.GetInstalledVersions(GhostscriptLicense.GPL | GhostscriptLicense.AFPL);
    try
    {
        using (GhostscriptViewer gsViewer = new GhostscriptViewer())
        {
            gsViewer.Open(pdfFile);
            using (GhostscriptRasterizer gsRasterizer = new GhostscriptRasterizer(gsViewer))
            {
                int pageCount = gsRasterizer.PageCount;
                for (int i = 0; i < pageCount; i++)
                {
                    Image img = gsRasterizer.GetPage(xDpi, yDpi, i + 1);
                }
            }
        }
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

瞧,没有问题。不同的是,我没有在using语句中声明我的图像。

我总是努力成为一名优秀的开发人员,每当类实现IDisposable时,我都会使用using语句。

所以,我取消了使用,得到了我一直想要的低质量PDF。我现在的生活很好。

        using (GhostscriptViewer gsViewer = new GhostscriptViewer())
        {
            gsViewer.Open(inputFile);
            using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer(gsViewer))
            {
                for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
                {
                    System.Drawing.Image img = rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
                    outputFileName = outputfile.Replace(".png", string.Empty) + "_page_" + pageNumber.ToString() + ".png";
                    img.Save(outputFileName, ImageFormat.Png);
                    if (!fileList.Contains(outputFileName))
                    {
                        fileList.Add(outputFileName);
                    }
                }
            }
        }

注意,如果我在for循环结束时调用img.Dispose(),我会再次得到相同的错误!

我的最佳猜测是,我的问题不是GhostScript或GhostScript.NET问题。如果类实现了IDisposable,那么我坚持盲目地使用"using"语句,这是不是太愚蠢了?我一直明白,最好的做法是用using语句包装任何实现IDisposable的东西,以放弃泄漏等。

因此,我的问题是:有什么想法吗?为什么当我在using语句中初始化System.Drawing.Image类时会得到"Parameter is invalid"异常,而当我没有初始化时却不会?我很想更多地了解这一点

更好的是,如果有人知道我如何获得此功能,并确保我正确处理了我的对象,那将是最好的

当我搜索信息时,我没有找到太多关于这个特定主题的信息。我确实发现了另一篇StackOverflow帖子,内容是有人在using语句中使用图形对象,但出现了同样的错误。我想知道是否有关系。我还注意到我应该使用Dispose((,但这似乎是造成问题的原因,我需要这样做。

仅供参考,对于任何感兴趣的人来说,实际错误发生在GhostScript.NET代码中的GhostScriptInterrester.cs中:

方法:public void Run(string str)str是"页面pdfshowpage_init pdfshowpage_finish">

// GSAPI: run the string
int rc_run = _gs.gsapi_run_string(_gs_instance, str, 0, out exit_code);

C#”;参数无效“;when Image in using语句

我至少找到了失败的根本原因。我的GhostscriptRasterizer对象为高度点和宽度点设置了值"0"。

var rasterizer = new GhostscriptRasterizer();
rasterizer.CustomSwitches.Add("-dDEVICEWIDTHPOINTS=" + widthPoints);
rasterizer.CustomSwitches.Add("-dDEVICEHEIGHTPOINTS=" + heightPoints);

一旦我将高度和宽度都设置为有效的非零值,问题就得到了解决。