2011-08-18 102 views
3

我必须在pdf中插入图像。也就是说,无论我在哪里看到“签名”文本,都必须在其中插入签名图像。我可以说绝对的立场。 但是,我正在寻找如何在pdf中找到单词'签名'的位置并插入图像。使用ITextSharp在PDF中插入图像

感谢您的帮助!

这是工作代码:

using (Stream inputImageStream = new FileStream(@"C:\signature.jpeg", FileMode.Open, FileAccess.Read, FileShare.Read)) 
    using (Stream outputPdfStream = new FileStream(@"C:\test\1282011\Result.pdf", FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 

     var reader = new PdfReader(@"C:\Test\1282011\Input.pdf"); 
     var stamper = new PdfStamper(reader, outputPdfStream); 
     var count = reader.NumberOfPages; 



     iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(inputImageStream); 
     image.SetAbsolutePosition(300, 200); // Absolute position 
     image.ScaleToFit(200, 30); 

     PRTokeniser pkt = null; 
     string strpages = string.Empty; 
     System.Text.StringBuilder build = new System.Text.StringBuilder(); 


     for (int i = 1; i <= count; i++) 
     { 
      var pdfContentByte = stamper.GetOverContent(i); 
      if (pdfContentByte != null) 
      { 
       pkt = new PRTokeniser(stamper.Reader.GetPageContent(i)); 
       while (pkt.NextToken()) 
       { 
        if (pkt.TokenType == PRTokeniser.TokType.STRING) 
        { 
         if (pkt.StringValue == "Signature") 
         { 
          pdfContentByte.AddImage(image); 
         } 

        } 

       } 
      } 
     } 
     stamper.Close(); 


    } 
} 

一些google搜索后,我发现我可以文本的绝对位置如下:

extSharp.text.pdf.AcroFields fields = stamper.AcroFields; 
       IList<iTextSharp.text.pdf.AcroFields.FieldPosition> signatureArea = fields.GetFieldPositions("Signature"); 
       iTextSharp.text.Rectangle rect= signatureArea.First().position; 
       iTextSharp.text.Rectangle logoRect = new iTextSharp.text.Rectangle(rect); 
       image.SetAbsolutePosition(logoRect.Width ,logoRect .Height); 

但变量,signatureArea为空所有的即使pdf包含“签名”一词也是如此。

任何输入..? :) Jaleel

回答

2

退房PdfTextExtractor,特别是LocationTextExtractionStrategy。在你的项目中用LocationTextExtractionStrategy的确切代码创建一个类,并在return sb.ToString();(SVN中的第131行)处放置一个断点,并查看变量locationalResult的内容。你会看到你正在寻找的东西,包括开始和结束位置的文本集合。如果您的搜索词本身不在一行,您可能需要深入一点,但这应该指向正确的方向。

+0

谢谢克里斯的输入。我会试试这个。 – Jaleel

1

这是完美的克里斯。我能够找到文本位置并插入签名。我所理解的是,在LocationTextExtractionStrategy类中有一个列表List<TextChunk> LocationalResult。在LocationTextExtractionStrategy中的RenderText()方法会将每个文本添加到LocationalResult列表中。

其实清单LocationalResult是一个私人清单,我公开从外部访问它。
我循环浏览PDF文档的每一页,并致电PdfTextExtractor.GetTextFromPage(reader, i, locationStrat);,其中i是页码。此时页面中的所有文字都将被添加到LocationalResult的所有位置信息中。 这就是我所做的。它工作完美。

相关问题