2017-06-22 51 views
5

我試圖將jpg圖像插入到PDF中。一些JPG圖片可以正常工作,但在某些情況下,我會遇到以下異常。在使用itext將jpg圖像寫入pdf格式時讀取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[]

類似的問題,但這並沒有解決我的問題。

這裏有一個鏈接,例如圖像

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

+3

上傳導致異常的JPG文件之一。我希望它以一種非常微妙的方式被打破。 –

+0

@AmedeeVanGasse用示例圖像更新了問題。 – ashishjmeshram

回答

7

至於阿梅代在他的評論已經解釋過的,在JPG壞了。您可以通過打開GIMP中的圖像並選擇File > Overwrite image.jpg來自行檢查,GIMP將修復圖像,並且EOF錯誤將消失。

我這樣做對你來說,其結果是:

enter image description here

如果你下載這個形象,你與你的代碼中使用它,就不會發生錯誤。

這對我有幫助嗎?你可能會問。 我可以在瀏覽器中看到圖像。我可以在圖像查看器中看到圖像。你爲什麼不在iText中解決這個問題?

答案很簡單:PDF本地支持PDF,這意味着我們可以將所有JPG圖像字節的精確副本放入PDF中。但是,在我們這樣做之前,iText會對圖像執行完整性檢查。當這個完整性檢查失敗時,iText將會(也應該)拒絕該圖像,因爲如果我們使用它,包含這種「破碎」圖像的PDF很可能會顯示錯誤信息。

圖像瀏覽器或圖像編輯工具(如GIMP)更寬容。他們忽視了圖像不完整的事實。在GIMP的情況下,該工具可以修復錯誤,並讓您有機會「覆蓋」圖像以存儲修復。

目前還沒有計劃讓iText執行此類修復。我們已經爲破損的TIFF文件提供了這樣的修復,但即使如此,默認設置也是拒絕破碎的圖像。如果你想讓iText修復一個破損的TIFF文件,你必須設置一個標誌,因爲我們的大多數客戶喜歡得到一個異常,而不是冒着添加一個自動修復的圖像的風險。如果您是iText的客戶,請隨時發佈支持請求,以便爲iText提供類似的「損壞圖像修復」功能;如果您是而不是 iText客戶,請隨時自行添加此修復程序,並在AGPL下發布修補程序以及您項目的其餘代碼(如您所知,iText的AGPL使其必須爲您發佈在大多數情況下,您的項目的完整源代碼)。

相關問題