2014-07-14 5 views
-2

C# Windows App에서 iTextSharp를 사용하여 스캔 한 세로 형 PDF 인보이스 파일을 조작하고 있습니다. 파일을 스캔 한 후 페이지의 텍스트 방향을 자동으로 확인 (예상)하고 싶습니다 (사용자가 거꾸로 스캔했을 수 있음).iTextSharp를 사용하여 PDF 방향을 결정하십시오. C# .net

인보이스는 다양한 공급 업체에서 제공되므로 표준 텍스트 또는 이미지를 검색 할 수 없습니다.

PDF 페이지를 위아래로 자르고 2 개의 새로운 PDF 파일을 만들면 두 파일 크기를 비교할 수 있다고 생각했습니다. 가장 큰 파일은 아마 페이지의 상단 일 것입니다. 그런 다음 필요에 따라 페이지를 회전시킬 수 있습니다 (이 비트를 수행하는 방법을 알고 있습니다).

감사

업데이트 - 나는 반에서 페이지를 분할하지만, 생성 불행하게도이 개 파일이 동일한 크기 할 수있는 방법을 발견했다 (위쪽 절반에 더 많은 텍스트와 이미지가 있더라도) :

 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

'GetPageSize'를 사용하여 높이와 너비를 비교할 수 있습니까? (높이> 너비라면 세로입니다)? – petelids

+0

Hello petelids & @Tsukasa. 미안 해요. 제 질문은 제가 생각하기에 다소 모호합니다. 내 모든 문서는 세로 방향 인보이스로 스캔됩니다. 각 문서의 내용을 180도 회전해야하는지 확인하려고합니다. 내 생각에 각 인보이스에있는 텍스트/이미지의 대부분이 맨 위에 표시됩니다.감사 –

+0

세로 대 가로는 90도 또는 270도 회전이됩니다. 위쪽면이 180도 회전합니다. 그것이 우리가 혼란스러워하는 곳입니다. –

답변

0

내 머리 꼭대기에는 문서 방향을 결정할 수있는 몇 가지 방법이 있으며 효율성, 정확성 및 노력/비용 측면에서 각자의 장점/단점을 갖고 있습니다.

  • Tesseract 또는 Cuneiform으로 이러한 OCR 패키지를 사용하여 한 방향으로 페이지를 스캔하고 OCR 패키지는 올바른 방향으로 텍스트를 감지하기 때문에 다시 180 회전, 어느 방향이 더 많은 텍스트가 올바른 방향입니다 캡처. 이 방법이 가장 효율적이지는 않지만 아마도 가장 정확할 것입니다. 다른 많은 OCR 패키지가 있습니다 (Wikipedia).
  • iTextSharp.text.Image.RawData 속성을 통해 PDF 문서의 jpeg 내용을 노출하고 흑백으로 캐스팅 한 다음 다양한 채점 기능을 사용하여 더 큰 잉크 농도 영역을 평가합니다. 여기에서 실험 할 필요가 있지만, 가장 먼저 떠오르는 것은 인보이스의 표제/로고를 감지하는 것입니다. 이는 인보이스의 상단에있을 가능성이 높고 하단보다 밀도가 높기 때문입니다. 또 다른 아이디어로는 항상 바닥 글, 바코드 또는 추적 번호가 있으며 페이지의 해당 부분을 어느 방향 으로든 스캔 할 수 있습니다. 존재감을 깃발로 사용할 수 있습니다.
  • 픽셀 차이 기법을 사용하여 알고있는 모든 문서의 합성 마스크 (이미지)를 올바른 방향으로 작성하고 해당 마스크를 사용하여 알 수없는 이미지와 비트 XOR을 수행하고 반대 방향으로 다시 XOR 할 수 있습니다. 각각의 검은 색 픽셀의 합을 비교한다. 이론은 알려지지 않은 이미지가 알려진 이미지의 영역에있을 것이며, 그것이 올바른 방향으로 향하게되면 매우 다른 차이를 가져야 만한다는 것이 이론이지만, 방향을 잘못 지정하면 많은 차이가 생깁니다.
  • 알려진 인보이스 도메인이있는 경우 자동 판매기가 사용자가 삽입 한 지폐 유형을 감지하는 것과 유사하게 방향을 나타내는 각 인보이스의 기능을 감지 할 수 있습니다.
  • Mechanical Turk :
  • 위의 일부 조합입니다.

행운을 빈다. 진행 방법을 알려주세요.

관련 문제