2017-01-28 5 views
-1

PDFファイルを読み込んで、それに関する情報を表示するプログラムを作成しました。それはうまく動作します。スコープ外の変数はどのように使用しますか? (エラー:CS0136)

class Program 
    { 
     static void Main(string[] args) 
     { 
      //some variables 
      string plabels = null; 
      string text2Search = "IX"; 
      PdfReader reader = new PdfReader("file.pdf"); 
      string[] labels = PdfPageLabels.GetPageLabels(reader); 

      for (int l = 0; l < labels.Length; l++) 
      { 
       plabels += labels[l] + "\n"; 
      } 
      Console.WriteLine(plabels.IndexOf(text2Search, StringComparison.CurrentCultureIgnoreCase)); 
      Console.ReadLine(); 
     } 
    } 

また、PDFファイルを読み込んでコピーを作成する別のプログラムも作成しました。それは正常に動作します。

class Program 
    { 
     static void Main(string[] args) 
     { 

      byte[] bytes; 

      using (var ms = new MemoryStream()) 
      { 
       using (var reader = new PdfReader("file.pdf")) 
       { 
        using (var stamper = new PdfStamper(reader, ms)) 
        { 

        } 
       } 
       //grab the bytes before closing things out 
       bytes = ms.ToArray(); 
      } 
      File.WriteAllBytes("output.pdf", bytes); 
     } 
    } 

これらの2つのプログラムを1つにまとめることはできません。あなたのコメントへ

EDIT

おかげで私は、エラーを発見。今すぐコードがコンパイルされますが、実行すると"Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object."エラーポイントはfor(int l = 0; l < labels.Length; l++)になります。

class Program 
{ 
    static void Main(string[] args) 
    { 

     byte[] bytes; 

     using (var ms = new MemoryStream()) 
     { 
      using (var reader = new PdfReader("file.pdf")) 
      { 
       //some variables 
       string plabels = null; 
       string text2Search = "IX"; 
       string[] labels = PdfPageLabels.GetPageLabels(reader); 
       for(int l = 0; l < labels.Length; l++) 
        { 
        plabels += labels[l] + "\n"; 
       } 
       Console.WriteLine(plabels.IndexOf(text2Search, StringComparison.CurrentCultureIgnoreCase)); 
       Console.ReadLine(); 
       using (var stamper = new PdfStamper(reader, ms)) 
       { 

       } 
      } 
      //grab the bytes before closing things out 
      bytes = ms.ToArray(); 
     } 
     File.WriteAllBytes("output.pdf", bytes); 
    } 
} 
+0

現在のスコープの外に変数を使用することはできません。スコープの全体の点です。あなたができることは、より高いスコープで変数を定義して、より多くの場所でスコープ内にあるようにすることです。 –

+0

@BradleyUffnerコードを変更しました。今はうまくコンパイルされますが、実行時にエラーが発生します。詳細は、私の更新情報の投稿をご覧ください。 – menteith

+1

それから、 'PdfPageLabels.GetPageLabels()'は 'null'を返さなければならないので、' labels.Length'への参照は例外をスローします。最初に 'null'をチェックするか、なぜ' GetPageLabels() 'が' null'を返すのかを理解して修正してください。 –

答えて

0

readerは、usingステートメントですでに定義されています。その変数名をusingブロックの中で再利用することはできません。変数readerのいずれかの名前を変更するか、それを削除します。

using (PdfReader reader = new PdfReader("file.pdf")) 
{ 
    PdfReader reader = new PdfReader("file.pdf"); //is redundant. 
} 
+0

私はそれを実行すると、プログラムはうまくコンパイルされますが、実行すると '未処理の例外:System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 – menteith

+0

私はそれが別の問題だと思います。私は元の質問に答えました。今答えは無関係に見えます。 NullReferenceExceptionについては、コメントに@grantがあると思います。使用する前に 'labels'がnullであるかどうかを確認する必要があります。ラベルがない場合、 'GetPageLabels'がnullを返す可能性はありますか? – chadnt

+0

おそらくそうです。しかし、私の最初のプログラムは正常に動作し、同じコードと同じPDFファイル(ラベルが付いている)を使用するので、問題は別の場所にあります。 – menteith

0

labelsがnullです。 PdfPageLabels.GetPageLabels(reader); は値を返していないので、そこを見てください。私はあなたに明確な答えを与えることはできませんので、コードは掲載されていません。

+0

'no code is posted'とは何を意味しますか?あなたはnullについて正しいです - 私はVSのコードをデバッグしました。 – menteith

+0

これは、nullであることを理解するのに役立つGetPageLabelsメソッドが表示されないことを意味します。 –

関連する問題