Вставьте изображение в PDF с помощью ITextSharp - PullRequest
3 голосов
/ 19 августа 2011

Я должен вставить изображение в 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 всегда равна нулю, даже если в файле PDF есть слово «Подпись».

Любой вход ..? :) Джалил

Ответы [ 2 ]

2 голосов
/ 19 августа 2011

Проверьте PdfTextExtractor и, в частности, LocationTextExtractionStrategy.Создайте класс в своем проекте с точным кодом для LocationTextExtractionStrategy и поместите точку останова в строку return sb.ToString(); (строка 131 в SVN) и посмотрите на содержимое переменной locationalResult.Вы увидите в точности то, что ищете, набор текста с начальным и конечным местоположением.Если ваше поисковое слово не находится на одной строке, вам, возможно, придется копать немного глубже, но это должно указать вам правильное направление.

1 голос
/ 22 сентября 2011

Это был идеальный Крис.Я могу найти текстовую позицию и вставить подпись.Я понял, что в классе LocationTextExtractionStrategy есть список List<TextChunk> LocationalResult.Метод RenderText() в LocationTextExtractionStrategy добавляет каждый текст в список LocationalResult.

На самом деле список LocationalResult является личным списком, я сделал его общедоступным, чтобы получить к нему доступ извне.
Я перебираю каждую страницу документа PDF и вызываю PdfTextExtractor.GetTextFromPage(reader, i, locationStrat);, где i - номер страницы,В это время весь текст на странице будет добавлен в LocationalResult со всей информацией о местоположении.Это то, что я сделал.И это прекрасно работает.

...