2016-10-01 13 views
0

Я пытаюсь немного пообщаться с PDFBox и Groovy. Я пытаюсь выяснить ширину строки, используя метод класса getTringWidth() класса PDType1Font.Groovy не может загрузить класс

Моя проблема заключается в том, что каждый раз, когда я скомпилировать и запустить код, я получаю сообщение об ошибке сказав следующее:

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) 

Вот код:

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 
    } 

Я записал все нерелевантные части из код для ясности.

В чем проблема?

UPDATE: Я немного искал, как добавить внешнюю банку в мой путь к классам в IntelliJ, и я узнал, что мне нужно перейти к структуре проекта -> Модули -----> Зависимости, а затем мне нужно настройте мою библиотеку как зависимость.

Я пытался сделать это так:

img

Но я все еще получаю показано выше сообщение об ошибке.

+2

Код будет содержать банку PDFBox (и его зависимости, например, fontbox) в пути к классам. Это можно сделать с помощью Gradle, но для простого/простого примера, посмотрите «setvars.sh» в этом проекте - https://github.com/peidevs/OpenDataBookClub/tree/master/tools/PDF_Thresher –

+0

Не могли бы вы рассказать о что? Я не совсем понял, что это за файл setvars.sh и как он выполняется, и когда. Я также обновил этот пост и изображение. –

+1

Ваше изображение показывает, что у вас разные версии. Очевидно, что у вас тоже есть fontbox 2.0.3. –

ответ

0

Соглашение Java означает, что вы должны объявить свой код внутри класса.

Это означает, что каждый метод должен быть определен внутри класса с соответствующим именем для методов, которые он обертывает.

Например, вы можете использовать следующую структуру кода:

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 
    } 
} 

В примере выше StringUtils это имя класса виртуальная машина ищет.

Используя это соглашение, код скомпилирован в байтовый код и создает соответствующую банку, и, вероятно, это должно решить вашу ошибку.

Примечание. Убедитесь, что переменная PATH ENV содержит каталог рабочей области кода со всеми соответствующими сторонними каталогами.

1

Согласно параметров порядка snapshot of the project structure, он использует эти зависимости:

dependencies from snapshot

Это не может работать, варианты pdfbox и fontbox должны совпадать (как заметил по Tilman). В частности, версия 2 представила обновленный API. Таким образом, вряд ли можно ожидать, что версия PDFBox 2.0.x будет работать правильно вместе с FONTBox версии 1.8.y.

 Смежные вопросы

  • Нет связанных вопросов^_^