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));
}
Вы получаете информацию по символам и включая шрифт.