2017-06-22 37 views
5

Tôi đang cố gắng chèn hình ảnh jpg vào PDF. Một số hình ảnh jpg hoạt động đúng nhưng trong một số trường hợp, tôi nhận được ngoại lệ sau.EOF sớm khi đọc ngoại lệ JPG trong khi viết hình ảnh jpg sang pdf bằng cách sử dụng itext

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) 

Dưới đây là mã tôi đang sử dụng.

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; 
    } 
} 

Tôi gặp lỗi trên dòng sau trong mã ở trên.

Image img = Image.getInstance(path); 

path là đường dẫn đầy đủ của hình ảnh.

tôi thấy câu hỏi tương tự trên SO

Premature EOF while reading JPG using itext

Failure to read JPEG file from byte[]

Nhưng điều này đã không giải quyết vấn đề của tôi.

Dưới đây là một liên kết đến một trong những hình ảnh như vậy

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

+3

Tải lên một trong các tệp JPG của bạn gây ra ngoại lệ. Tôi hy vọng nó sẽ bị phá vỡ theo một cách rất tinh tế. –

+0

@AmedeeVanGasse đã cập nhật các câu hỏi với hình ảnh mẫu. – ashishjmeshram

Trả lời

7

Như Amedee đã giải thích trong ý kiến ​​của mình, JPG bị hỏng. Bạn có thể tự kiểm tra điều này bằng cách mở hình ảnh trong GIMP và sau đó chọn File > Overwrite image.jpg, GIMP sẽ sửa hình ảnh và lỗi EOF sẽ biến mất.

Tôi đã làm điều này cho bạn, và kết quả là:

enter image description here

Nếu bạn tải hình ảnh này, và bạn sử dụng nó với mã của bạn, lỗi sẽ không xảy ra.

Điều đó giúp tôi như thế nào? bạn có thể yêu cầu. Tôi có thể xem hình ảnh trong trình duyệt. Tôi có thể thấy hình ảnh trong trình xem hình ảnh. Tại sao bạn không giải quyết vấn đề đó trong iText?

Câu trả lời rất đơn giản: JPG được hỗ trợ nguyên bản bởi PDF, có nghĩa là chúng tôi có thể sao chép chính xác tất cả các byte hình ảnh JPG bên trong PDF. Tuy nhiên, trước khi chúng tôi làm như vậy, iText thực hiện kiểm tra độ chính xác trên hình ảnh. Khi kiểm tra sanity này không thành công, iText sẽ (và nên) từ chối hình ảnh, bởi vì có khả năng cao rằng tệp PDF chứa hình ảnh "bị hỏng" này sẽ hiển thị thông báo lỗi nếu chúng tôi sử dụng.

Người xem hình ảnh hoặc công cụ chỉnh sửa hình ảnh (chẳng hạn như GIMP), có nhiều khả năng chịu đựng hơn. Họ bỏ qua thực tế là hình ảnh không được định dạng tốt. Trong trường hợp của GIMP, công cụ sửa lỗi và cho bạn cơ hội "ghi đè" hình ảnh để lưu các bản sửa lỗi.

Hiện tại không có kế hoạch để iText thực hiện các bản sửa lỗi như vậy. Chúng tôi đã cung cấp bản sửa lỗi cho tệp TIFF bị hỏng, nhưng ngay cả khi đó, mặc định là từ chối hình ảnh bị hỏng. Nếu bạn muốn iText sửa chữa tệp TIFF bị hỏng, bạn phải đặt cờ vì hầu hết khách hàng của chúng tôi muốn nhận ngoại lệ hơn là chịu rủi ro khi thêm hình ảnh được sửa tự động.Nếu bạn là khách hàng iText, vui lòng đăng yêu cầu hỗ trợ để có chức năng "sửa hình ảnh bị hỏng" tương tự như iText; nếu bạn là không phải là một khách hàng iText, vui lòng tự sửa lỗi này và xuất bản sửa lỗi theo AGPL cùng với phần còn lại của mã dự án của bạn (như bạn biết, AGPL của iText bắt buộc bạn phải xuất bản mã nguồn đầy đủ của dự án của bạn trong hầu hết các trường hợp).

Các vấn đề liên quan