Приложение pdfbox fat jar выдает сообщение "Невозможно прочитать изображение JBIG2: jbig2-imageio не установлен", но работает нормально при запуске из IDE
Я столкнулся с проблемой при создании приложения, использующего pdfbox. Приложение может читать книги с изображениями jbig2, когда я запускаю его из IDE (я использую netbeans 8.1) (у меня есть зависимости maven для jbig2 в pom.xml). Проблема в том, что когда я создаю приложение, создающее толстую банку. Когда я запускаю толстую банку с тем же входным PDF-файлом, он дает следующую ошибку:
“Cannot read JBIG2 image: jbig2-imageio is not installed”
Потоки, которые комментируют эту ошибку, похоже, не решают мою проблему (они говорят, что зависимость maven должна быть добавлена к pom, но эта зависимость уже находится на моем pom).
Я также проверил, что классы библиотеки jbig2 находятся внутри толстой банки, поэтому я понятия не имею, что происходит.
Я выделил проблему в маленьком приложении, которое выглядит так:
public static void main( String[] args )
{
String fileName = null;
if( args.length == 0 )
{
fileName = "test.pdf";
}
else
{
fileName = args[0];
}
PdfDocumentWrapper doc = null;
try
{
PdfboxFactory factory = new PdfboxFactory();
doc = factory.createPdfDocumentWrapper();
doc.loadPdf( fileName );
for( int ii = 0; ii < doc.getNumberOfPages(); ii++ )
{
int pageNum = ii+1;
System.out.println("\n\nProcessing page: " + pageNum +"\n---------------------------------");
List<ImageWrapper> imageList = doc.getImagesOfPage(ii);
int jj=0;
for( ImageWrapper image: imageList )
{
jj++;
System.out.println(String.format(" Page[%d]. Image[%d] -> bounds: %s",
pageNum, jj, image.getBounds().toString() ) );
}
}
}
catch( Exception ex )
{
ex.printStackTrace();
}
finally
{
if( doc != null )
{
try
{
doc.close();
}
catch( Exception ex )
{
ex.printStackTrace();
}
}
}
}
Я разместил здесь весь изолированный пример проекта (с целью помочь решить проблему):http://www.frojasg1.com/20200504.PdfImageExtractor.zip
Когда я запускаю это приложение из IDE, оно дает следующий результат:
Processing page: 1
---------------------------------
Page[1]. Image[1] -> bounds: java.awt.Rectangle[x=17,y=33,width=442,height=116]
Page[1]. Image[2] -> bounds: java.awt.Rectangle[x=53,y=513,width=376,height=124]
Page[1]. Image[3] -> bounds: java.awt.Rectangle[x=101,y=250,width=285,height=5]
------------------------------------------------------------------------
Когда я запускаю приложение из командной строки, оно дает следующий результат:
$ java -jar ./PdfImageExtractor-v1.0-SNAPSHOT-all.jar
Processing page: 1
---------------------------------
may 04, 2020 3:40:18 PM org.apache.pdfbox.contentstream.PDFStreamEngine operatorException
GRAVE: Cannot read JBIG2 image: jbig2-imageio is not installed
may 04, 2020 3:40:18 PM org.apache.pdfbox.contentstream.PDFStreamEngine operatorException
GRAVE: Cannot read JBIG2 image: jbig2-imageio is not installed
may 04, 2020 3:40:18 PM org.apache.pdfbox.contentstream.PDFStreamEngine operatorException
GRAVE: Cannot read JBIG2 image: jbig2-imageio is not installed
Кто-нибудь знает, почему толстая банка не может читать изображения jbig2?
3 ответа
Если кто-то наткнется здесь на ту же ошибку:Cannot read JBIG2 image: jbig2-imageio is not installed
при чтении файла PDF с помощью Apache PDFBox сначала необходимо убедиться, что у вас есть дополнительныйorg.apache.pdfbox:jbig2-imageio
зависимость в вашем пути к классам.
Тогда вам также может потребоваться вызовImageIO.scanForPlugins()
как отмечается вREADME.md
принадлежащийpdfbox-jbig2
библиотека (в моем случае это было не нужно).
Для получения дополнительной информации обратитесь к разделу JAI Image I/O в документах PDFBox, в котором также рассматривается чтение изображений JBIG2.
Я отправил тот же вопрос в список рассылки пользователей pdfbox, и вот ответ:
Your fat-jar consists of several ImageIO libs. You are simply merging all files
to one big jar and overwriting the config files of those ImageIO libs. Have a
look at the directory "/META-INF/services". The files of the JBig" plugin are
overwritten by files of another plugin. Either you merge those files or don't
create one big jar of all deps.
И решение:
Спасибо большое, вот что!
Мне удалось создать эти файлы META-INF:
$ find src/serviceManifests/
src/serviceManifests/
src/serviceManifests/META-INF
src/serviceManifests/META-INF/services
src/serviceManifests/META-INF/services/javax.imageio.spi.ImageReaderSpi
src/serviceManifests/META-INF/services/javax.imageio.spi.ImageWriterSpi
объединяя их с банками ImageIO
Добавив эти строки в pom.xml:
<properties>
<service.declaration.dir>src/serviceManifests</service.declaration.dir>
<service.files.path>META-INF/services</service.files.path>
</properties>
<build>
<resources>
...
<resource>
<directory>${service.declaration.dir}</directory>
<includes>
<include>${service.files.path}/*</include>
</includes>
</resource>
...
</resources>
...
</build>
Проблема решена.
добавить ImageIO.scanForPlugins(); перед ImageIO.scanForPlugins(); тоже можно решить эту проблему