C# 如何识别PDF顺序中的文本?
我试图用Ghostscript和Tesseract 3.0.2识别pdf格式的文本 我不能使用itextsharp,因为pdf不包含文本,只包含图像 首先,我将pdf页面转换为图像,然后尝试获取文本 在第一次测试中,我尝试将“preserve_interword_spaces”变量设置为true,以获取所有文本,但我发现表中“Articolo”列中的信息缺失。 在我尝试只获取一个类似“Consegna”的列之后,但缺少一些“/”符号。C# 如何识别PDF顺序中的文本?,c#,pdf,tesseract,pdf-conversion,text-recognition,C#,Pdf,Tesseract,Pdf Conversion,Text Recognition,我试图用Ghostscript和Tesseract 3.0.2识别pdf格式的文本 我不能使用itextsharp,因为pdf不包含文本,只包含图像 首先,我将pdf页面转换为图像,然后尝试获取文本 在第一次测试中,我尝试将“preserve_interword_spaces”变量设置为true,以获取所有文本,但我发现表中“Articolo”列中的信息缺失。 在我尝试只获取一个类似“Consegna”的列之后,但缺少一些“/”符号。 我使用了以下代码: string sDLLPath = @"
我使用了以下代码:
string sDLLPath = @".\gsdll64.dll";
GhostscriptVersionInfo gvi = new GhostscriptVersionInfo(sDLLPath);
using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
{
rasterizer.Open(path_file_pdf, gvi, false);
int dpi_x = 600;
int dpi_y = 600;
for (int i = 1; i <= rasterizer.PageCount; i++)
{
Image imgg = rasterizer.GetPage(dpi_x, dpi_y, i);
imgg.Save(".\\Temp2.png", System.Drawing.Imaging.ImageFormat.Png);
using (var tEngine = new TesseractEngine(@".\tessdata", "ita", EngineMode.Default))
{
tEngine.SetVariable("tessedit_char_whitelist", "/0123456789");
using (var img = Pix.LoadFromFile(".\\Temp2.png"))
{
Tesseract.Rect region = new Tesseract.Rect(4120, 3215, 550, 840);
using (var page = tEngine.Process(img, region, PageSegMode.SingleBlock))
{
var text = page.GetText();
Console.WriteLine(text);
Console.WriteLine(page.GetMeanConfidence());
Console.ReadKey();
}
}
}
}
}
string sDLLPath=@“\gsdll64.dll”;
GhostscriptVersionInfo gvi=新的GhostscriptVersionInfo(sDLLPath);
使用(GhostscriptRasterizer光栅化器=新的GhostscriptRasterizer())
{
打开(路径文件pdf,gvi,false);
int dpi_x=600;
int dpi_y=600;
对于(int i=1;i尝试将EngineMode设置为TesseractAndCube。它检测到的单词比另一个多
using (var engine = new TesseractEngine(@".\tessdata", "ita", EngineMode.TesseractAndCube))
{
using (var img = Pix.LoadFromFile(sourceFilePath))
{
using (var page = engine.Process(img))
{
var text = page.GetText();
}
}
}
否则,请尝试将PDF转换为XPS文件。然后,您将能够从XPS文件中提取单词。如下所示:
XpsDocument xpsDocument = new XpsDocument(pSourceDocPath, FileAccess.Read);
IXpsFixedDocumentSequenceReader fixedDocSeqReader = xpsDocument.FixedDocumentSequenceReader;
if (fixedDocSeqReader == null) return null;
const string uniStr = "UnicodeString";
const string glyphs = "Glyphs";
IXpsFixedDocumentReader document = fixedDocSeqReader.FixedDocuments[0];
FixedDocumentSequence sequence = xpsDocument.GetFixedDocumentSequence();
for (int pageCount = 0; pageCount < sequence.DocumentPaginator.PageCount; ++pageCount)
{
IXpsFixedPageReader page = document.FixedPages[pageCount];
XmlReader pageContentReader = page.XmlReader;
if (pageContentReader == null) return null;
while (pageContentReader.Read())
{
if (pageContentReader.Name != glyphs) continue;
if (!pageContentReader.HasAttributes) continue;
if (pageContentReader.GetAttribute(uniStr) != null)
{
string words = uniStr;
}
}
}
XpsDocument XpsDocument=新的XpsDocument(pSourceDocPath,FileAccess.Read);
IXpsFixedDocumentSequenceReader fixedDocSeqReader=xpsDocument.FixedDocumentSequenceReader;
if(fixedDocSeqReader==null)返回null;
常量字符串uniStr=“UnicodeString”;
常量字符串glyphs=“glyphs”;
IXpsFixedDocumentReader document=fixedDocSeqReader.FixedDocuments[0];
FixedDocumentSequence=xpsDocument.GetFixedDocumentSequence();
对于(int pageCount=0;pageCount
我希望这能有所帮助。@francesco,如果这个答案对你有所帮助,请验证一下。