2011-12-28 15 views

risposta

4

In base alle mie conoscenze, non è possibile impostare tecnicamente un campo PDF standard come immagine (sebbene sia possibile farlo con XFA).

La soluzione, tuttavia, è creare semplicemente un'immagine iTextSharp standard e ridimensionarla in base alle dimensioni del campo modulo e posizionarla dove si trova il campo.

Di seguito è un'app completa di C# 2010 WinForms che utilizza iTextSharp 5.1.1.0 che mostra come eseguire questa operazione. Inizia creando un PDF molto semplice con un singolo campo modulo chiamato "firstName". La seconda parte del programma ottiene quindi la posizione e le dimensioni di quel campo e colloca un'immagine che viene adattata in modo appropriato. Vedi i commenti nel codice per ulteriori dettagli.

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

Rimuovere il campo di testo e sostituirlo con un campo pulsante della stessa dimensione e posizione. Se si imposta il pulsante su READ_ONLY, non può essere premuto e apparirà come un'immagine statica. Ciò mantiene l'immagine che stai cercando di aggiungere come annotazione sul campo invece di aggiungerla al contenuto della pagina.

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

Questa è la risposta che funziona per posizionare un'immagine in una posizione specifica. `

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