<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>html2pdf</artifactId> <version>4.0.3</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.21</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-tools</artifactId> <version>2.0.9</version> </dependency>
原pdf为两页:
转成PNG图片:
转成两页合并后的pdf:
整体缩放后: 完美合并
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/47207878bae7463ca8e309fad0ea05d1.png
代码:
//content为html模板填充后的html字符串数据 outpath为目标文件输出地址全路径 public static boolean html2Pdf(String content, String outPath) { try { ConverterProperties converterProperties = new ConverterProperties(); converterProperties.setCharset("UTF-8"); FontProvider fontProvider = new FontProvider(); fontProvider.addSystemFonts(); converterProperties.setFontProvider(fontProvider); //关键合并 PdfDocument temp = new PdfDocument(new PdfWriter(new FileOutputStream(outPath))); //根据数据最多的情况 调整合适大小 temp.setDefaultPageSize(PageSize.A0); HtmlConverter.convertToPdf(content, temp, converterProperties); File file = new File(outPath); String ta = outPath.substring(0, outPath.lastIndexOf('.')) + "new.pdf"; int a = 20; //转图片 //Pdf2Png.pdfFileToImage(file,ta,a); //2页合并一页 //Pdf2Png.mergeTwoPagesIntoOne(outPath,ta); //整体缩放pdf String shrunkenPath = ta; PdfWriter pdfWriter = new PdfWriter(shrunkenPath); PdfDocument shrunkenDocument = new PdfDocument(pdfWriter); String originalPath = outPath; PdfReader pdfReader = new PdfReader(originalPath); PdfDocument originalDocument= new PdfDocument(pdfReader); PdfPage orignalPage= originalDocument.getPage(1); Rectangle originalPDFSizes = orignalPage.getPageSize(); PdfPage emptyPage = shrunkenDocument.addNewPage(); Rectangle emptyPDFsizes= emptyPage.getPageSize(); double width = emptyPDFsizes.getWidth()/ originalPDFSizes.getWidth(); double height = emptyPDFsizes.getHeight() / originalPDFSizes.getHeight(); double newWidth = width / 2; double newHeight = height / 2; AffineTransform affineTransform = AffineTransform.getScaleInstance( newWidth, newHeight); PdfCanvas canvas = new PdfCanvas(emptyPage); canvas.concatMatrix(affineTransform); PdfFormXObject pageCopy= orignalPage.copyAsFormXObject( shrunkenDocument); canvas.addXObject(pageCopy, (float)newWidth, (float)newHeight); Document doc = new Document(shrunkenDocument); doc.close(); originalDocument.close(); } catch (Exception e) { log.error("生成模板内容失败,{}",e); return false; } return true; }
工具类:
package com.haihu.common.utils.pdf; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.RectangleReadOnly; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfImportedPage; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfWriter; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.util.ArrayList; import java.util.List; /** * @author 小于转暴雨?? * @date 2023/3/1 14:53 */ public class Pdf2Png { public static void main(String[] args) { File file = new File("E:\git\hosp_front\public\view\20230216\张金妹.pdf"); String ta = "E:\git\hosp_front\public\view\20230216\张金妹.png"; int a = 20; pdfFileToImage(file,ta,a); } public static void mergeTwoPagesIntoOne(String originalPdfFile, String outputPdfFile) throws IOException, DocumentException { PdfReader reader = new PdfReader(originalPdfFile); Document doc = new Document(new RectangleReadOnly(842f, 595f), 0, 0, 0, 0); PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(outputPdfFile)); doc.open(); int totalPages = reader.getNumberOfPages(); for (int i = 1; i <= totalPages; i = i + 2) { doc.newPage(); PdfContentByte cb = writer.getDirectContent(); PdfImportedPage page = writer.getImportedPage(reader, i); // page #1 float documentWidth = doc.getPageSize().getWidth() / 2; float documentHeight = doc.getPageSize().getHeight(); if (i > 1) documentHeight = documentHeight - 50f; float pageWidth = page.getWidth(); float pageHeight = page.getHeight(); float widthScale = documentWidth / pageWidth; float heightScale = documentHeight / pageHeight; float scale = Math.min(widthScale, heightScale); float offsetX = (documentWidth - (pageWidth * scale)) / 2; float offsetY = 0f; cb.addTemplate(page, scale, 0, 0, scale, offsetX, offsetY); if (i+1 <= totalPages) { PdfImportedPage page2 = writer.getImportedPage(reader, i+1); // page #2 pageWidth = page.getWidth(); pageHeight = page.getHeight(); widthScale = documentWidth / pageWidth; heightScale = documentHeight / pageHeight; scale = Math.min(widthScale, heightScale); offsetX = ((documentWidth - (pageWidth * scale)) / 2) + documentWidth; cb.addTemplate(page2, scale, 0, 0, scale, offsetX, offsetY); } } doc.close(); } /** * pdf文件图像 * 这里的路径一定要具体到文件本身,不能直到文件夹, * 如果只到文件夹会出现拒绝访问的错误,具体可以看上面main方法 * * @param pdffile pdf路径 * @param targetPath 图片路径 * @param height_offset 高度 */ public static void pdfFileToImage(File pdffile, String targetPath,int height_offset) { try { FileInputStream instream = new FileInputStream(pdffile); InputStream byteInputStream = null; try { PDDocument doc = PDDocument.load(instream); PDFRenderer renderer = new PDFRenderer(doc); int pageCount = doc.getNumberOfPages(); List<BufferedImage> list = new ArrayList<BufferedImage>(); if (pageCount > 0) { int totalHeight = 0; int width = 0; for (int i = 0; i < pageCount; i++) { BufferedImage image = renderer.renderImage(i, 1.25f); list.add(image); totalHeight += image.getHeight(); if (width < image.getWidth()) { width = image.getWidth(); } image.flush(); } BufferedImage tag = new BufferedImage(width, totalHeight, BufferedImage.TYPE_INT_RGB); tag.getGraphics(); Graphics g = tag.createGraphics(); int startHeight = 0; for (BufferedImage image : list) { g.drawImage(image, 0, startHeight, width, image.getHeight(), null); g.drawImage(image, 0, startHeight, width, image.getHeight(), null); startHeight += image.getHeight() + height_offset; } g.dispose(); ByteArrayOutputStream bs = new ByteArrayOutputStream(); ImageOutputStream imOut; imOut = ImageIO.createImageOutputStream(bs); ImageIO.write(tag, "png", imOut); byteInputStream = new ByteArrayInputStream(bs.toByteArray()); byteInputStream.close(); } } catch (IOException e) { e.printStackTrace(); } File uploadFile = new File(targetPath); FileOutputStream fops; fops = new FileOutputStream(uploadFile); fops.write(readInputStream(byteInputStream)); fops.flush(); fops.close(); } catch (Exception e) { e.printStackTrace(); } } public static byte[] readInputStream(InputStream inStream) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } inStream.close(); return outStream.toByteArray(); } }