Raquel
Raquel

Reputation: 1

itextsharp form name and saving pdf

I am using itextsharp in ASP.NET. We populate a PDF with fields that are taken from one of our online forms. I need to change the way we handle the documents - we need to be able to use some of the fields as the name of the document(firstname-lastname.pdf), and to save that PDF into a directory. Here is the code I am using now:

    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();
        }

Upvotes: 0

Views: 468

Answers (1)

Chris Haas
Chris Haas

Reputation: 55417

PdfStamper and PdfWriter both use the generic Stream class so instead of Response.OutputStream you can use a FileStream or a MemoryStream

This example writes directly to disk. Set testFile to whatever you want, I'm using the desktop here

//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
}

This next example is my preferred method. It creates a MemoryStream, then creates a PDF inside of it and finally grabs the raw bytes. Once you've got raw bytes you can both write them to disk AND Response.BinaryWrite() then.

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);

Upvotes: 1

Related Questions