PDFBox error: "org.apache.pdfbox.rendering.PDFRenderer not found" when it is present
PDFBox error: "org.apache.pdfbox.rendering.PDFRenderer not found" when it is present
我正在为 Bitbucket Server 编写一个插件,我必须在其中处理将 PDF 渲染为图像的问题。为此,我使用 PDFBox。我有一个 pdfToPng
方法将被调用来进行处理,并且我已经修改了 PDF 渲染器,类似于 Apache 示例所建议的那样。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.rendering.PageDrawer;
import org.apache.pdfbox.rendering.PageDrawerParameters;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class PDFProcessor {
private static Logger logger = LoggerFactory.getLogger(PDFProcessor.class);
private static int _colorMode;
/**
* Convert a page of a PDF document into a colored PNG
* @param color color to use, 0 - black, 1- red
* @param fileName output file
* @param pdfFile PDF to process
* @throws IOException
*/
public static void pdfToPng(int color, String fileName, File pdfFile) throws IOException{
_colorMode = color;
try (PDDocument pdfDoc = PDDocument.load(pdfFile)){
logger.info("Begin PDF to PNG render for " + fileName);
PDFRenderer renderer = new CustomPdfRenderer(pdfDoc);
BufferedImage image = renderer.renderImageWithDPI(0,600);
logger.info("Making PNG transparent...");
BufferedImage transparentImage = ImageProcessor.makeTransparent(image,new Color(image.getRGB(0,0)));
ImageIO.write(transparentImage, "PNG",new File(fileName+".png"));
logger.info("Image processed successfully, writing to " + fileName + ".png");
}
}
private static class CustomPdfRenderer extends PDFRenderer{
CustomPdfRenderer(PDDocument document){
super(document);
}
@Override
protected PageDrawer createPageDrawer(PageDrawerParameters params) throws IOException{
return new CustomPageDrawer(params);
}
}
private static class CustomPageDrawer extends PageDrawer{
CustomPageDrawer(PageDrawerParameters params) throws IOException{
super(params);
}
@Override
protected Paint getPaint(PDColor color) throws IOException{
if ((color.toRGB() == (Color.BLACK.getRGB() & 0x00FFFFFF)) && (_colorMode == 1)){
return Color.RED;
}
return super.getPaint(color);
}
}
}
该项目是使用Maven构建的,因为这是BitBucket用于插件开发的时候。但是,当实际调用该方法时,我得到一个 ClassNotFound
异常说明:
[INFO] Caused by: java.lang.NoClassDefFoundError: org/apache/pdfbox/rendering/PDFRenderer
[INFO] at com.my-plugin.DiffManager.prepareDiff(DiffManager.java:99)
[INFO] at com.my-plugin.DiffManager.doGet(DiffManager.java:67)
[INFO] at com.my-plugin.DiffManager.doPost(DiffManager.java:84)
[INFO] ... 33 common frames omitted
[INFO] Caused by: java.lang.ClassNotFoundException: org.apache.pdfbox.rendering.PDFRenderer not found by com.my-plugin.integrationPlugin [219]
[INFO] at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
[INFO] ... 36 common frames omitted
如您所见,我已经导入了 PDFRenderer
class。我的 pom.xml
也包含正确的依赖定义:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.14</version>
<scope>provided</scope>
</dependency>
为什么 Java 找不到 PDFRenderer
class?以这种方式声明的其他依赖项从来没有这个问题。
您正在使用 pdfbox
与 <scope>provided</scope>
的依赖关系。您希望谁在需要时提供这种依赖性?像 Tomcat?
这样的应用程序容器
我建议您删除 scope
行,这样依赖将隐含在 compile
范围内,这应该可以解决您的问题。
请同时参考 Maven scope docs 上面写着:
compile
– 这是默认范围,如果指定 none 则使用。编译依赖项在项目的所有类路径中都可用。
provided
– 这很像编译,但表示您希望 JDK 或容器在运行时提供依赖项。
我正在为 Bitbucket Server 编写一个插件,我必须在其中处理将 PDF 渲染为图像的问题。为此,我使用 PDFBox。我有一个 pdfToPng
方法将被调用来进行处理,并且我已经修改了 PDF 渲染器,类似于 Apache 示例所建议的那样。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.rendering.PageDrawer;
import org.apache.pdfbox.rendering.PageDrawerParameters;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class PDFProcessor {
private static Logger logger = LoggerFactory.getLogger(PDFProcessor.class);
private static int _colorMode;
/**
* Convert a page of a PDF document into a colored PNG
* @param color color to use, 0 - black, 1- red
* @param fileName output file
* @param pdfFile PDF to process
* @throws IOException
*/
public static void pdfToPng(int color, String fileName, File pdfFile) throws IOException{
_colorMode = color;
try (PDDocument pdfDoc = PDDocument.load(pdfFile)){
logger.info("Begin PDF to PNG render for " + fileName);
PDFRenderer renderer = new CustomPdfRenderer(pdfDoc);
BufferedImage image = renderer.renderImageWithDPI(0,600);
logger.info("Making PNG transparent...");
BufferedImage transparentImage = ImageProcessor.makeTransparent(image,new Color(image.getRGB(0,0)));
ImageIO.write(transparentImage, "PNG",new File(fileName+".png"));
logger.info("Image processed successfully, writing to " + fileName + ".png");
}
}
private static class CustomPdfRenderer extends PDFRenderer{
CustomPdfRenderer(PDDocument document){
super(document);
}
@Override
protected PageDrawer createPageDrawer(PageDrawerParameters params) throws IOException{
return new CustomPageDrawer(params);
}
}
private static class CustomPageDrawer extends PageDrawer{
CustomPageDrawer(PageDrawerParameters params) throws IOException{
super(params);
}
@Override
protected Paint getPaint(PDColor color) throws IOException{
if ((color.toRGB() == (Color.BLACK.getRGB() & 0x00FFFFFF)) && (_colorMode == 1)){
return Color.RED;
}
return super.getPaint(color);
}
}
}
该项目是使用Maven构建的,因为这是BitBucket用于插件开发的时候。但是,当实际调用该方法时,我得到一个 ClassNotFound
异常说明:
[INFO] Caused by: java.lang.NoClassDefFoundError: org/apache/pdfbox/rendering/PDFRenderer
[INFO] at com.my-plugin.DiffManager.prepareDiff(DiffManager.java:99)
[INFO] at com.my-plugin.DiffManager.doGet(DiffManager.java:67)
[INFO] at com.my-plugin.DiffManager.doPost(DiffManager.java:84)
[INFO] ... 33 common frames omitted
[INFO] Caused by: java.lang.ClassNotFoundException: org.apache.pdfbox.rendering.PDFRenderer not found by com.my-plugin.integrationPlugin [219]
[INFO] at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
[INFO] ... 36 common frames omitted
如您所见,我已经导入了 PDFRenderer
class。我的 pom.xml
也包含正确的依赖定义:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.14</version>
<scope>provided</scope>
</dependency>
为什么 Java 找不到 PDFRenderer
class?以这种方式声明的其他依赖项从来没有这个问题。
您正在使用 pdfbox
与 <scope>provided</scope>
的依赖关系。您希望谁在需要时提供这种依赖性?像 Tomcat?
我建议您删除 scope
行,这样依赖将隐含在 compile
范围内,这应该可以解决您的问题。
请同时参考 Maven scope docs 上面写着:
compile
– 这是默认范围,如果指定 none 则使用。编译依赖项在项目的所有类路径中都可用。provided
– 这很像编译,但表示您希望 JDK 或容器在运行时提供依赖项。