Saltar al contenido

extraer texto de pdf en Javascript

Si te encuentras con algo que no entiendes puedes dejarlo en la sección de comentarios y haremos todo lo posible de ayudarte rápidamente.

Solución:

Esta es una pregunta antigua, pero debido a que pdf.js se ha desarrollado a lo largo de los años, me gustaría dar una nueva respuesta. Es decir, se puede realizar de forma local sin involucrar a ningún servidor o servicio externo. El nuevo pdf.js tiene una función: page.getTextContent (). Puede obtener el contenido de texto de eso. Lo he hecho con éxito con el siguiente código.

  1. Lo que obtienes en cada paso es una promesa. Necesita codificar de esta manera: .then( function()...) para continuar con el siguiente paso.

    1) PDFJS.getDocument( data ).then( function(pdf) {

    2) pdf.getPage(i).then( function(page){

    3) page.getTextContent().then( function(textContent){

  2. Lo que finalmente obtienes es un string array textContent.bidiTexts[]. Los concatenas para obtener el texto de 1 página. Las coordenadas de los bloques de texto se utilizan para juzgar si es necesario insertar una nueva línea o un espacio. (Es posible que esto no sea totalmente sólido, pero según mi prueba, parece estar bien).

  3. El parámetro de entrada data debe ser una URL o datos de tipo ArrayBuffer. Usé la función ReadAsArrayBuffer (archivo) en FileReader API para obtener los datos.

Espero que esto ayude.

Nota: Según otro usuario, la biblioteca se actualizó y provocó que el código se rompiera. Según el comentario de async5 a continuación, debe reemplazar textContent.bidiTexts con textContent.items.

    function Pdf2TextClass()
     var self = this;
     this.complete = 0;

    /**
     *
     * @param data ArrayBuffer of the pdf file content
     * @param callbackPageDone To inform the progress each time
     *        when a page is finished. The callback function's input parameters are:
     *        1) number of pages done;
     *        2) total number of pages in file.
     * @param callbackAllDone The input parameter of callback function is 
     *        the result of extracted text from pdf file.
     *
     */
     this.pdfToText = function(data, callbackPageDone, callbackAllDone)
     console.assert( data  instanceof ArrayBuffer  ; // end of pdfToText()
; // end of class

No pude hacer que el ejemplo de gm2008 funcionara (la estructura de datos interna en pdf.js aparentemente ha cambiado), así que escribí mi propia solución totalmente basada en promesas que no usa ningún elemento DOM, selector de consultas o lienzo, usando el pdf actualizado .js del ejemplo en mozilla

Come una ruta de archivo para la carga, ya que la estoy usando con node-webkit. Debe asegurarse de tener los cmaps descargados y apuntados a algún lugar y necesita pdf.js y pdf.worker.js para que esto funcione.

    /**
     * Extract text from PDFs with PDF.js
     * Uses the demo pdf.js from https://mozilla.github.io/pdf.js/getting_started/
     */
    this.pdfToText = function(data) 

        PDFJS.workerSrc = 'js/vendor/pdf.worker.js';
        PDFJS.cMapUrl = 'js/vendor/pdfjs/cmaps/';
        PDFJS.cMapPacked = true;

        return PDFJS.getDocument(data).then(function(pdf) 
            var pages = [];
            for (var i = 0; i < pdf.numPages; i++) 
                pages.push(i);
            
            return Promise.all(pages.map(function(pageNumber) 
                return pdf.getPage(pageNumber + 1).then(function(page) 
                    return page.getTextContent().then(function(textContent) 
                        return textContent.items.map(function(item) 
                            return item.str;
                        ).join(' ');
                    );
                );
            )).then(function(pages) 
                return pages.join("rn");
            );
        );
    

uso:

 self.pdfToText(files[0].path).then(function(result) 
      console.log("PDF done!", result);
 )

Aquí hay un código JavaScript que hace lo que usted quiere usando Pdf.js de http://hublog.hubmed.org/archives/001948.html:

var input = document.getElementById("input");  
var processor = document.getElementById("processor");  
var output = document.getElementById("output");  

// listen for messages from the processor  
window.addEventListener("message", function(event)  
  if (event.source != processor.contentWindow) return;  

  switch (event.data)  
    // "ready" = the processor is ready, so fetch the PDF file  
    case "ready":  
      var xhr = new XMLHttpRequest;  
      xhr.open('GET', input.getAttribute("src"), true);  
      xhr.responseType = "arraybuffer";  
      xhr.onload = function(event)   
        processor.contentWindow.postMessage(this.response, "*");  
      ;  
      xhr.send();  
    break;  

    // anything else = the processor has returned the text of the PDF  
    default:  
      output.textContent = event.data.replace(/s+/g, " ");  
    break;  
    
, true);

... y aquí hay un ejemplo:

http://git.macropus.org/2011/11/pdftotext/example/

Puntuaciones y reseñas

Acuérdate de que te brindamos la opción de parafrasear si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *