2017-04-06 6 views
0

Nous essayons de rendre des images à partir de différents fichiers PDF, en utilisant la méthode de PDFRenderer renderImageWithDPI. Sur un PDF particulier, pour certaines pages, le rendu de bibliothèque a un comportement différent. Le rendu lui-même prend plus de temps que pour d'autres pages similaires, et la consommation de mémoire atteint des valeurs inhabituellement élevées: la mémoire consommée par le processus augmente d'environ 50 Mo toutes les 1 - 2 secondes, jusqu'à atteindre 5 Go de RAM consommé par le processus d'application dans renderImageWithDPI. Une fois que le thread termine renderImageWithDPI, la consommation de mémoire diminue de 1,5 à 2 Go presque immédiatement. En raison de la consommation élevée de mémoire, une exception Java Heap Space peut parfois être lancée.PDFBox 2 consommation de mémoire inhabituelle

Les pages sur lesquelles cela se produit ne sont pas visiblement différentes des autres, avec la même largeur, la même hauteur et la même taille de disque. Le rendu est effectué avec 250 DPI, avec ImageType RVB. En outre, l'application s'exécute avec le paramètre "-Dsun.java2d.cmm = sun.java2d.cmm.kcms.KcmsServiceProvider".

Est-ce une fuite de mémoire ou un comportement attendu? En outre, quelqu'un pourrait-il expliquer pourquoi certaines pages absorbent 2 Go de mémoire et prennent une minute à être rendues, alors que d'autres sont rendues en quelques secondes?

+0

Pouvez-vous partager le pdf en question? – mkl

+0

Pourriez-vous me donner votre adresse e-mail afin que je vous envoie un lien vers le disque Google? – Cristian

+0

peut-être des ombrages, peut-être des motifs complexes ... S'il vous plaît envoyer le lien également à tilman à snafu dot de. –

Répondre

0

L'analyse du PDF montre que la page 34 contient plus de 10000 éléments XObject, presque tous des images CMJN. Vous pouvez le voir vous-même avec the PDFDebugger command line app, allez à la page 34, puis les ressources, puis XObject. Les convertir n'est pas très rapide en Java. L'utilisation de la mémoire est probablement due à la mise en cache de ces images. Vous pouvez observer que la prochaine fois que la page est affichée, c'est beaucoup plus rapide. La désactivation du cache est affichée dans le FAQ.

J'obtiens aussi une amélioration de vitesse (21 secondes au lieu de 89 secondes) en utilisant cette option: -Dorg.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true. Cependant, la qualité de l'image peut être très légèrement différente, voir PDFBOX-3569 pour une discussion.

+0

Nous allons essayer toutes les options de FAQ et aussi le dernier que vous avez mentionné, avec la remarque que la qualité de l'image est réellement importante pour nous. Merci pour le soutien dans la compréhension de ce problème. – Cristian

+0

Après avoir lu https://issues.apache.org/jira/browse/PDFBOX-3569, j'ai cru comprendre que KcmsServiceProvider et UsePureJavaCMYKConversion ne devraient pas être utilisés en même temps car cela ralentit le rendu. Nous ne resterons qu'avec KcmsServiceProvider puisque nous ne pouvons pas basculer entre les deux en fonction d'un pdf ou d'un autre. – Cristian

+0

Dans mon cas, en utilisant les deux fait plus vite. –