Lire pdf uploadstream une page à la fois avec java


J'essaie de lire un document pdf dans une application j2ee.

Pour une application Web, je dois stocker des documents pdf sur le disque. Pour faciliter la recherche, je veux créer un index inverse du texte à l'intérieur du document; s'il s'agit d'OCR.

Avec la bibliothèque PDFbox, il est possible de créer un objet pdfDocument contenant un fichier pdf entier. Cependant pour préserver la mémoire et améliorer les performances globales je préfère gérer le document comme un flux et lire une page à la fois dans un tampon.

Je me demande s'il est possible de lire un filestream contenant un pdf page par page ou même une ligne à la fois.

Author: Luis G., 2009-02-25

4 answers

Pour un document pdf générique donné, vous n'avez aucun moyen de savoir où se termine une page et où commence une autre, en utilisant PDFBox au moins.

Si votre préoccupation est l'utilisation de ressources, je vous suggère d'analyser le document pdf dans un COSDocument, d'extraire les objets analysés du COSDocument en utilisant le .getObjects (), qui vous donnera un java.util.Liste. Cela devrait être facile à intégrer dans les ressources rares dont vous disposez.

Notez que vous pouvez facilement convertir vos documents PDF analysés en Lucene indexe via l'API PDFBox.

Aussi, avant de vous aventurer au pays des optimisations, assurez-vous que vous en avez vraiment besoin. PDFBox est capable de faire une représentation en mémoire de documents PDF assez volumineux sans trop d'effort.

Pour analyser le document PDF à partir d'un InputStream, regardez la classeCOSDocument

Pour écrire les index lucene, regardez LucenePDFDocument classe

Pour les représentations en mémoire de COSDocuments, regardez FDFDocument

 1
Author: Steen, 2014-03-17 12:32:37

Dans le 2.0.* versions, ouvrez le PDF comme ceci:

PDDocument doc = PDDocument.load(file, MemoryUsageSetting.setupTempFileOnly());

Cela configurera l'utilisation de la mémoire tampon pour n'utiliser que des fichiers temporaires(pas de mémoire principale) sans taille restreinte.

Ce qui a été répondu ici.

 1
Author: lmanyange, 2017-07-17 06:59:52

Jetez un oeil à la bibliothèque Java PDF Renderer . Je l'ai essayé moi-même et cela semble beaucoup plus rapide que PDFBox. Je n'ai cependant pas essayé d'obtenir le texte OCR.

Voici un exemple copié à partir du lien ci-dessus qui montre comment dessiner une page PDF dans une image:

    File file = new File("test.pdf");
    RandomAccessFile raf = new RandomAccessFile(file, "r");
    FileChannel channel = raf.getChannel();
    ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
    PDFFile pdffile = new PDFFile(buf);

    // draw the first page to an image
    PDFPage page = pdffile.getPage(0);

    //get the width and height for the doc at the default zoom 
    Rectangle rect = new Rectangle(0,0,
            (int)page.getBBox().getWidth(),
            (int)page.getBBox().getHeight());

    //generate the image
    Image img = page.getImage(
            rect.width, rect.height, //width & height
            rect, // clip rect
            null, // null for the ImageObserver
            true, // fill background with white
            true  // block until drawing is done
            );
 -1
Author: kepler, 2010-08-19 14:12:23

J'imagine que vous pouvez lire le fichier octet par octet à la recherche de sauts de page. Ligne par ligne est plus difficile en raison de problèmes de formatage PDF possibles.

 -2
Author: tkotitan, 2009-02-25 14:55:36