Извлекать изображения из pdf с помощью pdfbox
Я пытаюсь извлечь изображения из pdf с помощью pdfbox. Пример pdf здесь
Но я получаю только пустые изображения.
Код я m пытается: -
public static void main(String[] args) {
PDFImageExtract obj = new PDFImageExtract();
try {
obj.read_pdf();
} catch (IOException ex) {
System.out.println("" + ex);
}
}
void read_pdf() throws IOException {
PDDocument document = null;
try {
document = PDDocument.load("C:\\Users\\Pradyut\\Documents\\MCS-034.pdf");
} catch (IOException ex) {
System.out.println("" + ex);
}
List pages = document.getDocumentCatalog().getAllPages();
Iterator iter = pages.iterator();
int i =1;
String name = null;
while (iter.hasNext()) {
PDPage page = (PDPage) iter.next();
PDResources resources = page.getResources();
Map pageImages = resources.getImages();
if (pageImages != null) {
Iterator imageIter = pageImages.keySet().iterator();
while (imageIter.hasNext()) {
String key = (String) imageIter.next();
PDXObjectImage image = (PDXObjectImage) pageImages.get(key);
image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i);
i ++;
}
}
}
}
Спасибо
Ответы
Ответ 1
Ниже класс GetImagesFromPDF
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();
}
}
}
Ответ 2
Вот код с использованием 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;
}
Ответ 3
Для 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);
}
}
}
}
Ответ 4
Вы можете использовать функцию PDPage.convertToImage()
, которая может конвертировать PDF-страницу в BufferedImage. Затем вы можете использовать BufferedImage для создания изображения.
Используйте следующую ссылку для более подробной информации:
- Все классы, выполненные в PDF, в PDFBox, вы можете получить
Apache PDFBox 1.8.3 API
- Здесь вы можете увидеть документацию, связанную с PDPage.
И не забывайте искать функцию PDPage.convertToImage()
в классе PDPage.
Ответ 5
Просто добавьте .jpeg
в конец вашего пути:
image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i + ".jpeg");
Это работает для меня.
Ответ 6
PDF состоит из кодированных JBIG2 изображений. Я не уверен, поддерживает ли pdfBox.
Ответ 7
Вместо вызова
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);