【发布时间】:2016-02-19 14:19:15
【问题描述】:
在本例中提取单词的位置时: http://www.dertour.de/static/agb/2015/sommer/DER_Deutschland_So15.pdf 使用 iTextSharp 5.5.8
我得到一些单词的“不正确”坐标。例如在第一段的第 17 行:'gehen oder im Widerspruch zur Reiseaus-' 单词左上角的 x 值为 118、217、296、350、524、587。只有第一个值似乎正确(118,208,277,320,487,540)。 'gehen' 和 'oder' 之间的空格字符右下点的 x 值为 208,这似乎是正确的,而且似乎也是单词 'oder' 的正确 x-pos。也许它与段落的填充模式有关,但我不确定我应该执行哪些操作才能获得正确的坐标。
我正在使用 LocationTextExtractionStrategy 并将单词位置计算到 300 dpi 坐标系。
public override void RenderText(TextRenderInfo renderInfo)
{
// for the provided example
// uUnit = 1
// originX = 33.862
// originY = 33.555
// dpi = 300
// above values where calculated with code:
// PdfNumber userUnit = pageDict.GetAsNumber(PdfName.USERUNIT);
// if (userUnit != null)
// {
// uUnit = userUnit.FloatValue;
// }
// Rectangle dim = reader.GetPageSize(i);
// float originX = dim.Left;
// float originY = dim.Bottom;
// calculate coordinates:
renderInfo.GetText();
LineSegment segment = renderInfo.GetBaseline();
List<TextRenderInfo> charInfo = renderInfo.GetCharacterRenderInfos().ToList();
foreach (TextRenderInfo item in charInfo)
{
LineSegment char_segment = item.GetBaseline();
int char_left = (int)Math.Round((char_segment.GetStartPoint()[0] - originX) * dpi * uUnit / 72.0f);
int char_top = (int)Math.Round((item.GetAscentLine().GetEndPoint()[1] - originY) * dpi * uUnit / 72.0f);
int char_right = (int)Math.Round((char_segment.GetEndPoint()[0] - originX) * dpi * uUnit / 72.0f);
int char_bottom = (int)Math.Round((item.GetDescentLine().GetStartPoint()[1] - originY) * dpi * uUnit / 72.0f);
}
}
【问题讨论】:
标签: pdf character-encoding itextsharp itext text-extraction