PDF Box генерирует пустые изображения из-за изображений в нем JBIG2
Позвольте мне сначала дать вам обзор моего проекта. У меня есть PDF, который мне нужно преобразовать в изображения (одно изображение на одну страницу), используя PDFBox
API и записать все эти изображения в новый PDF-файл, используя PDFBox
Сам API. По сути, преобразование PDF в PDF, который мы называем PDF Transcoding.
Для некоторых PDF-файлов, которые содержат изображения JBIG2, реализация PDFbox convertToImage()
Метод молча завершается сбоем без каких-либо исключений или ошибок и, наконец, создает PDF, но на этот раз просто с пустым содержимым (белым). Сообщение, которое я получаю на консоли:
Dec 06, 2013 5:15:42 PM org.apache.pdfbox.filter.JBIG2Filter decode
SEVERE: Can't find an ImageIO plugin to decode the JBIG2 encoded datastream.
Dec 06, 2013 5:15:42 PM org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap getRGBImage
SEVERE: Something went wrong ... the pixelmap doesn't contain any data.
Dec 06, 2013 5:15:42 PM org.apache.pdfbox.util.operator.pagedrawer.Invoke process
WARNING: getRGBImage returned NULL
Мне нужно знать, как решить эту проблему? У нас есть что-то вроде:
import org.apache.pdfbox.filter.JBIG2Filter;
который я не знаю, как реализовать.
Я ищу это, но безрезультатно. Может ли кто-нибудь предложить, пожалуйста?
4 ответа
Посмотрите на этот билет в PDFBox https://issues.apache.org/jira/browse/PDFBOX-1067. Я думаю, что ответ на ваш вопрос:
- чтобы убедиться, что у вас установлены плагины JAI и JAI-ImageIO для вашей версии Java: инструкции по достойной установке доступны здесь: http://docs.geoserver.org/latest/en/user/production/java.html
- использовать плагин JBIG2-imageio, (новые версии лицензируются под лицензией Apache2) https://github.com/levigo/jbig2-imageio/
У меня была такая же проблема, и я исправил ее, добавив эту зависимость в свой pom.xml:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>jbig2-imageio</artifactId>
<version>3.0.2</version>
</dependency>
Удачи.
У меня была точно такая же проблема. Я скачал jar из jbig2-imageio и просто включил его в библиотеки приложений моего проекта, и он работал прямо из коробки. Как сказал Адам, он использует GPL3.
Установка JAI, похоже, не нужна. Мне нужно было только скачать levigo-jbig2-imageio-1.6.5.jar, поместить его в папку моих jardency-jars и в eclipse добавить его в библиотеки путей сборки Java. https://github.com/levigo/jbig2-imageio/
import java.awt.image.BufferedImage
import org.apache.pdfbox.cos.COSName
import org.apache.pdfbox.pdmodel.PDDocument
import org.apache.pdfbox.pdmodel.PDPage
import org.apache.pdfbox.pdmodel.PDPageTree
import org.apache.pdfbox.pdmodel.PDResources
import org.apache.pdfbox.pdmodel.graphics.PDXObject
import org.apache.pdfbox.rendering.ImageType
import org.apache.pdfbox.rendering.PDFRenderer
import org.apache.pdfbox.tools.imageio.ImageIOUtil
import javax.imageio.ImageIO
import javax.imageio.spi.IIORegistry
import javax.imageio.spi.ImageReaderSpi
import javax.swing.*
import javax.swing.filechooser.FileNameExtensionFilter
public class savePDFAsImage{
String path = "c:/pdfImage/"
//allow pdf file selection for extracting
public static File selectPDF() {
File file = null
JFileChooser chooser = new JFileChooser()
FileNameExtensionFilter filter = new FileNameExtensionFilter("PDF", "pdf")
chooser.setFileFilter(filter)
chooser.setMultiSelectionEnabled(false)
int returnVal = chooser.showOpenDialog(null)
if (returnVal == JFileChooser.APPROVE_OPTION) {
file = chooser.getSelectedFile()
println "Please wait..."
}
return file
}
public static void main(String[] args) {
try {
// help to view list of plugin registered. check by adding JBig2 plugin and JAI plugin
ImageIO.scanForPlugins()
IIORegistry reg = IIORegistry.getDefaultInstance()
Iterator spIt = reg.getServiceProviders(ImageReaderSpi.class, false)
spIt.each(){
println it.getProperties()
}
testPDFBoxSaveAsImage()
testPDFBoxExtractImagesX()
} catch (Exception e) {
e.printStackTrace()
}
}
public static void testPDFBoxExtractImagesX() throws Exception {
PDDocument document = PDDocument.load(selectPDF())
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( + System.nanoTime() + ".png")
ImageIO.write(((org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) o).getImage(), "png", file)
}
}
}
document.close()
println "Extraction complete"
}
public static void testPDFBoxSaveAsImage() throws Exception {
PDDocument document = PDDocument.load(selectPDF().getBytes())
PDFRenderer pdfRenderer = new PDFRenderer(document)
for (int page = 0; page < document.getNumberOfPages(); ++page) {
BufferedImage bim = pdfRenderer.renderImageWithDPI(page,300, ImageType.BINARY)
// suffix in filename will be used as the file format
OutputStream fileOutputStream = new FileOutputStream(+ System.nanoTime() + ".png")
boolean b = ImageIOUtil.writeImage(bim, "png",fileOutputStream,300)
}
document.close()
println "Extraction complete"
}
}