JAVA如何实现将用户上传的PDF文件转换成图片并返回给用户

       很多曾经攻克过的难题都没有及时记录并分享,觉得有些可惜。趁着现在还单身,头还没秃,精力也还算旺盛,我便整理出一些自己曾经挑灯夜战、独立实现的还算有些成就感的项目需求,记录在个人博客上,希望能给拥有相同需求的同行提供一些参考。下面要说的这个需求,真的实现后,会发现其实并没有太多技术含量,分开来讲,也就两个步骤:(1)文件上传;(2)PDF转JPG。文件上传插件的使用没有太大的要求,只要能实现上传图片的功能就可以,关键是PDF转JPG的代码实现,博客上能找到很多相关的帖子,但并非都好用,下面分享的,是我亲测之后可以满足我项目需求的。

       先说需求:由于网站的某个流程中,需要角色A的用户上传一个可能是JPG格式也可能是PDF格式的文件,然后希望角色B的用户可以在PC端、APP端和微信公众号端都能实时查看下载这个文件到自己的设备上,并且要求这个文件在A4 纸上打印后的效果和原文件一样,能保证正常的使用。我的解决方案如下:

(1)首先对角色A的用户能够上传的文件格式进行前端限制,只允许上传JPG和PDF格式的文件(由于本身项目的特殊性,所以能够保证用户上传的该类文件一定是这两种格式中的一种)。

(2)对角色A的用户上传到服务器的文件进行后端校验并处理:  ①如果是图片格式(JPG/PNG)的文件,就直接保存,并把保存后的图片路径返回给前端。  ②如果是PDF格式的文件,仍旧保存这个文件,然后得到这个PDF文件在我们服务器的硬盘上的路径,然后调用PDF转JPG的工具类进行转换,如果转换成功,返回转成功的图片的文件路径;如果失败,则返回给前端错误提示,要求传入正确的文件,因为能够确定,标准的文件是一定能够转换成成功的。③如果用户上传的文件不是这两种格式的(虽然前端做了校验,但难免有恶意请求进来的情况,所以永远不要过度相信前端传来的数据,尤其是涉及到敏感操作的时候),则不保存文件,程序结束并返回错误提示。

         上传图片的插件有很多,我是使用FileUpload实现Servlet的文件上传,可参考这篇博客 https://blog.csdn.net/llkoio/article/details/78984466 来使用,此处就不花篇幅赘述。

 下面直接上代码!!!

package fileupload;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSON;

import DateUtil;

import PdfToPngUtils;

/**
 * 
 * @ClassName: PlUploadServlet
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @author hqq
 *
 */
public class PlUploadServlet extends HttpServlet {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static final Logger logger = Logger.getLogger(PlUploadServlet.class);

    public PlUploadServlet() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletReq
好的,以下是基于Spring Boot实现excelpdf上传到指定路径的代码示例: ```java import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import org.springframework.util.StringUtils; import java.io.*; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; @Service public class ExcelToPdfService { public String convertAndUpload(MultipartFile file, String outputPath) { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); try { // 读取Excel文件 Workbook workbook = new XSSFWorkbook(file.getInputStream()); // 创建PDF文件 PDDocument pdfDoc = new PDDocument(); // 遍历Excel文件中所有的sheet for (int i = 0; i < workbook.getNumberOfSheets(); i++) { PDPage page = new PDPage(); pdfDoc.addPage(page); PDPageContentStream contentStream = new PDPageContentStream(pdfDoc, page); // 设置字体样式 contentStream.setFont(PDType1Font.TIMES_ROMAN, 12); contentStream.beginText(); contentStream.newLineAtOffset(50, 700); // 将Excel文件中的数据写入PDF文件 for (int j = 0; j < workbook.getSheetAt(i).getLastRowNum(); j++) { StringBuilder sb = new StringBuilder(); sb.append(workbook.getSheetAt(i).getRow(j).getCell(0).getStringCellValue()); sb.append(": "); sb.append(workbook.getSheetAt(i).getRow(j).getCell(1).getStringCellValue()); contentStream.showText(sb.toString()); contentStream.newLine(); } contentStream.endText(); contentStream.close(); } // 将PDF文件保存到指定路径 File output = new File(outputPath + fileName.replaceAll(".xlsx", ".pdf")); pdfDoc.save(output); pdfDoc.close(); return output.getAbsolutePath(); } catch (Exception ex) { ex.printStackTrace(); return null; } } } ``` 本示例中,我们使用了Apache POI和Apache PDFBox库来读取Excel文件和创建PDF文件。首先,我们读取上传的Excel文件,然后遍历所有的sheet。对于每个sheet,我们创建一个新的PDF页面,将Excel文件中的数据写入PDF文件,并将PDF文件保存到指定路径。最后,我们返回输出PDF文件的绝对路径。 需要注意的是,本示例中只处理了一些基本情况,如需要对上传文件进行更严格的验证和异常处理,请根据实际需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值