2011-12-28 26 views

回答

4

据我所知,您无法在技术上将标准PDF字段设置为图像(尽管您可能可以使用XFA来完成此操作)。

但是,解决方法是只创建一个标准的iTextSharp图像并将其缩放到表单域的尺寸并将其放置在该字段的位置。

以下是针对iTextSharp 5.1.1.0的完整工作的C#2010 WinForms应用程序,它显示了如何执行此操作。它首先创建一个非常简单的PDF,其上有一个名为“firstName”的单一表单字段。然后该程序的第二部分获取该字段的位置和尺寸,并将该图像放在适当的位置。有关更多详细信息,请参阅代码中的注释。

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

删除文本字段并将其替换为具有相同大小和位置的按钮字段。如果将按钮设置为READ_ONLY,则无法按下它,并且它看起来像静态图像。这会使您试图添加的图像作为字段注释而不是将其添加到页面内容中。

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

这是将图像放置在特定位置的答案。 `

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(); 
      } 
相关问题