2013-03-25 54 views
6

私のWebメソッドは、%temp%フォルダにpdfファイルを作成し、それが動作します。次に、以下のコードを使用して、カスタムフィールド(メタ)をそのファイルに追加します。ファイルが別のプロセスで使用されているため、ファイルにアクセスできません。

クラスPdfStamperは、.Close()メソッドを使用するか、usingブロックを終了するかにかかわらず、IOExceptionを生成します。まだファイルハンドルを保持しているプロセスはwebdev Webサーバーそのものです(私はVS2010 SP1でデバッグしています)。

ファイルにアクセスすることはできませんプロセスのC:\ユーザー[私の ユーザー名] \のAppData

private string AddCustomMetaData(string guid, int companyID, string filePath) 
{ 
    try 
    { 
     PdfReader reader = new PdfReader(filePath); 

     using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) 
     { 
      PdfStamper st = new PdfStamper(reader, fs); 
      Dictionary<string, string> info = reader.Info; 
      info.Add("Guid", guid); 
      info.Add("CompanyID", companyID.ToString()); 

      st.MoreInfo = info; 
      st.Close(); 
     } 

     reader.Close(); 

     return guid; 
    } 
    catch (Exception e) 
    { 
     return e.Message; 
    } 
} 

は、どんなに私がしようとするもの、それは、より正確には、st.Close();で例外を投げ続けるん\ Local \ Temp \ 53b96eaf-74a6-49d7-a715-6c2e866a63c3.pdf ' 他のプロセスで使用されているためです。

明らかに何かが見落とされているか、またはPdfStamperクラスに問題があります。私はまだ気づいていません。使用されるitextsharpのバージョンは5.3.3.0と5.4.0.0ですが、問題は同じです。

洞察力があれば幸いです。

EDIT:私は現在、この問題を「コーディング」していますが、解決策は見つかりませんでした。

+1

pdfリーダーが開く前にファイルが使用されていないことを確認してください。 (これ以前にこのファイルを使って何をやっていたのか) – Sayse

+0

ファイルの順番を入れ替えるほうが良いです( 'filestream'の前に 'pdf reader') – Sayse

答えて

15

問題があるのは、読んでいる間にファイルに書き込んでいるということです。すべてのデータをメモリにロードするいくつかのファイルタイプ(JPG、PNGなど)とは異なり、iTextSharpはそのデータをストリームとして読み込みます。 2つのファイルを使用して、最後にそれらを入れ替えるか、またはPdfReaderをファイルのバイト配列にバインドして、iTextSharpに最初のファイルを強制的にロードさせることができます。

PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath)); 
+1

私はこの解決策を数時間探してきました。完璧に動作します! – Baxter

0

初めてファイルを保存するとき、私はあなたがファイルを開いたときにFileShare enumeratorを使用するので、試してみてくださいすることをお勧め

+0

これは私の手の届かないものです。 Webサービスは、ファイルパスを受け入れるActiveX dllを呼び出します。最初の書き込み操作は私のコントロール外です。 –

1

あなたのPDFリーダー(またはものは何でもあなたはそれを作成するために使用))(.Disposeに試してみてくださいNone sharing

File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None); 
+0

すでに試したことがありますが、まだ問題は残っています。 –

+0

大丈夫だけど変だ –

0

でファイルを開くあなたはあなたのためにその実現可能だと思う場合は、このソリューションを試してみる - WebMethod属性は、Tempフォルダにファイルを作成したら、ファイルをコピーして、別のと、他の場所や、同じ場所に貼り付けする必要があります新しいコピーしたファイルパスをPDFリーダーに渡します。

+0

はい、それは理由がこの問題の理由を説明していません –

関連する問題