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

前端 未结 3 1712
既然无缘
既然无缘 2021-01-18 15:19

\"enter

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

I\'m usin

相关标签:
3条回答
  • 2021-01-18 15:46

    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();
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-18 16:03

    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();
        }
    }
    
    0 讨论(0)
  • 2021-01-18 16:04

    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();
                }
    
    0 讨论(0)
提交回复
热议问题