2012-06-09 16 views
8

Nie mogę wykryć pustej strony w pliku PDF. Szukałem internetu, ale nie mogłem znaleźć dobrego rozwiązania.Jak znaleźć pustą stronę w pliku pdf

Używając Itextarp, próbowałem z rozmiarem strony, Xobjects. Ale nie podają dokładnego wyniku.

Próbowałem

if(xobjects==null || textcontent==null || size <20 bytes) 
    then "blank" 
else 
not blank 

Ale maksymalny czas powraca złą odpowiedź. Użyłem iTextSharp

Kod jest poniżej ... Używam iTextSharp Librabry

Dla xobjects

PdfDictionary xobjects = resourceDic.GetAsDict(PdfName.XOBJECT); 
//here resourceDic is PdfDictionary type 
//I know that if Xobjects is null then page is blank. But sometimes blank page gives xobjects which is not null. 

Dla contentstream

RandomAccessFileOrArray f = reader.SafeFile; 
//here reader = new PdfReader(filename); 

byte[] contentBytes = reader.GetPageContent(pageNum, f); 
//I have measured the size of contentbytes but sometimes it gives more than 20 bytes for blank page 

Dla textContent

String extractedText = PdfTextExtractor.GetTextFromPage(reader, pageNum, new LocationTextExtractionStrategy()); 
    // sometimes blank page give a text more than 20 char length . 
+0

Co otrzymałeś na stronie, którą znasz jako pustą? (Edytuj ten szczegół w swojej odpowiedzi, zamiast dodawać istotne szczegóły w komentarzach). – halfer

+0

@halfer zobacz teraz. –

+0

To dobre pytanie. Nie znam odpowiedzi, ponieważ nie robiłem wcześniej żadnego parsowania PDF. Czy przeanalizowałeś te trzy kategorie obiektów, aby sprawdzić, czy puste strony mają coś wspólnego? Na przykład, jaka zawartość tekstu faktycznie pojawia się na pustej stronie? – halfer

Odpowiedz

1

Podejrzewam wypróbowaniu .Trim() na struny, więc nie będę sugerować, że na jego własne.

Jaka jest rzeczywista zawartość ciągów o długości powyżej 20+ w pustym miejscu? Podejrzewam, że to tylko znaki nowego wiersza (jak to, co się dzieje, gdy ludzie naciśnij wprowadzić 10+ razy, aby dostać nową stronę zamiast wstawiania page-break), w którym to przypadku:

String extractedText = 
    string.Replace(string.Replace(
     PdfTextExtractor.GetTextFromPage(reader, pageNum, new LocationTextExtractionStrategy()) 
    , Environment.NewLine, ""), "\n", "").Trim(); 

Daj nam znać jaka jest zawartość wyjściowa po tym.

Inną możliwością jest to, że jest to pusty tekst z niepodzielonymi przerwami i innymi znakami, które w rzeczywistości nie są spacjami. Będziesz musiał je znaleźć i zastąpić ręcznie. W tym momencie sugerowałbym, że faktycznie używasz dopasowanie do wyrażenia regularnego dla [0-9, az, AZ] i użyj go do ustalenia, czy twoja strona jest pusta, czy nie.

+0

Nie trymuję struny. Właśnie dostaję ciąg i pokażę to. Mogę dać ci plik PDF, który ma pustą stronę, ale jego tekst to 01 557599 FM.qxd 4/29/04 11.32AM Strona ii –

+0

To prawdopodobnie z ukrytych pól w nagłówku/stopce .. jeśli możesz usunąć nagłówek i stopki z dokument przed uzyskaniem tekstu ze strony, który może być dobrym rozwiązaniem. – Seph

+0

W przeciwnym razie może zajść potrzeba renderowania stron do obrazów i porównania, jeśli są puste lub nie (chyba że strony mają obrazy tła lub znaki wodne lub podobne). Nie mogę się doczekać, aby zobaczyć, czy ktoś inny ma bardziej zdecydowaną sugestię niż to (jeśli nie możesz usunąć sekcji nagłówka i stopki każdej strony). – Seph

2

Bardzo prosty sposób na odkrycie pustych stron jest następujący: użyj komendy Ghostscript, która wywołuje urządzenie bbox.

bbox Ghostscript za oblicza współrzędne tego minimalnego prostokąta „Obwiednia” który otacza wszystkie punkty strony, na której piksel będzie renderowane:

gs \ 
    -o /dev/null \ 
    -sDEVICE=bbox \ 
    input.pdf 

na oknach:

gswin32c.exe^
    -o nul^
    -sDEVICE=bbox^
    input.pdf 

Wynik:

GPL Ghostscript 9.05 (2012-02-08) 
Copyright (C) 2010 Artifex Software, Inc. All rights reserved. 
This software comes with NO WARRANTY: see the file PUBLIC for details. 
Processing pages 1 through 6. 
Page 1 
%%BoundingBox: 27 281 548 804 
%%HiResBoundingBox: 27.000000 281.000000 547.332031 804.000000 
Page 2 
%%BoundingBox: 0 0 0 0 
%%HiResBoundingBox: 0.000000 0.000000 0.000000 0.000000 
Page 3 
%%BoundingBox: 27 302 568 814 
%%HiResBoundingBox: 27.949219 302.000000 567.332031 814.000000 
Page 4 
%%BoundingBox: 27 302 568 814 
%%HiResBoundingBox: 27.949219 302.000000 567.332031 814.000000 
Page 5 
%%BoundingBox: 27 302 568 814 
%%HiResBoundingBox: 27.949219 302.000000 567.332031 814.000000 
Page 6 
%%BoundingBox: 27 302 568 814 
%%HiResBoundingBox: 27.949219 302.000000 567.332031 814.000000 

Jak widać, strona 2 mojego dokumentu wejściowego była pusta.

+0

Jestem nowy z pdf. W oknach poleceń uruchamiam go, ale gdy uruchamiam polecenie jako plik wsadowy, to numer strony otrzymuję jako plik wyjściowy nic innego. Jak mogę rozwiązać ten problem. @Kurt Pfeifle –

+0

@lazy king: Przyczyna może być następująca: (1) wszystkie linie zaczynające się od 'Page' są kierowane do 'stdout'. (2) wszystkie linie zaczynające się od '%% BoundingBox:' lub '%% HiResBoundingBox:' są kierowane do 'stderr'. W oknie poleceń wyjście stderr może zostać wyłączone, jeśli uruchomisz polecenie z pliku wsadowego ... –

+0

@lazy king: Możesz spróbować tego 'gswin32c.exe -sstdout =% stderr -o nul -sDEVICE = bbox" input.pdf "2> output.txt", aby przekierować wszystkie dane wyjściowe pliku wsadowego do pliku tekstowego o nazwie * output.txt *. Czy tego chcesz? –

0

Istnieje biblioteka otoki dla C# i VB.NET z mupdf c++ library. Można go użyć do konwersji na strony na bmp (w różnych formatach tif, jpg, png) i sprawdzić rozmiar bitmapy.

Należy sprawdzić, jaki jest minimalny rozmiar z minimalnymi znakami strony, którą należy uznać za pustą.

Powiązane problemy