我尝试使用我在这里找到的代码
http://web.archive.org/web/20111012184438/http://alex.buayacorp.com/merge-pdf-files-with-itext-and-net.html将两个或多个PDF文件合并为一个。
我希望实现输出作为流返回并保存在客户端。我试图修改代码但没有成功。代码尝试将输出保存在服务器上,然后导致未授权访问异常。
任何人都有正确的线索吗?
private void MergePDFs()
{
DataSourceSelectArguments args = new DataSourceSelectArguments();
DataView view = (DataView)SqlDataSource1.Select(args);
DataTable table = view.ToTable();
List<PdfReader> readerList = new List<PdfReader>();
foreach (DataRow myRow in table.Rows)
{
PdfReader pdfReader = new PdfReader(Convert.ToString(myRow[0]));
readerList.Add(pdfReader);
}
Document document = new Document();
PdfCopy copy = new PdfCopy(document, Response.OutputStream);
document.Open();
foreach (PdfReader reader in readerList)
{
for (int i = 1; i <= reader.NumberOfPages; i++)
{
copy.AddPage(copy.GetImportedPage(reader, i));
}
}
document.Close();
Response.AppendHeader("content-disposition", "inline; filename=OutPut.pdf");
Response.ContentType = "application/pdf";
}
答案 0 :(得分:0)
您似乎正在使用OutputStream
将PDF字节作为文件写入服务器磁盘。这通常是您在Web应用程序中不需要的东西。在Web应用程序中,您希望将字节写入Response
对象,如iTextSharp generated PDF: How to send the pdf to the client and add a prompt?
常识会告诉你最好直接在OutputStream
的{{1}}上写字节,但经验告诉我们并非所有浏览器都能正确处理这些字节。最好先将PDF写入Response
(如Create PDF in memory instead of physical file中所述)。一旦你在内存中有了字节,那么你可以在设置正确的HTTP头之后将字节刷新到MemoryStream
对象(尤其是Response
对某些浏览器来说很重要。)
很明显,您不能在未经用户同意的情况下将字节写入客户端,例如因为
ContentLength
驱动器。)如果您希望最终用户保存PDF,则应使用以下HTTP标头:
C:
想了解更多信息?阅读How To Write Binary Files to the Browser Using ASP.NET and Visual C# .NET
额外的建议:请帮我一个忙,不要使用坏的iTextSharp示例。合并PDF是使用Response.AddHeader("Content-Disposition", "attachment; filename=yourfile.pdf");
,不和PdfCopy
完成的。下载免费电子书The Best iText Questions on StackOverflow,您将节省大量时间(1.)搜索答案和(2)避免错误答案。