2015-04-14 4 views
0

Heyo, у меня есть проблемы с этим фрагментом кода:iTextPdf не загружая изображения правильно

private void createPDF(String[] url, String name) throws FileNotFoundException, DocumentException, IOException{ 
    com.itextpdf.text.Document document = new com.itextpdf.text.Document(); 
    FileOutputStream fos = new FileOutputStream(name); 
    PdfWriter writer = PdfWriter.getInstance(document, fos); 
    writer.open(); 
    document.open(); 
    document.setMargins(1, 0, 0, 0); 
    document.addTitle(name); 
    document.addSubject(name); 
    for (String url1 : url) { 
     Image i = Image.getInstance(new java.net.URL(url1)); 
     i.scaleToFit(document.getPageSize()); 
     document.add(i); 
     document.newPage(); 
     writer.flush(); 
    } 
    document.close(); 
    writer.close(); 
    } 

Изображения в формате JPEG, отформатированный и на сервере я использую IText-PDFA-5.5.5 с iText- xtra-5.5.5 через Maven.

Проблема заключается в том, что некоторые изображения отображаются неправильно, но, как разрезать пополам. Как я могу предотвратить это?

То, что я пытался до сих пор:

  • что вы видите выше
  • поджимать изображение с ImageIO

и с тем же результатом.

Пожалуйста, помогите мне.


хорошо я только что вставил (с GetImage неоспоримого от Bruno Lowagies код ниже)

BufferedImage read = ImageIO.read(new ByteArrayInputStream(getImage(new java.net.URL(url1)))); 
    ImageIO.write(read, "jpeg", new File(url1.substring(url1.length()-8, url1.length()))); 
    Image i = Image.getInstance(read, null); 

и файлов я получаю Арент полностью загруженный и нижнюю части изображения, кажется, заполнен # 808080

ответ

2

iText не меняет один байт изображения в формате JPG. Он просто берет полученные байты и помещает их внутри PDF в поток, определяющий /Filter как /DCTDecode, поэтому не должно быть проблем с импортом изображений JPG.

Однако, глядя на свой код, я вижу, что вы ожидаете Image объект, чтобы загрузить файл с URL: new java.net.URL(url1) и я помню людей, имеющих проблемы, схожие с вашими, потому что InputStream получается из URL объекта не всегда полностью читать, когда url1 не был URL-адресом файла, а URL-адресом некоторого изображения в Интернете.

Эта проблема была присуща читать InputStream S: Image нужно прочитать первые байты InputStream первых, чтобы определить тип изображения, а затем вернуться к началу InputStream читать полное изображение.

Чтобы обойти эту проблему, лучше сначала прочитать изображение в byte[] и использовать этот byte[] в качестве параметра для конструктора Image.

Что-то вроде этого:

public byte[] getImage(URL url) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    InputStream is = url.openStream(); 
    byte[] b = new byte[4096]; 
    int n; 
    while ((n = is.read(b)) > -1) { 
     baos.write(b, 0, n); 
    } 
    return baos.toByteArray(); 
} 

И потом:

Image i = Image.getInstance(getImage(new java.net.URL(url1))); 

Я написал эти фрагменты кода без тестирования. Пожалуйста, дайте мне знать, если они будут работать (или обновить мой ответ, если я сделал некоторые опечатки).

+0

Что должно быть byteChunk? б? – MiSt

+0

Правильно, это была опечатка. (Я всегда делаю хотя бы один, когда пишу код с манжеты.) –

+0

joa typos бывают: -P, но это не решает проблему. Я все еще получаю резкие снимки ... – MiSt