2016-10-01 4 views
0

私はPDFBoxとGroovyを少し混乱させようとしています。私はPDType1Fontクラス 'getStringWidth()メソッドを使用して文字列の幅を把握しようとしています。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 
    } 

私は、すべての無関係な部分を降ろしましたわかりやすくするためのコードです。

何が問題ですか?

更新:IntelliJのクラスパスに外部jarを追加する方法を少し調べて、Project Structure - > Modules -----> Dependenciesに移動する必要があることを知りました。私のライブラリを依存関係として設定してください。

私はこのようにこれを実行しようとした:

img

しかし、私はまだ上記の描かれたエラーメッセージを取得しています。

+2

コードには、クラスパス上でPDFBox jar(およびfontboxなどの依存関係)が必要です。これはGradleで行うことができますが、単純な例ではこのプロジェクトの 'setvars.sh'をチェックしてください - https://github.com/peidevs/OpenDataBookClub/tree/master/tools/PDF_Thresher –

+0

詳細を教えてくださいそれ?私はこのsetvars.shファイルが何であるか、それがどのように実行され、どのように実行されるのかを正確に理解できませんでした。私もこの投稿をimageと更新しました。 –

+1

あなたの画像は、あなたが異なるバージョンを持っていることを示しています。明らかにfontbox 2.0.3も必要です。 –

答えて

0

Javaの規約では、クラス内にコードを宣言する必要があります。

つまり、ラップするメソッドに関連する名前を持つクラス内で各メソッドを定義する必要があります。 StringUtilsは、JVMが探しているクラス名である上記の例で

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

は、たとえば次のようなコード構造を使用することができます。

この規約を使用することによって、コードはバイトコードにコンパイルされ、関連するjarファイルが作成されます。おそらく、エラーを解決するはずです。

注:PATH ENV変数には、すべての関連するサードパーティのディレクトリを含むコードワークスペースディレクトリが含まれていることを確認してください。 OPのsnapshot of the project structureによると、彼はこれらの依存関係を使用しています

1

dependencies from snapshot

これは動作しないことができる、pdfboxとfontboxのバージョンは(Tilmanで述べたように)一致している必要があります。特にバージョン2では、オーバーホールされたAPIが導入されました。したがって、PDFBoxバージョン2.0.xは、FONTBoxバージョン1.8.yとともに正常に動作することはほとんどありません。

関連する問題