我正在尝试使用pdfbox提取嵌入在pdf中的图像的图像元数据(和图像)。我有以下问题,
for each page i:
for each image j in page i:
extract metadata, output
create the image file in separate thread
现在,我有以下用于创建图像文件的代码,该代码包含在实现generate_image()
的{{1}}类中的FileWriting
方法中。从Runnable
调用此方法。代码如下:
run()
其中try {
File F=new File(figurename);
item.getImage().write2file( F );
} catch (Exception e) {
e.printStackTrace();
}
返回item.getImage()
个对象。如果我这样做而不创建一个单独的线程,它工作正常,但当我创建一个线程来执行此任务时,它显示以下错误:
PDXObjectImage
任何人都可以指出我哪里出错了吗?
答案 0 :(得分:2)
我怀疑您的问题是您在多个线程中使用相同的pdfbox类。
PDFBox线程安全吗?
没有!一次只能有一个线程访问单个文档。您可以拥有多个线程,每个线程都可以访问自己的PDDocument对象。
您应该考虑使用ThreadLocal
并保留一个PDDocument
或您正在使用的任何类别。类似的东西:
private ThreadLocal<PDDocument> localPdDocument = new ThreadLocal<PDDocument>() {
@Override
protected PDDocument initialValue() {
return new PDDocument();
}
};
...
PDDocument doc = localPdDocument.get();
...