使用iTextSharp确定PDF方向.c# . net
本文关键字:net 方向 PDF iTextSharp 确定 使用 | 更新日期: 2023-09-27 18:12:46
我在c# Windows应用程序中使用iTextSharp来操作扫描的肖像PDF发票文件。扫描文件后,我想自动检查(估计)页面上文本的方向(用户可能已经扫描颠倒)。
发票来自不同的供应商,所以我无法搜索标准文本或图像。
我在想,如果我可以裁剪PDF页面在两个(顶部和底部),并创建两个新的PDF文件,然后我可以比较两个文件的大小。最大的文件可能是页面的顶部。如果需要的话,我可以旋转(我知道怎么做)页面。
感谢更新-我找到了一种方法将页面分成两半,但不幸的是,创建的2个文件大小相同(即使上半部分有更多的文本和图像):
private void TrimDocument()
{
//derived from http://www.namedquery.com/cropping-pdf-using-itextsharp
PdfReader pdfReader = new PdfReader("C:/Docman/RawScans/PDFWeightedTop.pdf");
PdfRectangle rect = new PdfRectangle(0, pdfReader.GetPageSizeWithRotation(1).Height / 2, pdfReader.GetPageSizeWithRotation(1).Width, pdfReader.GetPageSizeWithRotation(1).Height); //Top
//***PdfRectangle rect = new PdfRectangle(0, 0, pdfReader.GetPageSizeWithRotation(1).Width, pdfReader.GetPageSizeWithRotation(1).Height/2); //Bottom
//***FileStream output = new FileStream("C:/Docman/Matched/top.pdf", FileMode.Create);
FileStream output = new FileStream("C:/Docman/Matched/bottom.pdf", FileMode.Create);
Document doc = new Document(PageSize.A4);
//Make a copy of the document
PdfSmartCopy smartCopy = new PdfSmartCopy(doc, output);
doc.Open();
var page = pdfReader.GetPageN(1);
page.Put(PdfName.CROPBOX, rect);
page.Put(PdfName.MEDIABOX, rect);
var copiedPage = smartCopy.GetImportedPage(pdfReader, 1);
smartCopy.AddPage(copiedPage);
doc.Close();
}
在我的脑海中,有几种方法可以用来确定文档的方向,每种方法在效率、准确性和工作量/成本方面都有自己的优缺点。
- 使用OCR包,如Tesseract或Cuneiform,在一个方向上扫描页面,然后再次旋转180度。由于OCR包将只检测方向正确的文本,因此捕获更多文本的方向就是正确的方向。这种方法可能不是最有效的,但它可能是最准确的。还有许多其他的OCR包,请参考维基百科。
- 通过iTextSharp.text.Image.RawData属性暴露PDF文档中的jpeg内容,将其转换为单色,然后使用各种评分函数来评估较大油墨密度的区域。你需要在这里进行实验,但首先想到的是检测发票上的标题/标志,因为它们很可能在顶部,并且比底部密度更大。另一个想法是,也许总是有一个页脚,条形码,或跟踪号码,你可以在任何方向扫描页面的那一部分。它的存在可以作为一个标志。
- 你可以使用像素差技术,并建立一个复合蒙版(图像)的所有文档,你知道有正确的方向,并使用该蒙版执行一个位异或与你未知的图像,再次与相反的方向,并比较在每个黑色像素的总和。理论是,未知图像将在已知图像的领域,如果它是正确的定向应该有很少的差异,但如果定向不正确将有很多差异。
- 如果你有一个已知的发票域,你可以检测每个发票的特征,表明它的方向,类似于自动售货机如何检测你插入的账单类型。
- Mechanical Turk:)
- 以上的一些组合。
祝你好运,让我们知道你的进展!