使用iTextSharp确定PDF方向。 C#.NET

时间:2014-07-14 16:52:41

标签: c# itextsharp

我在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();
    }

1 个答案:

答案 0 :(得分:0)

我可以通过几种方式确定文档的方向,每种方法都有自己的效率,准确性和努力/成本的优缺点。

  • 使用OCR包,例如TesseractCuneiform,然后以一个方向扫描页面,然后再次旋转180.由于OCR包只会检测到正确定向的文本,无论哪个方向捕获更多文本,正确的方向。这种方法可能不是最有效的,但它可能是最准确的。还有许多其他OCR包,请咨询Wikipedia
  • 通过iTextSharp.text.Image.RawData属性将PDF格式的内容暴露在PDF文档中,将其转换为单色,然后使用各种评分函数来评估墨水密度较大的区域。您需要在此进行实验,但首先要想到的是检测发票中的标题/徽标,因为这很可能位于顶部,密度大于底部。另一个想法是,可能总是有页脚,条形码或跟踪号码,您可以在任一方向扫描页面的该部分。它的存在可以用作旗帜。
  • 您可以使用像素差异技术,并为您知道的具有正确方向的所有文档构建复合蒙版(图像),并使用该蒙版对未知图像执行按位XOR,并再次使用相反方向,比较每个黑色像素的总和。理论是未知图像将在已知图像的领域中,如果它正确定向应该有很少的差异,但如果定向不正确将有很多差异。
  • 如果您有一个已知的发票域,您可以检测到每张发票的一个功能,该功能表明其方向,类似于自动售货机检测您插入的帐单类型。
  • Mechanical Turk:)
  • 以上的一些组合。

祝你好运,让我们知道你是如何进行的!