2017-06-22 34 views
5

jpgイメージをPDFに挿入しようとしています。一部のjpg画像は正常に動作しますが、例外的に次のような場合があります。itextを使用してpdfにjpgイメージを書き込んでいるときにJPG例外を読み込み中に早すぎるEOF

java.io.IOException: Premature EOF while reading JPG. 
    at com.itextpdf.text.Jpeg.processParameters(Jpeg.java:218) 
    at com.itextpdf.text.Jpeg.<init>(Jpeg.java:117) 
    at com.itextpdf.text.Image.getInstance(Image.java:279) 
    at com.itextpdf.text.Image.getInstance(Image.java:241) 
    at com.itextpdf.text.Image.getInstance(Image.java:364) 

以下は私が使用しているコードです。

import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Image; 
import com.itextpdf.text.pdf.PdfPCell; 
import com.itextpdf.text.pdf.PdfPTable; 
import com.itextpdf.text.pdf.PdfWriter; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class ImagesNextToEachOther { 

    public static final String DEST = "/home/Documents/pdftest/hello.pdf"; 

    public static final String IMG1 = "/home/Documents/pdftest/2.jpg"; 

    public static void main(String[] args) throws IOException, 
      DocumentException { 
     File file = new File(DEST); 
     file.getParentFile().mkdirs(); 
     new ImagesNextToEachOther().createPdf(DEST); 
    } 

    public void createPdf(String dest) throws IOException, DocumentException { 
     Document document = new Document(); 
     PdfWriter.getInstance(document, new FileOutputStream(dest)); 
     document.open(); 
     PdfPTable table = new PdfPTable(1); 
     table.setWidthPercentage(100); 
     table.addCell(createImageCell(IMG1)); 
     document.add(table); 
     document.close(); 
    } 

    public static PdfPCell createImageCell(String path) throws DocumentException, IOException { 
     Image img = Image.getInstance(path); 
     PdfPCell cell = new PdfPCell(img, true); 
     return cell; 
    } 
} 

私は上記のコードでは、次の行にエラーを取得しています。

Image img = Image.getInstance(path); 

path画像のフルパスです。

私はSO

Premature EOF while reading JPG using itext

Failure to read JPEG file from byte[]

に同様の質問を見つけました。しかし、これは私の問題を解決していませんでした。 Amedeeは​​すでに彼のコメントで説明したようにここで

は、このような画像の1

https://dl.dropboxusercontent.com/u/46349359/image.jpg

+3

例外を発生させるJPGファイルの1つをアップロードします。私はそれが非常に微妙な方法で壊れていると思います。 –

+0

@AmedeeVanGasseはサンプル画像で質問を更新しました。 – ashishjmeshram

答えて

7

へのリンクです、JPGが壊れています。 GIMPの画像を開いてFile > Overwrite image.jpgを選択すると、GIMPが画像を修正し、EOFエラーが消えて自分で確認できます。

私はあなたのためにこれを行っている、と結果は次のとおりです。あなたはこのイメージをダウンロードし、あなたのコードでそれを使用する場合は

enter image description here

、エラーは発生しません。

どのように役立ちますか?をお尋ねするかもしれません。 私はブラウザで画像を見ることができます。私はイメージビューアでイメージを見ることができます。 iTextでその問題を解決してみませんか?

答えは簡単です:JPGはPDFによってネイティブにサポートされています。つまり、すべてのJPGイメージバイトの正確なコピーをPDF内に置くことができます。しかし、これを行う前に、iTextは画像のサニティチェックを行います。この健全性チェックが失敗すると、iTextは画像を拒否します(そうしなければならない)。そのような「壊れた」画像を含むPDFには、使用するとエラーメッセージが表示される可能性が高いからです。

画像ビューアや画像編集ツール(GIMPなど)は、より寛容です。彼らはイメージがうまく形成されていないという事実を無視している。 GIMPの場合、ツールはエラーを修正し、修正を保存するためにイメージを「上書き」する機会を与えます。

現在、iTextにこのような修正が行われる予定はありません。私たちは壊れたTIFFファイルに対するこのような修正を提供しましたが、それでもデフォルトでは壊れた画像を拒否します。 iTextに壊れたTIFFファイルを修正させたい場合は、自動的に修正される画像を追加するリスクを取るよりも、多くのお客様が例外を取得する方が好きなのでフラグを設定する必要があります。あなたがiTextのお客様であれば、「壊れた画像の修正」機能をiTextに持たせるためのサポートリクエストを投稿することができます。あなたがでない場合、 iTextのお客様は、この修正プログラムを自分で追加し、プロジェクトのコードの残りの部分と共にAGPLの下にその修正を公開してください(ご存知のように、iTextのAGPLは、ほとんどの場合、プロジェクトの完全なソースコード)。

関連する問題