2016-10-01 127 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 
    } 

我記下了所有的不相關部分的代碼爲了清楚起見。

什麼問題?

更新:我搜索了一點關於如何將外部jar添加到IntelliJ中我的類路徑,我發現我需要去項目結構 - >模塊----->依賴項,然後我需要將我的庫配置爲依賴項。

我試圖做到這一點是這樣的:

img

但我仍然得到上述錯誤消息描述。

+2

該代碼將需要類路徑上的PDFBox jar(及其依賴項,如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的是類的名字在JVM所期待的。

通過使用該慣例,代碼被編譯爲字節碼並創建相關的jar,並且可能應該解決您的錯誤。

注意:確保您的PATH ENV變量包含代碼工作區目錄以及所有相關的第三方目錄。

1

按照OP的snapshot of the project structure,他使用這些依賴關係:

dependencies from snapshot

這可不行,PDFBOX和fontbox的版本必須匹配(由Tilman的評論)。特別是版本2引入了一個徹底的API。因此,一個PDFBox版本2.0.x很難被期望與FONTBox 1.8.y版一起正常工作。