2009-02-25 6 views
0

J'essaye de lire un document de pdf dans une application de j2ee.Lire le pdf uploadstream une page à la fois avec java

Pour une application Web, je dois stocker des documents PDF sur disque. Pour faciliter la recherche, je veux faire un index inverse du texte à l'intérieur du document; si c'est OCR.

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

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

+1

Copie possible de [PDFBox: travailler avec de très gros PDF.] (Https://stackoverflow.com/questions/11301818/pdfbox-working-with-very-large-pdfs) – lmanyange

Répondre

-2

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

+0

Ce n'est pas comme ça que fonctionnent les PDF. – danwyand

1

Pour un document PDF générique donné, vous n'avez aucun moyen de savoir où une page se termine et une autre commence, en utilisant au moins PDFBox. Si votre problème concerne l'utilisation des ressources, je vous suggère d'analyser le document pdf dans un COSDocument, d'extraire les objets analysés du COSDocument en utilisant le fichier .getObjects(), ce qui vous donnera un fichier java.util.List. Cela devrait être facile à intégrer dans toutes les ressources rares que vous avez.

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

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

Pour l'analyse du document PDF à partir d'un InputStream, regardez la COSDocument classe

Pour écrire des index de Lucene, regardez LucenePDFDocument classe

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

-1

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

Voici un exemple copié à partir du lien ci-dessus qui montre comment dessiner une page PDF en 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

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

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

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

Il a été répondu here.

Questions connexes