Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can i set an image to a pdf field in existing pdf file?

Tags:

c#

itextsharp

enter image description here

How can i set an image to a pdf field in existing pdf file?

I'm using the iTextSharp object.

Setting the text field is working fine. No problem in it.

   pdfFormFields.SetField("Firstname", "Mujeeb");

Please help.

like image 766
Mujeeb Farooqi Avatar asked Dec 28 '11 13:12

Mujeeb Farooqi


People also ask

How do I populate a field in PDF?

Open your PDF form in Adobe Acrobat Pro, choose Prepare Form > Fields and name the field(s) that you need the information to be copied to EXACTLY like the field where the information will be copied from. The system will then mark it with a “#” sign which means that fields are auto-populated. Step 2. Save changes.

How do I embed an object in a PDF?

To attach a file, go to Insert > Attach File in PDF. To embed a file, go to Insert > Embed File in PDF. Browse to and select the file that you want to insert, and click Select on the Select File dialog.

How do I add scans to existing PDF?

Using the Insert Pages feature, pages from an existing PDF document or a scanner can be inserted into the current PDF document. Open your PDF document. Right-click in the PDF, and select Insert Pages from the right-click menu.


2 Answers

To the best of my knowledge you can't technically set a standard PDF field as an image (although you might be able to do this with XFA).

The workaround, however, is to just create a standard iTextSharp image and scale it to the form field's dimensions and place it where the field is.

Below is a full working C# 2010 WinForms app targeting iTextSharp 5.1.1.0 that shows how to do this. It starts by creating a very simple PDF with a single form field on it called "firstName". The second part of the program then gets the position and dimensions of that field and places an image there scaled appropriately. See the comments in the code for further details.

using System;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string baseFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "StartFile.pdf");
            string secondFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "SecondFile.pdf");
            string TestImage = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.jpg");

            //Create a very simple PDF with a single form field called "firstName"
            using (FileStream fs = new FileStream(baseFile, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                using (Document doc = new Document(PageSize.LETTER))
                {
                    using (PdfWriter writer = PdfWriter.GetInstance(doc, fs))
                    {
                        doc.Open();
                        writer.AddAnnotation(new TextField(writer, new iTextSharp.text.Rectangle(0, 0, 100, 100), "firstName").GetTextField());
                        doc.Close();
                    }
                }
            }


            //Create a second file "filling out" the form above
            using (FileStream fs = new FileStream(secondFile, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                using (PdfStamper stamper = new PdfStamper(new PdfReader(baseFile), fs))
                {
                    //GetFieldPositions returns an array of field positions if you are using 5.0 or greater
                    //This line does a lot and should really be broken up for null-checking
                    iTextSharp.text.Rectangle rect = stamper.AcroFields.GetFieldPositions("firstName")[0].position;
                    //Create an image
                    iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(TestImage);
                    //Scale it
                    img.ScaleAbsolute(rect.Width, rect.Height);
                    //Position it
                    img.SetAbsolutePosition(rect.Left, rect.Bottom);
                    //Add it to page 1 of the document
                    stamper.GetOverContent(1).AddImage(img);
                    stamper.Close();
                }
            }

            this.Close();
        }
    }
}
like image 21
Chris Haas Avatar answered Oct 01 '22 11:10

Chris Haas


Remove the Text field and replace it with a Pushbutton field of the same size and position. If you set the Pushbutton to READ_ONLY then it can't be pressed and it will look like a static image. This keeps the image you're trying to add as a field annotation instead of adding it to the page content.

void ConvertTextFieldToImage(string inputFile, string fieldName, string imageFile, string outputFile)
{
    using (PdfStamper stamper = new PdfStamper(new PdfReader(inputFile), File.Create(outputFile)))
    {
        AcroFields.FieldPosition fieldPosition = stamper.AcroFields.GetFieldPositions(fieldName)[0];

        PushbuttonField imageField = new PushbuttonField(stamper.Writer, fieldPosition.position, fieldName);
        imageField.Layout = PushbuttonField.LAYOUT_ICON_ONLY;
        imageField.Image = iTextSharp.text.Image.GetInstance(imageFile);
        imageField.ScaleIcon = PushbuttonField.SCALE_ICON_ALWAYS;
        imageField.ProportionalIcon = false;
        imageField.Options = BaseField.READ_ONLY;

        stamper.AcroFields.RemoveField(fieldName);
        stamper.AddAnnotation(imageField.Field, fieldPosition.page);

        stamper.Close();
    }
}
like image 128
Mathew Leger Avatar answered Oct 01 '22 11:10

Mathew Leger