使用PDFBox添加网络图片时抛出IIOException异常求助
解决PDFBox加载网络图片时的
javax.imageio.IIOException错误 嘿,我一眼就看出问题出在哪了——你用错方法啦!PDImageXObject.createFromFile()这个方法是专门用来读取本地文件的,它根本不认识网络URL。当你把https://XXXXXX.png传进去的时候,它会把这个字符串当成本地文件路径去找,自然找不到对应的文件,直接抛出了"无法读取输入文件"的异常。
给你两个可行的解决方案,推荐第一个,更高效:
方案一:直接通过网络流加载图片
先通过Java的URL类获取远程图片的输入流,再用PDFBox的createFromInputStream()方法来创建图片对象,代码如下:
PDPage page = doc.getPage(0); try { // 获取远程图片的输入流 URL imageUrl = new URL("https://XXXXXX.png"); InputStream imageStream = imageUrl.openStream(); // 从输入流创建PDImageXObject,第一个参数是图片的名称(仅用于PDF内部标识,随便填即可) PDImageXObject pdImage = PDImageXObject.createFromInputStream("remote-image.png", imageStream, doc); // 绘制图片到PDF页面 PDPageContentStream contents = new PDPageContentStream(doc, page); contents.drawImage(pdImage, 70, 250); // 记得关闭资源,避免内存泄漏 contents.close(); imageStream.close(); } catch (MalformedURLException e) { // 处理URL格式错误的情况 e.printStackTrace(); } catch (IOException e) { // 处理网络请求或PDF操作的IO异常 e.printStackTrace(); }
方案二:先下载图片到本地临时文件再加载
如果你的场景需要重复使用这张图片,或者担心网络不稳定,也可以先把图片下载到本地临时文件,再用createFromFile()读取:
PDPage page = doc.getPage(0); try { // 下载图片到临时文件 URL imageUrl = new URL("https://XXXXXX.png"); Path tempFile = Files.createTempFile("pdf-image-", ".png"); Files.copy(imageUrl.openStream(), tempFile, StandardCopyOption.REPLACE_EXISTING); // 从本地临时文件创建PDImageXObject PDImageXObject pdImage = PDImageXObject.createFromFile(tempFile.toString(), doc); // 绘制图片 PDPageContentStream contents = new PDPageContentStream(doc, page); contents.drawImage(pdImage, 70, 250); // 关闭资源并删除临时文件(可选,根据需求决定是否保留) contents.close(); Files.deleteIfExists(tempFile); } catch (IOException e) { e.printStackTrace(); }
注意事项
- 一定要处理
MalformedURLException和IOException这些检查型异常,要么在方法上声明抛出,要么用try-catch捕获处理 - 方案一的输入流方式更节省磁盘空间,也更高效,推荐优先使用
内容的提问来源于stack exchange,提问作者Dhaval Goti
相关产品推荐
相关产品推荐

