【问题标题】:Insert an Image in PDF using ITextSharp使用 ITextSharp 在 PDF 中插入图像
【发布时间】:2025-12-20 12:20:21
【问题描述】:

我必须在 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 );

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

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

【问题讨论】:

    标签: itextsharp


    【解决方案1】:

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

    【讨论】:

    • 感谢克里斯的意见。我会试试这个。
    【解决方案2】:

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

    其实LocationalResult这个列表是一个私有列表,我把它公开了,可以从外面访问。
    我遍历 PDF 文档的每一页并调用PdfTextExtractor.GetTextFromPage(reader, i, locationStrat);,其中i 是页码。此时页面中的所有文本将与所有位置信息一起添加到LocationalResult。 这就是我所做的。而且效果很好。

    【讨论】: