java - 错误: org. apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm无法转换为org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage

标签 java pdf pdfbox

我正在尝试使用 pdfbox 从 pdf 中提取图像。我从中得到了帮助post 。它对某些 pdf 有效,但对其他/大多数 pdf 无效。例如,我无法提取此 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());
 }
 }

////部分解决方案/////

我已经解决了错误消息的问题。我也在帖子中更新了正确的代码。然而,问题仍然存在。我仍然无法从一些文件中提取图像。就像我在这篇文章中提到的那样。这方面的任何解决方案。

最佳答案

原始代码的第一个问题是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

(即使这些并不总是完美的,see this answer)

第四个问题是您的文件根本没有任何 XObject。所有“图形”实际上都是 vector 图,它们无法像嵌入图像一样“提取”。你所能做的就是convert the PDF pages to images ,然后标记并剪切您需要的内容。

关于java - 错误: org. apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm无法转换为org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34989223/

相关文章:

asp.net-mvc - .Net Web API PDF 下载不工作

java - 如何使用自定义<tab>提取PDF文本?

java - PDFBox 使文本不可见

java - 是否有一个普遍考虑的标准来确定 PermGen 和 Heap 空间之间的适当比例?

Java:如何创建特定父类型而不是其子类型的集合?

html - 是@page :last really something?

java - 搜索 PDF 文件中的文本

java - Android PackageStats 给出负值

java - 将字符串(时间戳)转换为整数

android - 使用 Adob​​e Reader 在 Android 中打开 PDF