2016-09-06 19 views
0

ファイルを2回読み込もうとしていて、タイトルにエラーが表示されています。コードは最初にエラーなしでファイルを読み込みますが、別の方法で同じファイルを再度読み取ろうとすると、PDFヘッダーの署名が見つかりません。エラー。エラーなしでファイルを2回読むにはどうすればよいですか?ありがとう。ここで「PDFヘッダー署名が見つかりません」 Cで同じファイルを2回読む#

public ActionResult Function(HttpPostedFileBase file, string l) 
{ 
    try 
    { 
     var file2 = file; 

     var ef = reader.ExtractReport(file.InputStream); 
     var ef2 = reader.ExtractReportMultiple(file2.InputStream); 
     //if (ef == null) 

     _is = reader.ReadReport(ef, _is, out warning); 
    } 
    catch(Exception e){} 
} 

私の抽出、レポートメソッドです:

public ExcelFile ExtractReport(Stream file) 
{ 
    var f = new SautinSoft.PdfFocus { Serial = "1234567890" }; 
    f.OpenPdf(file); 
    f.ExcelOptions.SingleSheet = true; 
    if (f.PageCount <= 0) return null; 
    var xls = f.ToExcel(); 
    if (xls == null) return null; 

    var stream = new MemoryStream(xls); 
    ExcelFile ef = ExcelFile.Load(stream, LoadOptions.XlsDefault); 

    //var definedIndex = 10; 
    //var columnSize = ef.Worksheets[0].GetUsedCellRange(true).LastColumnIndex; 

    file.Close(); 
    f.ClosePdf(); 

    return ef; 
} 

public ExcelFile ExtractReportMultiple(Stream file) 
{ 
    var f = new SautinSoft.PdfFocus { Serial = "1234567890" }; 
    f.OpenPdf(file); 
    //f.ExcelOptions.SingleSheet = true; 
    if (f.PageCount <= 0) return null; 
    var xls = f.ToExcel(); 
    if (xls == null) return null; 

    var stream = new MemoryStream(xls); 
    ExcelFile ef = ExcelFile.Load(stream, LoadOptions.XlsDefault); 

    //var definedIndex = 10; 
    //var columnSize = ef.Worksheets[0].GetUsedCellRange(true).LastColumnIndex; 

    file.Close(); 
    f.ClosePdf(); 

    return ef; 
} 
+0

最初の後に 'Stream.Position'を0に設定してみてくださいストリームの使用。 *ストリームは、ストリームをシークできるかどうかを判断するためにCanSeekプロパティを使用します。*ストリームを 'MemoryStream'またはファイルにコピーし、そのコピーにアクセスします。さらに、ストリームを 'Extract *'メソッドではなく、呼び出しメソッドで 'Close 'しないでください。 – mkl

答えて

1

ExtractReportへの呼び出しは、ストリームの終わりに向かって現在の 『位置「はそのシフトを、sのコンテンツ』 InputStreamを読み込みます。同じストリームをもう一度読むには、最初にPositionをリセットする必要があります。したがって、これはうまくいくかもしれない:

var ef = reader.ExtractReport(file.InputStream); 
file.InputStream.Position = 0; 
var ef2 = reader.ExtractReportMultiple(file2.InputStream); 

をしかし、それはか動作しませんでしょうか戻って先頭に求めることをInputStreamオブジェクトや能力の実際のタイプに依存します。 CanSeekプロパティも参照してください。あなたの唯一の選択肢は、ストリームのコンテンツのコピーを作成してコピーで作業することです(byte[]MemoryStreamインスタンスを使用するなど)

関連する問題