这似乎是一个常见问题,但经过长时间的搜索,我还没有找到适合我需要的解决方案。我正在使用 itextsharp 填写我创建字节数组的 pdf 表单。(我将同一表格的多个页面包含相同的信息合并到一个 pdf 文档中)。我可以毫无问题地做到这一点,问题是当我向用户显示最终的 pdf 文档时,我需要在不同的窗口或选项卡中打开它,而无需先提示用户保存或打开文件。我也不想在服务器上保存文件并使用文件流重新打开它。如果我将内容配置更改为“内联”,则 pdf 将显示在同一浏览器窗口中。这会产生问题,因为用户必须单击浏览器后退按钮才能导航回重新启动表单提交过程的站点。就目前而言,我的代码成功生成了 pdf 并提示他们打开或保存它。这是我需要删除的步骤。我似乎记得一些在新选项卡或窗口中打开 pdf 的 java 片段,但我未能成功复制/找到它。我也玩过不同的头球,但我碰壁了。任何帮助将不胜感激。
(在必要的数据验证后,我通过单击按钮调用下面代码的 go 方法。)
private void go()
{
List<byte[]> pdfs = new List<byte[]>();
while (PageNumber <= Convert.ToInt32(PageCountLabel.Text))
{
pdfs.Add(PopulatePDF());
}
MemoryStream ms = MergePDFs(pdfs);
//opens pdf in new tab after save/open option
Response.AddHeader("Content-Disposition", "attachment; filename=TheDocument.pdf");
Response.ContentType = "application/pdf";
Response.BinaryWrite(ms.ToArray());
Response.End();
}
//************fills in pdf form****************//
private byte[] PopulatePDF()
{
MemoryStream ms = new MemoryStream();
PdfStamper Stamper = null;
PdfReader Reader = new PdfReader(Server.MapPath("~/PDFTemplates/template1.pdf"));
try
{
string temp = Profile.ToString().ToUpper();
PdfCopyFields Copier = new PdfCopyFields(ms);
Copier.AddDocument(Reader);
Copier.Close();
PdfReader docReader = new PdfReader(ms.ToArray());
ms = new MemoryStream();
Stamper = new PdfStamper(docReader, ms);
AcroFields Fields = Stamper.AcroFields;
//fill form fields here
PageNumber++;
Stamper.FormFlattening = true;
}
finally
{
if (Stamper != null)
{
Stamper.Close();
}
}
return ms.ToArray();
}
//combines pdf pages into single document
private MemoryStream MergePDFs(List<byte[]> pdfs)
{
MemoryStream ms = new MemoryStream();
PdfCopyFields Copier = new PdfCopyFields(ms);
foreach (var pdf in pdfs)
Copier.AddDocument(new PdfReader(pdf));
Copier.Close();
return ms;
}