2016-11-04 20 views
2

私のコードに何が問題なのですか教えてください。 PDFをマージするために使用しています。メモリストリームを作成してPDFに出力します。それは私のために正常に動作しますが、一部のユーザーはIEでファイルをダウンロード、またはChromeでネットワークエラーを取得することはできません。MemoryStream - PDFをマージするときに閉じたストリームにアクセスできない

enter image description here

public static MemoryStream MergePdfForms(List<byte[]> files) 
    { 
     if (files.Count > 1) 
     { 
      PdfReader pdfFile; 
      Document doc; 
      PdfWriter pCopy; 
      MemoryStream msOutput = new MemoryStream(); 

      pdfFile = new PdfReader(files[0]); 

      doc = new Document(); 
      pCopy = new PdfSmartCopy(doc, msOutput); 

      doc.Open(); 

      for (int k = 0; k < files.Count; k++) 
      { 
       pdfFile = new PdfReader(files[k]); 
       for (int i = 1; i < pdfFile.NumberOfPages + 1; i++) 
       { 
        ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i)); 
       } 
       pCopy.FreeReader(pdfFile); 
      } 

      pdfFile.Close(); 
      pCopy.Close(); 
      doc.Close(); 

      return msOutput; 
     } 
     else if (files.Count == 1) 
     { 
      return new MemoryStream(files[0]); 
     } 

     return null; 
    } 

デバッグした後、私はメモリストリームmsOutputは多少の誤差があることに気付きました

どうしたのですか?それを避ける方法は?

ありがとうございます。

+0

彼らのドキュメントで確認を見つけるのは難しいが、あなたがオブジェクトにストリームをラップする場合、通常は、それはまた、ラップストリームを閉じ、そのオブジェクトを閉じます。 'pCopy = new PdfSmartCopy(doc、msOutput);'は 'pCopy'に' msOutput'をラップし、 'msOutput'を(おそらく)閉じた' pCopy.Close() 'を呼び出すと、その閉じたストリームを返します。 – Quantic

+0

混乱を招くのは、「一部のユーザー」がこの問題を抱えているということです。 'msOutput'処分の問題なら、* all *ユーザは問題を抱えているでしょう。 –

+0

はい、これは私にとっても紛らわしいものでした。私はこのようなファイルをダウンロードした場合:Response.BinaryWrite(ms.ToArray();)、それはうまく動作しますが、いくつかのユーザーに問題があります。 );エラーが発生しました:クローズドストリームにアクセスできない – Peter

答えて

0

CloseStreamfalseに設定します。それ以外の場合は、pCopy.Close()に電話すると出力ストリームが閉じられます。

pCopy = new PdfSmartCopy(doc, msOutput) { CloseStream = false }; 

説明

私はそう、私は直接ソースコードを見ていたインターネット上の文書を発見しました。ここで

PdfSmartCopyクラスの宣言です:ここで

public class PdfSmartCopy : PdfCopy 
{ 
    // ... 

    public PdfSmartCopy(Document document, Stream os) : base(document, os) { 
     // ... 
    } 

    // ... 
} 

PdfCopyクラスの宣言です:PdfWriterクラスの

public class PdfCopy : PdfWriter 
{ 
    // ... 

    public PdfCopy(Document document, Stream os) : base(new PdfDocument(), os)  { 
     // ... 
    } 

    // ... 
} 

宣言:

public class PdfWriter : DocWriter, 
    IPdfViewerPreferences, 
    IPdfEncryptionSettings, 
    IPdfVersion, 
    IPdfDocumentActions, 
    IPdfPageActions, 
    IPdfIsoConformance, 
    IPdfRunDirection, 
    IPdfAnnotations 
{ 
    // ... 

    protected PdfWriter(PdfDocument document, Stream os) : base(document, os) { 
     // ... 
    } 

    // ... 
} 

そして、最後に、01の宣言クラス:

public abstract class DocWriter : IDocListener 
{ 
    // ... 

    // default value is true 
    protected bool closeStream = true; 

    public virtual bool CloseStream { 
     get { 
      return closeStream; 
     } 
     set { 
      closeStream = value; 
     } 
    } 

    protected DocWriter(Document document, Stream os) 
    { 
     this.document = document; 
     this.os = new OutputStreamCounter(os); 
    } 

    public virtual void Close() { 
     open = false; 
     os.Flush(); 
     if (closeStream) // <-- Take a look at this line 
      os.Close(); 
    } 

    // ... 
} 
+0

ドキュメントがありませんdeveloper.itextpdf.comでさえないですか? –

+0

@AmedeeVanGasse既にJava APIのリファレンスページがありますが、 .NETラッパー用ではありません。 –

+0

あなたは正しい@AmedeeVanGasseです。Matiasは冗談を言っています。私はちょうどほぼ同じ質問に昨日答えました:http://stackoverflow.com/questions/40401695/ –

関連する問題