使用iTextSharp确定PDF方向。c#net

使用iTextSharp确定PDF方向。c#net,c#,itextsharp,C#,Itextsharp,我正在c#Windows应用程序中使用iTextSharp处理扫描的纵向PDF发票文件。扫描完文件后,我想自动检查(估计)页面上文本的方向(用户可能已经扫描颠倒了) 发票来自不同的供应商,因此我无法搜索标准文本或图像 我在想,如果我可以将PDF页面裁剪成两个(顶部和底部),并创建两个新的PDF文件,那么我就可以比较这两个文件的大小。最大的文件可能位于页面顶部。如果需要,我可以旋转页面(我知道怎么做) 谢谢 更新-我找到了一种将页面一分为二的方法,但不幸的是,创建的两个文件大小相同(尽管上半部分有

我正在c#Windows应用程序中使用iTextSharp处理扫描的纵向PDF发票文件。扫描完文件后,我想自动检查(估计)页面上文本的方向(用户可能已经扫描颠倒了)

发票来自不同的供应商,因此我无法搜索标准文本或图像

我在想,如果我可以将PDF页面裁剪成两个(顶部和底部),并创建两个新的PDF文件,那么我就可以比较这两个文件的大小。最大的文件可能位于页面顶部。如果需要,我可以旋转页面(我知道怎么做)

谢谢

更新-我找到了一种将页面一分为二的方法,但不幸的是,创建的两个文件大小相同(尽管上半部分有更多的文本和图像):


在我脑海中,有几种方法可以用来确定文档的方向,每种方法在效率、准确性和工作量/成本方面都有各自的优缺点

  • 使用OCR软件包,如或,以一个方向扫描页面,然后再次旋转180。由于OCR软件包将只检测正确定向的文本,因此捕获更多文本的哪个方向就是正确的方向。这种方法可能不是最有效的,但可能是最准确的。还有许多其他OCR软件包,请参考
  • 通过属性公开PDF文档中jpeg的内容,将其转换为单色,然后使用各种评分功能评估墨水密度较大的区域。您需要在这里进行实验,但是首先要注意的是检测发票中的标题/徽标,因为这很可能位于顶部,密度将大于底部。另一个想法是,可能总是有一个页脚、条形码或跟踪号码,您可以在任意方向扫描页面的该部分。它的存在可以用作一面旗帜
  • 您可以使用像素差分技术,为您知道的具有正确方向的所有文档构建一个复合掩码(图像),并使用该掩码对未知图像执行位异或运算,然后再次对相反方向执行位异或运算,并比较每个文档中黑色像素的总和。该理论认为,未知图像将位于已知图像的域中,如果方向正确,则差异应该很小,但如果方向错误,则差异会很大
  • 如果您有一个已知的发票域,您可以检测每个发票的一个特征,该特征指示其方向,类似于自动售货机检测您插入的票据类型
  • :)
  • 以上的一些组合

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

你能使用
GetPageSize
并比较高度和宽度(如果高度>宽度,那么它就是肖像)吗?你好,皮特利兹和Tsukasa。对不起,我想我的问题有点模糊。我所有的文件都是扫描过的。我试图检查每个文档的内容是否应该旋转180度。我的想法是,每张发票上的大多数文本/图像都将位于顶部。与横向相比,横向旋转为90度或270度。正面将是180度旋转。我想这就是我们困惑的地方。@SimonChristopherDodd你想知道你的文档是否颠倒了吗?你好@tsukasa。是-我想知道我的文件是否颠倒了。谢谢
        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();
    }