使用ITextSharp在PDF中插入图像

时间:2011-08-18 23:12:33

标签: itextsharp

我必须在pdf中插入图像。也就是说,无论我在哪里看到文字'签名',我都必须在那里插入签名图像。我可以说绝对的立场。 但是,我正在寻找如何在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();


    }
}

经过一些谷歌搜索,我发现我可以按如下方式对文本进行绝对定位:

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 );

但即使pdf包含单词'Signature',变量signatureArea也始终为null。

任何输入..? :) 贾里尔

2 个答案:

答案 0 :(得分:2)

结帐PdfTextExtractor,特别是LocationTextExtractionStrategy。使用LocationTextExtractionStrategy的确切代码在项目中创建一个类,并在行return sb.ToString();上放置一个断点(SVN中的第131行)并查看变量locationalResult的内容。您将完全看到您正在寻找的内容,一组包含起始位置和结束位置的文本。如果您的搜索词本身不在一条线上,您可能需要更深入地挖掘,但这应该指向正确的方向。

答案 1 :(得分:1)

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

实际上,列表LocationalResult是一个私人列表,我公开从外部访问它 我遍历PDF文档的每一页并调用PdfTextExtractor.GetTextFromPage(reader, i, locationStrat);,其中i是页面编号。此时,页面中的所有文本都将添加到LocationalResult并包含所有位置信息。 这就是我所做的。它完美无缺。