生产过程从厂家获取图纸(PDF转图片,二进制流文件转PDF,二进制文件流转PNG\JEPG图片,下载PDF\PNG图纸到本地)
有些时候我们需要在项目中展示PDF,但是直接在浏览器中加入PDF展示的插件,存在兼容性问题,某些浏览器显示效果不理想,所以我们可以将PDF转为图片,然后以图片的方式展示。
产品 | 特点 |
---|---|
Apache 的 PDF box | 免费,速度稍慢 |
E-iceblue 的Spire.PDF | 收费,速度快,功能强大,支持转多种格式 |
文章目录
1. 引入依赖
如果是Maven程序,则在pom.xml进行如下配置,然后导入:
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox-tools -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.18</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.18</version>
</dependency>
<!-- https://mvnrepository.com/artifact/e-iceblue/spire.pdf -->
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>4.11.1</version>
</dependency>
<repositories>
<repository>
<id>com.e-iceblue</id>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
2. 实例一
- 实例化PdfDocument类的对象。
- 调用PdfDocument. loadFromFile(String filename)方法。
- 调用PdfDocument. getConvertOptions().setPdfToImageOptions(int bgTransparentValue)方法设置转换后的图片背景透明度。
- for循环PDF每一页,使用PdfDocument.saveAsImage(int pageIndex)方法将PDF页面保存为图片。
public static void main(String[] args) throws IOException {
PdfDocument pdfDocument = new PdfDocument();
pdfDocument.loadFromFile("D:\\File_liudy23\\test\\test02.pdf");
pdfDocument.getConvertOptions().setPdfToImageOptions(100);
for (int i = 0; i < pdfDocument.getPages().getCount(); i++) {
BufferedImage image = pdfDocument.saveAsImage(i);
File file = new File(String.format("D:\\File_liudy23\\test\\ToImage%d.png", i));
ImageIO.write(image, "PNG", file);
}
pdfDocument.close();
}
3. 实例二
1、get方法获取远端传过来的PDF二进制文件,在前端进行展示
public static void get(String url, Map<String, String> params, HttpServletResponse response) {
try {
log.info("get调用地址url=" + url + " 参数:" + params.toString());
CloseableHttpClient httpClient = HttpClients.createDefault();
for (String key : params.keySet()) {
String value = params.get(key);
if ("authorization".equals(key)) {
continue;
}
if (url.contains("?")) {
url += "&" + key + "=" + value;
} else {
url += "?" + key + "=" + value;
}
}
String authorization = "";
if (StringUtils.isNotEmpty(params.get("authorization"))) {
authorization = params.get("authorization");
}
HttpGet httpGet = new HttpGet(url);
httpGet.addHeader("Content-Type", "application/json;charset=UTF-8");
httpGet.setHeader("Accept", "application/json");
httpGet.setHeader("Authorization", authorization);
// 连接主机服务超时时间 请求超时时间 数据读取超时时间
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(10000)
.setConnectionRequestTimeout(10000)
.setSocketTimeout(10000)
.build();
httpGet.setConfig(requestConfig);
CloseableHttpResponse res = httpClient.execute(httpGet);
if (res.getStatusLine().getStatusCode() == 200) {
// 直接读取内容
HttpEntity entity = res.getEntity();
// 输出流
InputStream is = entity.getContent();
// 借助传过来的HttpServletResponse,生成输出流
ServletOutputStream os = response.getOutputStream();
byte[] bytes = new byte[1024];
int n;
while ((n = is.read(bytes)) != -1) {
// 需要加0,n,不然转换后的图片可能会失真
os.write(bytes, 0, n);
os.flush();
}
log.info("get调用返回:");
os.flush();
os.close();
is.close();
httpClient.close();
res.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
2、将请求远端链接,返回的内容以字符串的形式返回
public static String get(String url, Map<String, String> params) {
try {
log.info("get调用地址url=" + url + " 参数:" + params.toString());
CloseableHttpClient httpClient = HttpClients.createDefault();
for (String key : params.keySet()) {
String value = params.get(key);
if ("authorization".equals(key)) {
continue;
}
if (url.contains("?")) {
url += "&" + key + "=" + value;
} else {
url += "?" + key + "=" + value;
}
}
String authorization = "";
if (StringUtils.isNotEmpty(params.get("authorization"))) {
authorization = params.get("authorization");
}
HttpGet httpGet = new HttpGet(url);
httpGet.addHeader("Content-Type", "application/json;charset=UTF-8");
httpGet.setHeader("Accept", "application/json");
httpGet.setHeader("Authorization", authorization);
// 连接主机服务超时时间 请求超时时间 数据读取超时时间
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(10000)
.setConnectionRequestTimeout(10000)
.setSocketTimeout(10000)
.build();
httpGet.setConfig(requestConfig);
CloseableHttpResponse response = httpClient.execute(httpGet);
String resStr = null;
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
if (entity != null) {
// 可能包含结果,信息,修在链接等内容。
resStr = EntityUtils.toString(entity, "UTF-8");
}
log.info("get调用返回:" + resStr);
httpClient.close();
response.close();
}
return resStr;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
3、二进制流直接转换为图片
public static void get03(String url, Map<String, String> params, HttpServletResponse response) {
try {
logger.info("get调用地址url=" + url + " 参数:" + params.toString());
CloseableHttpClient httpClient = HttpClients.createDefault();
for (String key : params.keySet()) {
String value = params.get(key);
if ("authorization".equals(key)) {
continue;
}
if (url.contains("?")) {
url += "&" + key + "=" + value;
} else {
url += "?" + key + "=" + value;
}
}
String authorization = "";
if (ToolUtil.isNotEmpty(params.get("authorization"))) {
authorization = params.get("authorization");
}
HttpGet httpGet = new HttpGet(url);
// httpGet.addHeader("Content-Type", "application/json;charset=UTF-8");
// httpGet.setHeader("Accept", "application/json");
httpGet.setHeader("Authorization", authorization);
// 连接主机服务超时时间--请求超时时间--数据读取超时时间
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(10000)
.setConnectionRequestTimeout(10000)
.setSocketTimeout(10000)
.build();
httpGet.setConfig(requestConfig);
CloseableHttpResponse res = httpClient.execute(httpGet);
if (res.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = res.getEntity();
InputStream is = entity.getContent();
ServletOutputStream os = response.getOutputStream();
PDDocument pdDocument = PDDocument.load(is);
PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
BufferedImage bufferedImage = pdfRenderer.renderImage(0);
// todo 多页pdf待转化
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage,"png", byteArrayOutputStream);
byte[] bytes = byteArrayOutputStream.toByteArray();
os.write(bytes, 0, bytes.length);
// ImageIO.write(bufferedImage, "png", new File("D:\\tmp\\liudy23\\ToImage02.png"));
os.close();
is.close();
httpClient.close();
res.close();
}
} catch (Exception e) {
e.printStackTrace();
}
// return null;
}
4、pdf-pic
public static void pdfToImage02() throws IOException {
PdfDocument pdfDocument = new PdfDocument();
// pdfDocument.loadFromStream(in);
pdfDocument.loadFromFile("D:\\File_liudy23\\test\\test02.pdf");
BufferedImage bufferedImage = pdfDocument.saveAsImage(0);
// PDDocument pdDocument = PDDocument.load(Base64Utils.decodeFromString(base64String));
// PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
// BufferedImage bufferedImage = pdfRenderer.renderImage(0);
ImageIO.write(bufferedImage,"png", new File("D:\\File_liudy23\\test\\ToImage66.png"));
}
public static void pdfToImage03(HttpServletResponse response) throws IOException {
PdfDocument pdfDocument = new PdfDocument();
pdfDocument.loadFromFile("D:\\File_liudy23\\test\\test02.pdf");
BufferedImage bufferedImage01 = pdfDocument.saveAsImage(0);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bufferedImage01,"png", os);
System.out.println(Arrays.toString(os.toByteArray()));
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(os.toByteArray(), 0, os.toByteArray().length);
// PDDocument pdDocument = PDDocument.load(Base64Utils.decodeFromString(base64String));
// PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
// BufferedImage bufferedImage = pdfRenderer.renderImage(0);
// ImageIO.write(bufferedImage,"png", new File("ToImage.png"));
}
4. PDF-图片流-输出
@GetMapping("/img")
public void imgtest(HttpServletResponse response) throws IOException {
// 生成PDF二进制流文件
PdfDocument pdfDocument = new PdfDocument();
pdfDocument.loadFromFile("D:\\File_liudy23\\test\\test02.pdf");
BufferedImage bufferedImage = pdfDocument.saveAsImage(0);
// 图片流转二进制数组
ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
ImageIO.write(bufferedImage, "png", os);
byte[] bytes = os.toByteArray();
System.out.println(Arrays.toString(bytes));
ServletOutputStream outputStream = response.getOutputStream();
// outputStream.write(bytes);
outputStream.write(bytes,0,bytes.length);
}
5. 下载文件到本地
ImageIO.write(bufferedImage, "png", new File("D:\\tmp\\liudy23\\ToImage02.png"));
6. 调整图片清晰度
方法1:
public static void pdfToImage04() throws IOException {
InputStream is = new FileInputStream("D:\\File_liudy23\\test\\test02.pdf");
PDDocument pdDocument = PDDocument.load(is);
PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
BufferedImage bufferedImage = pdfRenderer.renderImage(0,5);
// pdfRenderer.renderImageWithDPI(0,350);
ImageIO.write(bufferedImage,"png", new File("D:\\File_liudy23\\test\\ToImage70.png"));
is.close();
}
// 调整清晰度函数
public BufferedImage renderImage(int pageIndex, float scale) throws IOException {
return this.renderImage(pageIndex, scale, ImageType.RGB);
}
public BufferedImage renderImageWithDPI(int pageIndex, float dpi) throws IOException {
return this.renderImage(pageIndex, dpi / 72.0F, ImageType.RGB);
}
方法2:
public static void pdfToImage02() throws IOException {
PdfDocument pdfDocument = new PdfDocument();
// pdfDocument.loadFromStream(in);
pdfDocument.loadFromFile("D:\\File_liudy23\\test\\test02.pdf");
// BufferedImage bufferedImage = pdfDocument.saveAsImage(0);
BufferedImage bufferedImage = pdfDocument.saveAsImage(0, PdfImageType.Bitmap, 500, 500);
// PDDocument pdDocument = PDDocument.load(Base64Utils.decodeFromString(base64String));
// PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
// BufferedImage bufferedImage = pdfRenderer.renderImage(0);
ImageIO.write(bufferedImage,"png", new File("D:\\File_liudy23\\test\\ToImage71.png"));
}
// 调整清晰度函数
public BufferedImage saveAsImage(int pageIndex, PdfImageType type, int dpiX, int dpiY) {
return this.spr (pageIndex, type, dpiX, dpiY).spr ();
}