iTextSharp извлекает каждый символ и getRectangle

Я хотел бы анализировать весь PDF-символ за символом и иметь возможность получить значение ASCII, шрифт и прямоугольник этого символа в этом PDF-документе, которые я позже смогу использовать для сохранения в виде растрового изображения. Я попытался использовать PdfTextExtractor.GetTextFromPage, но это дает весь текст в PDF в виде строки.

1 ответ

Решение

Стратегии извлечения текста в комплекте с iTextSharp (в частности, LocationTextExtractionStrategy используется по умолчанию PdfTextExtractor.GetTextFromPage Перегрузка без аргумента стратегии) ​​позволяет только прямой доступ к собранному тексту, а не к позициям.

Крис Хаас MyLocationTextExtractionStrategy

@Chris Haas в своем старом ответе здесь представляет следующее расширение LocationTextExtractionStrategy

public class MyLocationTextExtractionStrategy : LocationTextExtractionStrategy {
    //Hold each coordinate
    public List<RectAndText> myPoints = new List<RectAndText>();

    //Automatically called for each chunk of text in the PDF
    public override void RenderText(TextRenderInfo renderInfo) {
        base.RenderText(renderInfo);

        //Get the bounding box for the chunk of text
        var bottomLeft = renderInfo.GetDescentLine().GetStartPoint();
        var topRight = renderInfo.GetAscentLine().GetEndPoint();

        //Create a rectangle from it
        var rect = new iTextSharp.text.Rectangle(
                                                bottomLeft[Vector.I1],
                                                bottomLeft[Vector.I2],
                                                topRight[Vector.I1],
                                                topRight[Vector.I2]
                                                );

        //Add this to our main collection
        this.myPoints.Add(new RectAndText(rect, renderInfo.GetText()));
    }
}

который использует этот вспомогательный класс

//Helper class that stores our rectangle and text
public class RectAndText {
    public iTextSharp.text.Rectangle Rect;
    public String Text;
    public RectAndText(iTextSharp.text.Rectangle rect, String text) {
        this.Rect = rect;
        this.Text = text;
    }
}

Эта стратегия делает текстовые блоки и их заключающие в них прямоугольники доступными в открытом доступе. List<RectAndText> myPoints к которому вы можете получить доступ следующим образом:

//Create an instance of our strategy
var t = new MyLocationTextExtractionStrategy();

//Parse page 1 of the document above
using (var r = new PdfReader(testFile)) {
    var ex = PdfTextExtractor.GetTextFromPage(r, 1, t);
}

//Loop through each chunk found
foreach (var p in t.myPoints) {
    Console.WriteLine(string.Format("Found text {0} at {1}x{2}", p.Text, p.Rect.Left, p.Rect.Bottom));
}

Для вашей задачи проанализировать весь PDF символ за символом и получить значение ASCII, шрифт и прямоугольник этого символа, здесь неверны только две детали:

  • возвращаемые фрагменты текста могут содержать несколько символов
  • информация о шрифте не предоставляется.

Таким образом, мы должны немного подправить это:

Новый CharLocationTextExtractionStrategy

В добавок к MyLocationTextExtractionStrategy класс CharLocationTextExtractionStrategy разбивает ввод по глифу, а также предоставляет имя шрифта:

public class CharLocationTextExtractionStrategy : LocationTextExtractionStrategy
{
    //Hold each coordinate
    public List<RectAndTextAndFont> myPoints = new List<RectAndTextAndFont>();

    //Automatically called for each chunk of text in the PDF
    public override void RenderText(TextRenderInfo wholeRenderInfo)
    {
        base.RenderText(wholeRenderInfo);

        foreach (TextRenderInfo renderInfo in wholeRenderInfo.GetCharacterRenderInfos())
        {
            //Get the bounding box for the chunk of text
            var bottomLeft = renderInfo.GetDescentLine().GetStartPoint();
            var topRight = renderInfo.GetAscentLine().GetEndPoint();

            //Create a rectangle from it
            var rect = new iTextSharp.text.Rectangle(
                                                    bottomLeft[Vector.I1],
                                                    bottomLeft[Vector.I2],
                                                    topRight[Vector.I1],
                                                    topRight[Vector.I2]
                                                    );

            //Add this to our main collection
            this.myPoints.Add(new RectAndTextAndFont(rect, renderInfo.GetText(), renderInfo.GetFont().PostscriptFontName));
        }
    }
}

//Helper class that stores our rectangle, text, and font
public class RectAndTextAndFont
{
    public iTextSharp.text.Rectangle Rect;
    public String Text;
    public String Font;
    public RectAndTextAndFont(iTextSharp.text.Rectangle rect, String text, String font)
    {
        this.Rect = rect;
        this.Text = text;
        this.Font = font;
    }
}

Используя эту стратегию, как это

CharLocationTextExtractionStrategy strategy = new CharLocationTextExtractionStrategy();

using (var pdfReader = new PdfReader(testFile))
{
    PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategy);
}

foreach (var p in strategy.myPoints)
{
    Console.WriteLine(string.Format("<{0}> in {3} at {1}x{2}", p.Text, p.Rect.Left, p.Rect.Bottom, p.Font));
}

Вы получаете информацию по символам и включая шрифт.

Другие вопросы по тегам