"找不到PDF标题签名。"两次在C#中读取同一个文件

时间:2016-09-06 08:36:42

标签: c# pdf

我试图读取文件两次,并且我在标题中收到错误。代码首次读取文件时没有错误,但是当我尝试再次使用其他方法读取同一文件时,我得到未找到PDF标题签名。错误。如何在没有错误的情况下两次读取文件?感谢。

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;
 }

1 个答案:

答案 0 :(得分:1)

ExtractReport的调用会读取InputStream的内容,从而将其“当前”位置转移到流的末尾。您必须将Position重置为开头才能再次读取相同的流。因此,这可能有效:

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

但是,它是否会起作用取决于InputStream对象的实际类型及其寻找开头的能力。另请参见CanSeek属性。如果不可能,您唯一的选择是创建流内容的副本并处理副本(例如,使用byte[]上的MemoryStream实例)