Error: org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm cannot be cast to org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage
Error: org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm cannot be cast to org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage
我正在尝试使用 pdfbox 从 pdf 中提取图像。我从这个 post . It worked for some of the pdfs but for others/most it did not. For example, I am not able to extract the figures in this file
中得到了帮助
经过一些研究后,我发现 PDResources.getImages 已被弃用。所以,我正在使用 PDResources.getXObjects()。有了这个,我无法从 PDF 中提取任何图像,而是在控制台收到此消息:
org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm cannot be cast to org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage
现在我卡住了,找不到解决办法。如果有人可以,请提供帮助。
//////更新评论///
我正在使用 pdfbox-1.8.10
代码如下:
public void getimg ()throws Exception {
try {
String sourceDir = "C:/Users/admin/Desktop/pdfbox/mypdfbox/pdfbox/inputs/Yavaa.pdf";
String destinationDir = "C:/Users/admin/Desktop/pdfbox/mypdfbox/pdfbox/outputs/";
File oldFile = new File(sourceDir);
if (oldFile.exists()){
PDDocument document = PDDocument.load(sourceDir);
List<PDPage> list = document.getDocumentCatalog().getAllPages();
String fileName = oldFile.getName().replace(".pdf", "_cover");
int totalImages = 1;
for (PDPage page : list) {
PDResources pdResources = page.getResources();
Map pageImages = pdResources.getXObjects();
if (pageImages != null){
Iterator imageIter = pageImages.keySet().iterator();
while (imageIter.hasNext()){
String key = (String) imageIter.next();
Object obj = pageImages.get(key);
if(obj instanceof PDXObjectImage) {
PDXObjectImage pdxObjectImage = (PDXObjectImage) obj;
pdxObjectImage.write2file(destinationDir + fileName+ "_" + totalImages);
totalImages++;
}
}
}
}
} else {
System.err.println("File not exist");
}
}
catch (Exception e){
System.err.println(e.getMessage());
}
}
//// 部分解决方案/////
我已经解决了报错信息的问题。我也更新了 post 中的正确代码。但是,问题仍然存在。我仍然无法从少数文件中提取图像。就像我在这篇 post 中提到的那样。在这方面的任何解决方案。
原代码的第一个问题是XObjects可以是PDXObjectImage或PDXObjectForm,所以需要检查实例。第二个问题是代码不会递归地遍历 PDXObjectForm,表单也可以有资源。第三个问题(仅在 1.8 中)是您使用 getResources() 而不是 findResources(),getResources() 不检查更高级别。
1.8 的代码可以在这里找到:
https://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/ExtractImages.java?view=markup
可在此处找到 2.0 的代码:
https://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java?view=markup&sortby=date
(即使这些并不总是完美的,)
第四个问题是你的文件根本没有任何XObjects。所有 "graphics" 都是真正的矢量图,不能像嵌入图像那样 "extracted"。你所能做的就是convert the PDF pages to images,然后标记并剪切你需要的东西。
我正在尝试使用 pdfbox 从 pdf 中提取图像。我从这个 post . It worked for some of the pdfs but for others/most it did not. For example, I am not able to extract the figures in this file
中得到了帮助经过一些研究后,我发现 PDResources.getImages 已被弃用。所以,我正在使用 PDResources.getXObjects()。有了这个,我无法从 PDF 中提取任何图像,而是在控制台收到此消息:
org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm cannot be cast to org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage
现在我卡住了,找不到解决办法。如果有人可以,请提供帮助。
//////更新评论///
我正在使用 pdfbox-1.8.10
代码如下:
public void getimg ()throws Exception {
try {
String sourceDir = "C:/Users/admin/Desktop/pdfbox/mypdfbox/pdfbox/inputs/Yavaa.pdf";
String destinationDir = "C:/Users/admin/Desktop/pdfbox/mypdfbox/pdfbox/outputs/";
File oldFile = new File(sourceDir);
if (oldFile.exists()){
PDDocument document = PDDocument.load(sourceDir);
List<PDPage> list = document.getDocumentCatalog().getAllPages();
String fileName = oldFile.getName().replace(".pdf", "_cover");
int totalImages = 1;
for (PDPage page : list) {
PDResources pdResources = page.getResources();
Map pageImages = pdResources.getXObjects();
if (pageImages != null){
Iterator imageIter = pageImages.keySet().iterator();
while (imageIter.hasNext()){
String key = (String) imageIter.next();
Object obj = pageImages.get(key);
if(obj instanceof PDXObjectImage) {
PDXObjectImage pdxObjectImage = (PDXObjectImage) obj;
pdxObjectImage.write2file(destinationDir + fileName+ "_" + totalImages);
totalImages++;
}
}
}
}
} else {
System.err.println("File not exist");
}
}
catch (Exception e){
System.err.println(e.getMessage());
}
}
//// 部分解决方案/////
我已经解决了报错信息的问题。我也更新了 post 中的正确代码。但是,问题仍然存在。我仍然无法从少数文件中提取图像。就像我在这篇 post 中提到的那样。在这方面的任何解决方案。
原代码的第一个问题是XObjects可以是PDXObjectImage或PDXObjectForm,所以需要检查实例。第二个问题是代码不会递归地遍历 PDXObjectForm,表单也可以有资源。第三个问题(仅在 1.8 中)是您使用 getResources() 而不是 findResources(),getResources() 不检查更高级别。
1.8 的代码可以在这里找到: https://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/ExtractImages.java?view=markup
可在此处找到 2.0 的代码: https://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ExtractImages.java?view=markup&sortby=date
(即使这些并不总是完美的,
第四个问题是你的文件根本没有任何XObjects。所有 "graphics" 都是真正的矢量图,不能像嵌入图像那样 "extracted"。你所能做的就是convert the PDF pages to images,然后标记并剪切你需要的东西。