itextsharp表单名称并保存pdf

时间:2014-08-19 18:29:30

标签: pdf itextsharp

我在ASP.NET中使用itextsharp。我们使用从我们的在线表单中获取的字段填充PDF。我需要改变处理文档的方式 - 我们需要能够使用某些字段作为文档的名称(firstname-lastname.pdf),并将该PDF保存到目录中。这是我现在使用的代码:

    PdfStamper ps = null;        
        DataTable dt = BindData();
        if (dt.Rows.Count > 0)
        {                
            PdfReader r = new PdfReader(new RandomAccessFileOrArray("http://www.example.com/Documents/ppd-certificate.pdf"), null);
            ps = new PdfStamper(r, Response.OutputStream);

            AcroFields af = ps.AcroFields;

            af.SetField("fullName", dt.Rows[0]["fullName"].ToString());
            af.SetField("presentationTitle", dt.Rows[0]["presentationTitle"].ToString());
            af.SetField("presenterName", dt.Rows[0]["presenterFullName"].ToString());
            af.SetField("date", Convert.ToDateTime(dt.Rows[0]["date"]).ToString("MM/dd/yyyy"));

            ps.FormFlattening = true;

            ps.Close();
        }

1 个答案:

答案 0 :(得分:1)

PdfStamperPdfWriter都使用通用Stream类,而不是Response.OutputStream,您可以使用FileStreamMemoryStream

此示例直接写入磁盘。将testFile设置为您想要的任何内容,我在这里使用桌面

//Your file path here:
var testFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf");
using (var fs = new FileStream(testFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
    PdfReader r = new PdfReader(new RandomAccessFileOrArray("http://www.example.com/Documents/ppd-certificate.pdf"), null);
    var ps = new PdfStamper(r, fs);
    //..code
}

下一个例子是我首选的方法。它创建一个MemoryStream,然后在其中创建一个PDF,最后抓取原始字节。一旦你获得了原始字节,你就可以将它们写入磁盘然后Response.BinaryWrite()

byte[] bytes;
using (var ms = new MemoryStream()) {
    PdfReader r = new PdfReader(new RandomAccessFileOrArray("http://www.example.com/Documents/ppd-certificate.pdf"), null);
    var ps = new PdfStamper(r, ms);
    //..code

    bytes = ms.ToArray();
}

//Your file path here:
var testFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf");

//Write to disk
System.IO.File.WriteAllBytes(testFile, bytes);

//Send to HTTP client
Response.BinaryWrite(bytes);