iTextPdf无法正确加载图像

时间:2015-04-14 16:34:06

标签: java pdf itext jpeg

Heyo,我对这段代码有疑问:

  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格式化的,在服务器上我通过Maven使用iText-pdfa-5.5.5和iText-xtra-5.5.5。

问题是,有些图片没有正确显示,但喜欢切成两半。我怎样才能防止这种情况发生?

到目前为止我尝试了什么:

  • 上面看到的内容
  • 使用ImageIO预加载图像

两者都有相同的结果。

请帮帮我。


好吧我刚插入(下面是Bruno Lowagies代码的getImage函数)

  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

1 个答案:

答案 0 :(得分:2)

iText不会改变JPG图像的单个字节。它只需要接收的字节数,并将它们放在PDF中定义/Filter/DCTDecode的流中,因此导入JPG图像应该没有问题。

但是,查看您的代码,我发现您希望Image对象从URL加载文件:new java.net.URL(url1)并且我记得有人遇到与您类似的问题,因为{{1}当InputStream不是文件网址时,从URL对象获取的内容始终无法完整阅读,但是网络上某些图片的网址。

这个问题是阅读url1所固有的:InputStream需要首先读取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();
}

我在没有测试的情况下编写了这些代码片段。如果他们有效,请告诉我(如果我犯了错误,请更新我的答案)。