2012-06-09 14 views
8

Non riesco a rilevare la pagina vuota nel file pdf. Ho cercato internet ma non ho trovato una buona soluzione.Come trovare la pagina vuota nel file pdf

Utilizzo di Itextsharp Ho provato con la dimensione della pagina, Xobjects. Ma non lo fanno dare il risultato esatto.

ho cercato

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

Ma il tempo massimo che restituisce risposta sbagliata. Ho usato iTextSharp

Il codice è qui sotto ... Sto usando iTextSharp Librabry

Per 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. 

Per 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 

Per TextContent

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

Cosa si ottiene in una pagina che si sa essere vuota? (Modifica questo dettaglio nella tua risposta, piuttosto che aggiungere dettagli sostanziali nei commenti). – halfer

+0

@halfer vedi ora. –

+0

Questa è una buona domanda ora. Non conosco la risposta, dal momento che non ho ancora eseguito l'analisi PDF. Hai analizzato queste tre categorie di oggetti per vedere se le pagine vuote hanno qualcosa in comune? Ad esempio, quale contenuto di testo appare effettivamente su una pagina vuota? – halfer

risposta

1

ho il sospetto si è tentato .Trim() sulle tue corde, quindi non mi suggerire che su di essa la propria.

Qual è il contenuto effettivo delle 20 stringhe di lunghezza char nello spazio vuoto? Ho il sospetto che si trova a soli caratteri di nuova riga (come quello che succede quando la gente preme immettere 10+ volte solo per ottenere una nuova pagina, piuttosto che l'inserimento di una pagina-break), nel qual caso:

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

farci sapere qual è il contenuto di uscita dopo questo.

Un'altra possibilità è che si tratta di un testo vuoto con spazi non interrotti e altri caratteri che non sono effettivamente spazi, dovrai cercarli e sostituirli manualmente .. a quel punto vorrei invece suggerirti che in realtà usi solo una corrispondenza regolare per [0-9, az, AZ] e usarla per determinare se la pagina è vuota o meno.

+0

Non ho tagliato la corda. Ho appena preso la stringa e mostrata. Posso darti un file pdf che ha una pagina vuota ma il suo testo è 01 557599 FM.qxd 4/29/04 11.32AM Pagina ii –

+0

Questo è probabilmente da campi nascosti nell'intestazione/piè di pagina .. se è possibile rimuovere intestazione e piè di pagina da il documento prima di ottenere il testo dalla pagina che potrebbe essere una buona opzione. – Seph

+0

Altrimenti potrebbe essere necessario rendere le pagine alle immagini e confrontarle se sono vuote o meno (a meno che le pagine abbiano immagini di sfondo o filigrane o simili). Non vedo l'ora di vedere se qualcun altro ha un suggerimento più solido di quello (se non è possibile rimuovere le sezioni di intestazione e piè di pagina di ciascuna pagina). – Seph

2

Un modo molto semplice per scoprire le pagine vuote è questo: utilizzare una riga di comando Ghostscript che chiama il dispositivo bbox.

bbox di Ghostscript calcola le coordinate di quel minimo rettangolo 'rettangolo di selezione' che racchiude tutti i punti della pagina in cui un pixel sarebbe resa:

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

Su Windows:

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

Risultato:

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 

Come puoi vedere, la pagina 2 del mio documento di input era vuota.

+0

Sono nuovo con il pdf. Nella finestra di comando lo eseguo ma quando eseguo il comando come un file batch, il numero di pagina ottengo come file di output nient'altro. Come posso superare questo problema. @Kurt Pfeifle –

+0

@lazy king: La ragione potrebbe essere questa: (1) tutte le righe che iniziano con 'Pagina' sono indirizzate a 'stdout'. (2) tutte le linee che iniziano con '%% BoundingBox:' o '%% HiResBoundingBox:' sono dirette a 'stderr'. Nella finestra di comando l'output di stderr potrebbe essere soppresso se si esegue il comando da un file batch ... –

+0

@lazy king: Si potrebbe provare questo 'gswin32c.exe -sstdout =% stderr -o nul -sDEVICE = bbox" input.pdf "2> output.txt' per reindirizzare l'output di tutti i file batch in un file di testo denominato * output.txt *. E 'questo quello che vuoi? –

0

C'è una libreria wrapper per C# e VB.NET da mupdf c++ library. È possibile utilizzarlo per convertire le pagine in bmp (in diversi formati tif, jpg, png) e controllare la dimensione della bitmap.

È necessario verificare quale è la dimensione minima con i caratteri minimi di una pagina che verrà considerata come vuota.

Problemi correlati