Жирный jar приложения pdfbox выдает «Не удается прочитать образ JBIG2: jbig2-imageio не установлен», но работает нормально, работает из IDE - PullRequest
1 голос
/ 04 мая 2020

Я столкнулся с проблемой при создании приложения, использующего pdfbox. Приложение может читать книги с изображениями jbig2, когда я запускаю его из IDE (я использую netbeans 8.1) (у меня есть maven зависимости для jbig2 в pom. xml). Проблема в том, когда я создаю приложение, создающее толстую банку Когда я запускаю толстый jar с тем же входным 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?

1 Ответ

0 голосов
/ 04 мая 2020

Я отправил тот же вопрос в список рассылки пользователей 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>

Проблема решена.

...