#1.如何实现本地上传pdf文件同时转化为多张单页图片上传到OSS服务器:
在这里插入代码片
//本地上传协议 pdf 和 多张分页的jpg/png到服务器的方法:
public String insertProtocol(MultipartFile file) throws IOException {
/*-------------------------上传协议 start ---------------------*/
//根据文件名进行查重,判断是否已经上传过该文件
String fileName = file.getOriginalFilename().replaceAll(" ", "");
String[] split = fileName.split("\\.");
String s = split[0];
Map<String, Object> map = new HashMap<String, Object>();
map.put("protocolName", s);
List<Map<String, Object>> list = protocolDao.list(map);
if (list.size() > 0) {
return "请不要重复上传!";
}
//判断上传的文件是否是pdf格式的:
if (!file.getOriginalFilename().endsWith(".pdf")) {
return "选择的文件格式错误,请刷新重试!";
}
//获取上传文件的大小-插表
Protocol protocol=new Protocol();
if (file != null && file.getSize() != 0) {
long size = file.getSize();
protocol.setProtocolSize(size);
String fileFormat = ".pdf";
//获取文件名+后缀
// map.put("protocolName", s);
String ossPath = s + fileFormat;
//上传文件
//实例化ossFUtils工具类,否则报空指针:
OssFUtils ossFUtils = OssFUtils.getInstance();
//获取文件流:
InputStream inputStreamPDF = file.getInputStream();
//以流的形式调用阿里云的上传文件方法将文件上传到服务器
String descPath =ossFUtils.uploadFile("tope365-agent", inputStreamPDF, "agent/protocol/" + ossPath);
//获取文件在服务器上的下载地址:
String protocolyUrl ="";
//可直接下载地址
if(descPath !=null){
protocolyUrl = descPath.replace("tope365-agent@", properties.getProperty("tope365_agent_domain"));
}
//将下载地址更新入库:
protocol.setUploadUrl(protocolyUrl);
/*-------------------------上传协议 end ---------------------*/
/*-------------------------pdf转jpg start ---------------------*/
//合同文件对应的预览图片上传到oss 属性设置
String fileExtensionImg = ".jpg";
String newFileNameImg = s + fileExtensionImg;
String osspathImg = "agent/protocol/" + newFileNameImg;
InputStream inputStreamJpg = file.getInputStream();
// 应用pdfbox相关依赖,加载解析PDF文件
PDDocument doc = PDDocument.load(inputStreamJpg);
PDFRenderer pdfRenderer = new PDFRenderer(doc);
//获取文件页数
PDPageTree pages = doc.getPages();
int pageCount = pages.getCount();
for (int i = 0; i < pageCount; i++) {
//dpi参数越大,越清晰
BufferedImage bim = pdfRenderer.renderImageWithDPI(i, 200);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bim, "jpg", os);
byte[] datas = os.toByteArray();
inputStreamJpg = new ByteArrayInputStream(datas);
//若pdf合同只有一页
ossFUtils = OssFUtils.getInstance();
if (i == 0) {
//上传一页jpg
ossFUtils.uploadFile("tope365-agent", inputStreamJpg, osspathImg);
} else {
//若文件有多页
newFileNameImg = s + "_" + (++i) + "_" + fileExtensionImg;
osspathImg = "agent/protocol/" + newFileNameImg;
//上传多页jpg
ossFUtils.uploadFile("tope365-agent", inputStreamJpg, osspathImg);
}
}
}
/*------------------------pdf转jpg end ---------------------*/
//入库
//protocol.setProtocolName(s);
//protocol.setProtocolType(0);
//protocol.preInsert();
//this.protocolDao.insert(protocol);
return "上传成功!";
}
辅助:
引入依赖:注:使用pdf转图片时需要在pom中引入三个jar包,缺一不可:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>2.0.1</version>
</dependency>