我正在尝试从asp.net C#应用程序动态生成pdf表单。生成表单并通过电子邮件发送给某些用户。几个月以来,人们已经能够在Adobe Reader上打开它了。
最近,有人要求用户能够在手机上阅读这些pdf附件。不幸的是,当这些人尝试在他们的手机上打开pdf时,它会说“打开文档时出错。”
我尝试在我的wp7手机上打开原始表格,但它确实有效。
我发送了一份不适用于免费pdf /验证服务的pdf副本。该服务返回时显示以下消息:
无法加载文件:错误的'startxref'参考
这让我觉得问题是Adobe Reader在打开时正在重建文档中的一些元数据/索引。由于大多数人拥有快速机器,因此重建这些指数所花费的时间可以忽略不计。但据我所知,手机版本没有此功能,所以它正在读取xstartref并失败。
以下是我的应用程序中的代码,它似乎产生了损坏的文件:
File.Copy(original, newpath);
FileStream fs = new FileStream(newpath, FileMode.Open);
PdfReader r = new PdfReader(fs);
PdfStamper stamper = new PdfStamper(r, fs);
AcroFields af = stamper.AcroFields;
af.SetField("Event", ef.eName); af.SetField("EventType", ef.EventType);
af.SetField("eStartDate", ef.eStartDate);
af.SetField("eStartTime",ef.eStartTime);
stamper.FormFlattening = true;
stamper.FreeTextFlattening = true;
stamper.Close();
r.Close();
fs.Close();
我做错了什么?我已经读过没有正确关闭流,压模和pdfreader的地方会造成麻烦。但我认为我正在关闭它。我在俯瞰什么?
答案 0 :(得分:1)
您应该将PdfReader
绑定到源文档,将PdfStamper
绑定到目标文档。
//Get rid of the below line completely
//File.Copy(original, newpath);
FileStream fs = new FileStream(newpath, FileMode.Open);
PdfReader r = new PdfReader(original);
PdfStamper stamper = new PdfStamper(r, fs);
否则你在写文件时正在阅读文件,这不是一个好主意。