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

末鹿安然 提交于 2019-12-09 03:36:17

问题


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.


回答1:


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



回答2:


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



回答3:


This is the answer that works for placing an image in a specific location. `

    using (PdfStamper stamper = new PdfStamper(new PdfReader(fromFilePath), File.Create("toFilePath")))
            {
                AcroFields.FieldPosition fieldPosition = stamper.AcroFields.GetFieldPositions("btn1")[0];

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

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

                stamper.Close();
            }


来源:https://stackoverflow.com/questions/8656844/how-can-i-set-an-image-to-a-pdf-field-in-existing-pdf-file

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!