Извлечение только изображений из файла PDF в java с помощью Apache Tika или PDFBox? [Дубликат]

Симон Моурир дал этот пример :

object o = null;
DateTime d = (DateTime)o;  // NullReferenceException

, где unboxing преобразование (литье) из object (или из одного из классов System.ValueType или System.Enum или из типа интерфейса) - тип значения (кроме Nullable<>) сам по себе дает NullReferenceException.

В другом направлении конверсия бокса из a Nullable<>, которая имеет HasValue, равную false , на ссылочный тип, может дать ссылку null, которая затем может привести к NullReferenceException. Классический пример:

DateTime? d = null;
var s = d.ToString();  // OK, no exception (no boxing), returns ""
var t = d.GetType();   // Bang! d is boxed, NullReferenceException

Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:

public static void MyExtension(this object x)
{
  x.ToString();
}

следующий код будет проблематичным:

DateTime? d = null;
d.MyExtension();  // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.

Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<> экземпляров.

21
задан Pradyut Bhattacharya 2 January 2012 в 23:30
поделиться

7 ответов

PDF состоит из кодированных JBIG2 изображений. Я не уверен, поддерживает ли pdfBox.

0
ответ дан mark stephens 31 August 2018 в 16:58
поделиться

Вот код с использованием PDFBox 2.0.1, который получит список всех изображений из PDF. Это отличается от другого кода тем, что он рекурсирует через документ вместо того, чтобы пытаться получить изображения с верхнего уровня.

public List<RenderedImage> getImagesFromPDF(PDDocument document) throws IOException {
        List<RenderedImage> images = new ArrayList<>();
    for (PDPage page : document.getPages()) {
        images.addAll(getImagesFromResources(page.getResources()));
    }

    return images;
}

private List<RenderedImage> getImagesFromResources(PDResources resources) throws IOException {
    List<RenderedImage> images = new ArrayList<>();

    for (COSName xObjectName : resources.getXObjectNames()) {
        PDXObject xObject = resources.getXObject(xObjectName);

        if (xObject instanceof PDFormXObject) {
            images.addAll(getImagesFromResources(((PDFormXObject) xObject).getResources()));
        } else if (xObject instanceof PDImageXObject) {
            images.add(((PDImageXObject) xObject).getImage());
        }
    }

    return images;
}
12
ответ дан Matt 31 August 2018 в 16:58
поделиться

Вместо вызова

image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i);

Вы можете использовать статический метод ImageIO.write() для записи изображения RGB в любом формате, в котором вы нуждаетесь. Здесь я использовал PNG:

File outputFile = new File( "C:\\Users\\Pradyut\\Documents\\image" + i + ".png");
ImageIO.write( image.getRGBImage(), "png", outputFile);
0
ответ дан nickb 31 August 2018 в 16:58
поделиться

Для PDFBox 2.0.1 ответ pudaykiran должен быть слегка изменен, поскольку некоторые API были изменены.

public static void testPDFBoxExtractImages() throws Exception {
    PDDocument document = PDDocument.load(new File("D:/Temp/Test.pdf"));
    PDPageTree list = document.getPages();
    for (PDPage page : list) {
        PDResources pdResources = page.getResources();
        for (COSName c : pdResources.getXObjectNames()) {
            PDXObject o = pdResources.getXObject(c);
            if (o instanceof org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) {
                File file = new File("D:/Temp/" + System.nanoTime() + ".png");
                ImageIO.write(((org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject)o).getImage(), "png", file);
            }
        }
    }
}
7
ответ дан PerseusBC 31 August 2018 в 16:58
поделиться

Ниже [j2] java класс получает все изображения в файле 04-Request-Headers.pdf и сохраняет эти файлы в папке назначения PDFCopy.

import java.io.File;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;

@SuppressWarnings({ "unchecked", "rawtypes", "deprecation" })
public class GetImagesFromPDF {
    public static void main(String[] args) {
        try {
            String sourceDir = "C:/PDFCopy/04-Request-Headers.pdf";// Paste pdf files in PDFCopy folder to read
            String destinationDir = "C:/PDFCopy/";
            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.getImages();
                if (pageImages != null) {

                    Iterator imageIter = pageImages.keySet().iterator();
                    while (imageIter.hasNext()) {
                        String key = (String) imageIter.next();
                        PDXObjectImage pdxObjectImage = (PDXObjectImage) pageImages.get(key);
                        pdxObjectImage.write2file(destinationDir + fileName+ "_" + totalImages);
                        totalImages++;
                    }
                }
            }
        } else {
            System.err.println("File not exists");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

10
ответ дан pudaykiran 31 August 2018 в 16:58
поделиться

Просто добавьте .jpeg в конец вашего пути:

image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i + ".jpeg");

Это работает для меня.

2
ответ дан t0mm13b 31 August 2018 в 16:58
поделиться

Вы можете использовать функцию PDPage.convertToImage(), которая может конвертировать PDF-страницу в BufferedImage. Затем вы можете использовать BufferedImage для создания изображения.

Используйте следующую ссылку для более подробной информации:

  • Все классы, разрешенные PDF, в PDFBox вы можете попасть в Apache PDFBox 1.8.3 API
  • Здесь вы можете увидеть документацию, связанную с PDPage.

И не забудьте найти функцию PDPage.convertToImage() в классе PDPage.

3
ответ дан рüффп 31 August 2018 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: