2016-10-01 1 views
0

J'essaie de jouer un peu avec PDFBox et Groovy. J'essaie de comprendre la largeur d'une chaîne en utilisant la méthode getStringWidth() de la classe PDType1Font.Groovy impossible de charger la classe

Mon problème est que chaque fois que je compiler et exécuter le code, je reçois une erreur disant ceci:

Error:Groovyc: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Unable to load class org.apache.pdfbox.pdmodel.font.PDType1Font due to missing dependency org/apache/fontbox/type1/DamagedFontException 
    at org.codehaus.groovy.control.CompilationUnit.convertUncaughtExceptionToCompilationError(CompilationUnit.java:1091) 
    at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1069) 
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:591) 
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569) 
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546) 
    at org.jetbrains.groovy.compiler.rt.GroovyCompilerWrapper.compile(GroovyCompilerWrapper.java:62) 
    at org.jetbrains.groovy.compiler.rt.DependentGroovycRunner.runGroovyc(DependentGroovycRunner.java:115) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jetbrains.groovy.compiler.rt.GroovycRunner.intMain2(GroovycRunner.java:135) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jetbrains.jps.incremental.groovy.InProcessGroovyc.runGroovycInThisProcess(InProcessGroovyc.java:156) 
    at org.jetbrains.jps.incremental.groovy.InProcessGroovyc.access$000(InProcessGroovyc.java:51) 
    at org.jetbrains.jps.incremental.groovy.InProcessGroovyc$1.call(InProcessGroovyc.java:85) 
    at org.jetbrains.jps.incremental.groovy.InProcessGroovyc$1.call(InProcessGroovyc.java:82) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Voici le code:

import org.apache.pdfbox.pdmodel.font.PDType1Font 

float getStringWidth(String text) { 
     PDType1Font font = new PDType1Font(PDType1Font.HELVETICA) 
     float width = font.getStringWidth(text)/1000 * 8; 

     return width 
    } 

Je décrochai toutes les parties non pertinentes de le code pour des raisons de clarté.

Quel est le problème? MISE À JOUR: J'ai cherché un peu comment ajouter un jar externe à mon chemin de classe dans IntelliJ et j'ai découvert que je devais aller à la structure du projet -> Modules -----> Dépendances, et puis je dois configurer ma bibliothèque en tant que dépendance

J'ai essayé de le faire comme ceci:

img

Mais je suis encore en train le message d'erreur décrit ci-dessus.

+2

Le code nécessitera le fichier PDFBox jar (et ses dépendances, telles que fontbox) sur le chemin de classe. Cela peut être fait avec Gradle mais pour un exemple clair/simple, consultez 'setvars.sh' dans ce projet - https://github.com/peidevs/OpenDataBookClub/tree/master/tools/PDF_Thresher –

+0

Pourriez-vous s'il vous plaît élaborer sur cette? Je n'ai pas compris exactement ce qu'est ce fichier setvars.sh et comment il est exécuté et quand. J'ai également mis à jour ce post avec et l'image. –

+1

Votre image montre que vous avez différentes versions. Vous devez également avoir Fontbox 2.0.3. –

Répondre

0

La convention Java signifie que vous devez déclarer votre code dans une classe. Cela signifie que chaque méthode doit être définie dans une classe avec un nom pertinent pour les méthodes qu'elle enveloppe.

Par exemple, vous pouvez utiliser la structure de code suivant:

import org.apache.pdfbox.pdmodel.font.PDType1Font 

class StringUtils { 

    float getStringWidth(String text) { 
     PDType1Font font = new PDType1Font(PDType1Font.HELVETICA) 
     float width = font.getStringWidth(text)/1000 * 8; 

     return width 
    } 
} 

Dans l'exemple ci-dessus StringUtils est le nom de la classe la machine virtuelle Java est à la recherche. En utilisant cette convention, le code est compilé en code octet et crée le fichier JAR correspondant, ce qui devrait probablement résoudre l'erreur que vous avez.

Remarque: Assurez-vous que votre variable PATH ENV inclut le répertoire de l'espace de travail de code avec tous les répertoires tiers pertinents.

1

Selon snapshot of the project structure de l'OP, il utilise ces dépendances:

dependencies from snapshot

Cela ne peut pas fonctionner, les versions de PDFBox et fontbox doivent correspondre (comme l'a remarqué Tilman). En particulier la version 2 a introduit une API remaniée. Ainsi, une version PDFBox 2.0.x peut difficilement fonctionner correctement à côté d'une version FONTBox 1.8.y.