2016-11-04 10 views
3

Windows 8.1 Pro, Visual Studio 2015 업데이트 3, C#, .NET Framework 4.5를 사용하는 경우 C# .NET의 "매개 변수가 유효하지 않습니다." Ghostscript.NET (최신), GhostScript 9.20.Statement in using 문장

PDF를 PDF로 변환 중입니다. 하하. 글쎄, 나는 편집 할 수없고 낮은 품질의 "편집 가능한"PDF "하드"PDF를 만들고 있습니다. 프로세스는 편집 가능한 PDF를 가져 와서 PNG 파일의 x- 페이지로 저장하고 여러 PNG 파일을 여러 페이지 TIFF로 변환 한 다음 여러 페이지 TIFF를 필요한 PDF로 변환합니다.

이것은 GhostScript .NET 및 GS 9.10 이전 버전의 Visual Studio 2012에서 제대로 작동했습니다.

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를 얻습니다. 내 인생은 이제 좋아. 나는 for 루프의 끝에서 img.Dispose()를 호출하는 경우, 내가 다시 같은 오류를 얻을

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

주의!

내 생각에 내 문제는 GhostScript 또는 GhostScript.NET 문제가 아닙니다. 클래스가 IDisposable을 구현하면 "using"문을 사용하는 것을 맹목적으로 주장하는 것에 대해 나는 골머럽 읶가? 나는 항상 가장 등 누수를 포기하는 usingIDisposable를 구현하는 것을 포장하는 연습, 따라서

, 내 질문에 있다고 이해했습니다 내가 초기화 할 때 어떤 아이디어가 왜 "파라미터가 유효하지 않습니다"예외가 System.Drawing.Image 클래스 내에서 using 문 내에서 수업을하지만 그렇지 않은 경우에는? 나는 이것을 더 많이 이해하고 싶다. 누군가가 내가 제대로 내 객체를 폐기하고있어이 기능을 얻기도 보장 할 수 있습니다 방법을 알고있는 경우,

더 나은 아직, 그것은 가장 좋은 것입니다.

정보를 검색 할 때이 특정 주제에 대해 많이 알지 못했습니다. 동일한 오류가있는 using 문에서 그래픽 객체를 사용하는 사람에 대해 하나의 other StackOverflow post을 찾았습니다. 나는 관계가 있는지 궁금해. 나는 또한 I should be using Dispose()에 주목하지만, 문제를 일으키는 것으로 보입니다.내가 찾은 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); 
+0

이 문제에 대한 답변을 찾았습니까? 비슷한 문제가 발생할 수도 있습니다. – Puvi

답변

0

:

방법 :

참고로, 관심있는 사람들을 위해, 실제 오류가 GhostScript.NET 코드 GhostscriptInterprester.cs 여기에서 발생 내 실패의 근본 원인. 내 GhostscriptRasterizer 객체의 높이 값과 너비 값이 '0'으로 설정되었습니다.

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

높이와 너비를 유효한 0이 아닌 값으로 설정하면 문제가 해결됩니다.