2011-08-18 109 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的所有位置信息中。 這就是我所做的。它工作完美。