2012-06-09 17 views
8

No puedo detectar la página en blanco en el archivo pdf. He buscado en Internet pero no he encontrado una buena solución.Cómo encontrar la página en blanco en el archivo pdf

Uso de Itextsharp Probé con el tamaño de página, Xobjects. Pero no dan el resultado exacto .

me trataron

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

Pero el tiempo máximo que devuelve respuesta incorrecta. He utilizado iTextSharp

El código está por debajo ... estoy usando iTextSharp Librabry

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

Para 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 

Para TextContent

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

¿Qué _haces_ en una página que sabes que está en blanco? (Edite este detalle en su respuesta, en lugar de agregar detalles sustanciales en los comentarios). – halfer

+0

@halfer ver ahora. –

+0

Esa es una buena pregunta ahora. No sé la respuesta, ya que no he hecho ningún análisis de PDF antes. ¿Ha analizado esas tres categorías de objetos para ver si las páginas vacías tienen algo en común? Por ejemplo, ¿qué contenido de texto aparece realmente en una página en blanco? – halfer

Respuesta

1

que sospecha que ha intentado .trim() en sus cadenas, por lo que no voy a sugerir que por sí mismo.

¿Cuál es el contenido real de las 20 cadenas de longitud de caracteres en el espacio en blanco? Sospecho que es sólo caracteres de nueva línea (como lo que sucede cuando las personas entran pulse 10+ veces sólo para obtener una nueva página en lugar de insertar un salto de página), en cuyo caso:

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

Vamos a informarnos cuál es el contenido de salida después de esto.

Otra posibilidad es que sea un texto en blanco con espacios sin interrupciones y otros caracteres que no son en realidad espacios, deberá encontrarlos y reemplazarlos manualmente ... en cuyo caso, en su lugar, le sugiero que simplemente use una coincidencia de expresión regular para [0-9, az, AZ] y usar eso para determinar si su página está en blanco o no.

+0

No recorte cuerda. Acabo de obtener el hilo y mostrarlo. Puedo darle un archivo pdf que tiene una página en blanco, pero su texto es 01 557599 FM.qxd 4/29/04 11.32AM Página ii –

+0

Es probable que provenga de campos ocultos en el encabezado/pie de página ... si puede eliminar el encabezado y los pies de página de el documento antes de obtener el texto de la página que podría ser una buena opción. – Seph

+0

De lo contrario, podría necesitar representar las páginas en imágenes y comparar si están en blanco o no (a menos que las páginas tengan imágenes de fondo o filigranas o similares). Espero con interés ver si alguien tiene una sugerencia más sólida que esa, aunque (Si no puede eliminar las secciones de encabezado y pie de página de cada página). – Seph

2

Una manera muy simple de descubrir las páginas vacías es la siguiente: utilice una línea de comandos de Ghostscript que llame al dispositivo bbox.

Bbox de Ghostscript calcula las coordenadas de ese rectángulo mínimo 'cuadro delimitador' que encierra todos los puntos de la página donde se volvería un píxel:

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

En Windows:

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

Resultado:

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 

Como puede ver, la página 2 de mi documento de entrada estaba vacía.

+0

Soy nuevo con pdf. En las ventanas de comando lo ejecuto, pero cuando ejecuto el comando como un archivo de proceso por lotes, el número de página no aparece como archivo de salida. ¿Cómo puedo superar este problema? @Kurt Pfeifle –

+0

@lazy king: La razón podría ser esta: (1) todas las líneas que comienzan con 'Page' se dirigen a 'stdout'. (2) todas las líneas que comienzan con '%% BoundingBox:' o '%% HiResBoundingBox:' se dirigen a 'stderr'. En la ventana de comandos, la salida de stderr podría posiblemente suprimirse si ejecuta el comando desde dentro de un archivo de proceso por lotes ... –

+0

@lazy king: Puede intentar esto 'gswin32c.exe -sstdout =% stderr -o nul -sDEVICE = bbox" input.pdf "2> output.txt' para redirigir toda la salida del archivo por lotes a un archivo de texto llamado * output.txt *. ¿Es eso lo que quieres? –

0

Hay una biblioteca contenedora para C# y VB.NET de mupdf c++ library. Puede usarlo para convertir páginas a bmp (en diferentes formatos tif, jpg, png) y verificar el tamaño del mapa de bits.

Debe comprobar cuál es el tamaño mínimo con los caracteres mínimos de una página que considerará como un espacio en blanco.

Cuestiones relacionadas