gpt4 book ai didi

c# - 我怎样才能得到段落开头的首字母?

转载 作者:太空宇宙 更新时间:2023-11-03 15:46:34 25 4
gpt4 key购买 nike

我正在尝试使用 iTextSharp 从 PDF 文档中提取文本。在下面的示例中,我感兴趣的文本出现在“简介”标题下方:

enter image description here

我有数百个包含此“简介”页面的 PDF 文档,通常位于文档的第五页或第六页。段落始终以首字母开头,例如示例中“Physical”中的大 P。

在以下代码中,我扫描文档以找到以文本“简介”开头的页面,然后提取文本直到下一个标题(“第 1 章”):

private static string GetIntroductionText( string filePath )
{
using ( var reader = new PdfReader( filePath ) )
{
var appending = false;
var introText = new StringBuilder();

for ( var i = 1; i <= reader.NumberOfPages; i++ )
{
var pageText = PdfTextExtractor.GetTextFromPage( reader, i );

if ( pageText.Trim().StartsWith( "Introduction" ) )
{
appending = true;
}

if ( pageText.Trim().StartsWith( "Chapter" ) )
{
break;
}

if ( appending )
{
introText.Append( pageText );
}
}

return introText.ToString();
}
}

问题是它不提取首字母,即“Physical”中的 P。所以文本是:

hysical reality is consistent with universal laws. Where the laws do not operate, there is no reality. All of this...is unreal.

如何获取文本开头的首字母?

我认为它可能涉及像这样使用 LocationTextExtractionStrategy:

var pageText = PdfTextExtractor.GetTextFromPage( reader, i, new LocationTextExtractionStrategy() );

不幸的是,这产生了相同的结果。

最佳答案

作为记录,这是我在查看 iText 源代码(特别是 LocationTextExtractionStrategy class )后解决此问题的方法。请记住,(0, 0) 坐标位于页面的左下角,而不是左上角。

public class ChunkExtractionStrategy : ITextExtractionStrategy
{
public List<Chunk> Chunks = new List<Chunk>();

public void BeginTextBlock()
{}

public void EndTextBlock()
{}

public string GetResultantText()
{
var text = new StringBuilder();

Chunks.Sort();

Chunk prevChunk = null;

foreach ( var chunk in Chunks )
{
if ( prevChunk == null && string.IsNullOrWhiteSpace( chunk.Text ) )
{
// blank space at beginning of page
continue;
}

if ( prevChunk != null && !chunk.SameLine( prevChunk, 20 ) )
{
text.Append( "\n\n" );
}

text.Append( chunk.Text );

prevChunk = chunk;
}

return text.ToString();
}

public void RenderImage( ImageRenderInfo renderInfo )
{}

public void RenderText( TextRenderInfo renderInfo )
{
Chunks.Add( new Chunk
{
TopLeft = renderInfo.GetAscentLine().GetStartPoint(),
BottomRight = renderInfo.GetDescentLine().GetEndPoint(),
Text = renderInfo.GetText(),
} );
}

public class Chunk : IComparable<Chunk>
{
public Vector TopLeft { get; set; }

public Vector BottomRight { get; set; }

public string Text { get; set; }

public int CompareTo( Chunk other )
{
var y1 = (int)Math.Round( TopLeft[1] );
var y2 = (int)Math.Round( other.TopLeft[1] );

if ( y1 < y2 )
{
return 1;
}

if ( y1 > y2 )
{
return -1;
}

var x1 = (int)Math.Round( TopLeft[0] );
var x2 = (int)Math.Round( other.TopLeft[0] );

if ( x1 < x2 )
{
return -1;
}

if ( x1 > x2 )
{
return 1;
}

return 0;
}

public bool SameLine( Chunk other, int maxDiff = 0 )
{
var diff = Math.Abs( TopLeft[1] - other.TopLeft[1] );

return diff <= maxDiff;
}
}
}

起初,我尝试了类似于 this answer 的东西.但后来我发现自己覆盖了类中的所有内容,因此创建一个新的实现更有意义。

关于c# - 我怎样才能得到段落开头的首字母?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27871224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com