以下两个方法引入头
import com.lowagie.text.*;import com.lowagie.text.pdf.PdfWriter;import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.rendering.ImageType;import org.apache.pdfbox.rendering.PDFRenderer;import org.springframework.stereotype.Component;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.awt.image.BufferedImage;import java.io.*;import java.nio.file.Files;import java.nio.file.Paths;import java.util.List;
1、图片转pdf文件
pom 文件引入
com.lowagie itext 2.1.7
public File imageToPdf(ListimageUrllist, String mOutputPdfFileName) { String TAG = "PdfManager"; Document doc = new Document(PageSize.A4, 20, 20, 20, 20); try { PdfWriter.getInstance(doc, new FileOutputStream(mOutputPdfFileName)); doc.open(); for (int i = 0; i < imageUrllist.size(); i++) { doc.newPage();// doc.add(new Paragraph("简单使用iText")); Image png1 = Image.getInstance(imageUrllist.get(i)); float heigth = png1.getHeight(); float width = png1.getWidth(); int percent = getPercent2(heigth, width); png1.setAlignment(Image.MIDDLE); png1.scalePercent(percent+3);// 表示是原来图像的比例; doc.add(png1); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { doc.close(); } File mOutputPdfFile = new File(mOutputPdfFileName); if (!mOutputPdfFile.exists()) { mOutputPdfFile.deleteOnExit(); return null; } return mOutputPdfFile; }
/** * 第一种解决方案 在不改变图片形状的同时,判断,如果h>w,则按h压缩,否则在w>h或w=h的情况下,按宽度压缩 * * @param h * @param w * @return */ private int getPercent(float h, float w) { int p = 0; float p2 = 0.0f; if (h > w) { p2 = 297 / h * 100; } else { p2 = 210 / w * 100; } p = Math.round(p2); return p; } /** * 第二种解决方案,统一按照宽度压缩 这样来的效果是,所有图片的宽度是相等的,自我认为给客户的效果是最好的 * * @param */ private int getPercent2(float h, float w) { int p = 0; float p2 = 0.0f; p2 = 530 / w * 100; p = Math.round(p2); return p; }
2、pdf 转图片
pom 引入
org.apache.pdfbox pdfbox 2.0.1
//经过测试,dpi为96,100,105,120,150,200中,105显示效果较为清晰,体积稳定,dpi越高图片体积越大 //一般电脑显示分辨率为96 public static final float DEFAULT_DPI=105; /**pdf转图片 * @param pdfPath */ public String pdfToImage(String pdfPath, HttpServletResponse res, HttpServletRequest request){ try{ if(pdfPath==null||"".equals(pdfPath)||!pdfPath.endsWith(".pdf")) return null; //图像合并使用参数 int width = 0; // 总宽度 int[] singleImgRGB; // 保存一张图片中的RGB数据 int shiftHeight = 0; BufferedImage imageResult = null;//保存每张图片的像素值 //利用PdfBox生成图像 PDDocument pdDocument = PDDocument.load(new File(pdfPath)); PDFRenderer renderer = new PDFRenderer(pdDocument); //循环每个页码 for(int i=0,len=pdDocument.getNumberOfPages(); i