我试图读取文件两次,并且我在标题中收到错误。代码首次读取文件时没有错误,但是当我尝试再次使用其他方法读取同一文件时,我得到未找到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;
}
答案 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
实例)