保存 PDF 的对话框提示,而不是保存到硬编码路径

本文关键字:保存 路径 编码 PDF 对话框 提示 | 更新日期: 2023-09-27 17:57:18

我已经成功地实现了iTextSharp.text.pdf来填充我们已经设置的PDF模板文件。目前,该文件正在自动保存到本地计算机上的特定文件夹中...但我们不希望这样,我们希望用户将填充的PDF保存到他们PC上选择的文件夹中。一旦此应用程序发布,我们不希望将任何这些文件保留在服务器上。

下面的代码创建硬编码的文件路径并填充它,但底部提示用户保存文件的部分会创建一个具有我们想要的文件名格式的 PDF,但文件始终为 20k 并且无法打开。如何更改以下代码以不在服务器上实际创建文件,而是在用户选择保存文件时将其创建到用户 pc?

using (FileStream outfile = new FileStream(outputfile, FileMode.Create))
                {
                    PdfReader rdr = new PdfReader(pdftemplate);
                    PdfStamper stm = new PdfStamper(rdr, outfile);
                    AcroFields fields = stm.AcroFields;
                    foreach (var de in rdr.AcroFields.Fields)
                    {                                                        
                        if (de.Key == "Date")
                        {
                            fields.SetField("Date", dt.Rows[0]["Form Date"].ToString());
                        }
                        if (de.Key == "Project Name")
                        {
                            fields.SetField("Project Name", dt.Rows[0]["Project Name"].ToString());
                        }
                        if (de.Key == "Contract No")
                        {
                            fields.SetField("Contract No", dt.Rows[0]["Contract Number"].ToString());
                        }
                    }
                    stm.Close();
                    rdr.Close();
                    Response.ContentType = "application/pdf";
                    Response.AddHeader("content-disposition", "attachment; filename=" + newFile);
                    Response.Write(outfile);
                    Response.End();
                }

保存 PDF 的对话框提示,而不是保存到硬编码路径

我认为您的代码的问题在于您正在使用导致 pdf 保存到服务器filestream。 使用memorystream应该可以解决此问题。 尝试这样的事情,看看是否有帮助。

Using (MemoryStream ms = new MemoryStream())
{
    PdfReader rdr = new PdfReader(pdftemplate);
    PdfStamper stm = new PdfStamper(rdr, ms);
    AcroFields fields = stm.AcroFields;
    foreach (var de in rdr.AcroFields.Fields)
    {
        if (de.Key == "Date")
        { fields.SetField("Date", dt.Rows[0]["Form Date"].ToString()); }
        if (de.Key == "Project Name")
        { fields.SetField("Project Name", dt.Rows[0]["Project Name"].ToString()); }
        if (de.Key == "Contract No")
        { fields.SetField("Contract No", dt.Rows[0]["Contract Number"].ToString()); }
    }
    stm.Close();
    rdr.Close();
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment; filename=MyFile.pdf"); 
    //To display pdf in the browser window instead of saving, change attachment to inline
    Response.BinaryWrite(ms.ToArray());
    Response.End();
}

通过将MemoryStream与 html 标头一起使用,您应该会收到保存文件的提示。