6

私のWebメソッドは、%temp%フォルダーにPDFファイルを作成します。これは機能します。次に、以下のコードを使用して、そのファイルにいくつかのカスタムフィールド(メタ)を追加します。

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

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();正確には、で例外をスローし続けます。

別のプロセスで使用されているため、プロセスはファイル'C:\ Users [my username] \ AppData \ Local \ Temp\53b96eaf-74a6-49d7-a715-6c2e866a63c3.pdf'にアクセスできません。

明らかな何かを見落としているかPdfStamper、まだ気付いていないクラスに問題があります。使用されるitexsharpのバージョンは5.3.3.0と5.4.0.0で、問題は同じです。

任意の洞察をいただければ幸いです。

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

4

4 に答える 4

20

あなたの問題は、あなたがファイルからも読んでいる間にあなたがファイルに書いているということです。すべてのデータをメモリに「ロード」する一部のファイルタイプ(JPG、PNGなど)とは異なり、iTextSharpはデータをストリームとして読み取ります。PdfReader2つのファイルを使用して最後にそれらを交換する必要があるか、ファイルのバイト配列にバインドすることにより、iTextSharpに最初のファイルを「ロード」させることができます。

PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath));
于 2013-03-26T13:56:40.043 に答える
1

ファイルを開くときにを使用することをお勧めしますFileShare enumeratorので、でファイルを開いてみてくださいNone sharing

   File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
于 2013-03-25T14:53:44.333 に答える
0

初めてファイルを保存するときは、PDFリーダー(またはPDFリーダーの作成に使用するもの)を.Dispose()してみてください。

于 2013-03-25T14:51:09.987 に答える
0

実行可能と思われる場合は、このソリューションを試してください-webmethodがTempフォルダーにファイルを作成したら、ファイルをコピーして別の場所または同じ場所に別の名前で貼り付け、新しくコピーしたファイルパスをPDFリーダーに渡す必要があります。

于 2013-03-25T15:34:12.013 に答える