iTextPdf 没有正确加载图像
iTextPdf not loading Images correctly
嘿嘿,这段代码有问题:
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
iText 不会更改 JPG 图像的单个字节。它只是将接收到的字节放入 PDF 中,将 /Filter
定义为 /DCTDecode
,因此导入 JPG 图像应该没有问题。
但是,查看您的代码,我发现您希望 Image
对象从 URL: new java.net.URL(url1)
加载文件,我记得有人遇到过与您类似的问题因为当 url1
不是文件 URL 时,从 URL
对象获得的 InputStream
并不总是被完全读取,而是 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)));
我在没有测试的情况下编写了这些代码片段。请让我知道它们是否有效(如果我打错了字,请更新我的答案)。
嘿嘿,这段代码有问题:
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
iText 不会更改 JPG 图像的单个字节。它只是将接收到的字节放入 PDF 中,将 /Filter
定义为 /DCTDecode
,因此导入 JPG 图像应该没有问题。
但是,查看您的代码,我发现您希望 Image
对象从 URL: new java.net.URL(url1)
加载文件,我记得有人遇到过与您类似的问题因为当 url1
不是文件 URL 时,从 URL
对象获得的 InputStream
并不总是被完全读取,而是 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)));
我在没有测试的情况下编写了这些代码片段。请让我知道它们是否有效(如果我打错了字,请更新我的答案)。