C#.NET"参数无效"使用语句

时间:2016-11-04 15:13:45

标签: c# .net pdf ghostscript.net ghostscriptsharp

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

我将PDF转换为PDF。哈。好吧,我正在做一个可编辑的" PDF" hard" 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);
                    }
                }
            }
        }

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

我最好的猜测是我的问题不是GhostScript或GhostScript.NET问题。我是坚持盲目使用&#34;使用&#34;如果类实现IDisposable的语句?我一直都明白,最好的做法是将实施IDisposable的任何内容用using语句包起来放弃泄密等。

因此,我的问题:任何想法为什么我得到&#34;参数无效&#34;我在System.Drawing.Image声明中初始化using课程时的例外情况,但是当我不在时?我更想了解这一点。

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

当我搜索信息时,我对这个特定主题没有太多了解。我确实找到一个other StackOverflow post关于某人使用具有相同错误的using语句中的图形对象。我想知道是否有关系。我还注意到I should be using Dispose(),但这似乎导致了问题,我需要这个工作。

仅供参考,对于任何感兴趣的人,GhostScript.NET代码中的GhostscriptInterprester.cs中会出现实际错误:

方法:public void Run(string str) str is&#34; Page pdfshowpage_init pdfshowpage_finish&#34;

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

1 个答案:

答案 0 :(得分:0)

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

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

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