diff --git a/coolstore-partner-common/pom.xml b/coolstore-partner-common/pom.xml index cdf95f685..204706c33 100644 --- a/coolstore-partner-common/pom.xml +++ b/coolstore-partner-common/pom.xml @@ -98,11 +98,11 @@ openpdf 1.3.30 - + - org.apache.pdfbox - pdfbox - 2.0.27 + org.icepdf.os + icepdf-core + 6.1.2 diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/PDFUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/PDFUtils.java index 3df31afd9..e2f9eb1e6 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/PDFUtils.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/PDFUtils.java @@ -5,12 +5,15 @@ import com.lowagie.text.Font; import com.lowagie.text.Image; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.*; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.rendering.PDFRenderer; +import org.icepdf.core.exceptions.PDFException; +import org.icepdf.core.exceptions.PDFSecurityException; +import org.icepdf.core.pobjects.Page; +import org.icepdf.core.util.GraphicsRenderingHints; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; import java.io.*; /** @@ -128,37 +131,41 @@ public class PDFUtils { /** * PDF 转图片 * @param inputStream pdf 输入流 - * @param dpi + * @param scale 缩放比例 */ - public static ByteArrayOutputStream pdf2Img(InputStream inputStream, float dpi) { - PDDocument document = null; - ByteArrayOutputStream outputStream = null; + public static ByteArrayOutputStream pdf2Img(InputStream inputStream, float scale) { + org.icepdf.core.pobjects.Document document = new org.icepdf.core.pobjects.Document(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { - // 加载pdf文档 - FileInputStream fileInputStream = new FileInputStream("passLetter.pdf"); - document = PDDocument.load(fileInputStream); - // PDF文档渲染对象 - PDFRenderer renderer = new PDFRenderer(document); - int pageCount = document.getNumberOfPages(); - for (int i = 0; i < pageCount; i++) { - /* - * renderImage(i,1.9f) - * i: 指定页对象下标,从0开始,0即第一页 - * 1.9f:DPI值(Dots Per Inch),官方描述比例因子,其中 1 = 72 DPI - */ - BufferedImage image = renderer.renderImage(i, dpi); - outputStream = new ByteArrayOutputStream(); - FileOutputStream fileOutputStream = new FileOutputStream("pdf2img.png"); - ImageIO.write(image, "PNG", outputStream); - byte[] byteArray = outputStream.toByteArray(); - fileOutputStream.write(byteArray); - fileOutputStream.close(); + document.setInputStream(inputStream, ""); + + float rotation = 0f;// 旋转角度 + for (int i = 0; i < document.getNumberOfPages(); i++) { + BufferedImage image = (BufferedImage) document.getPageImage(i, + GraphicsRenderingHints.SCREEN, Page.BOUNDARY_CROPBOX, + rotation, scale); + RenderedImage rendImage = image; + try { + ImageIO.write(rendImage, "png", outputStream); + //例子中是pdf转png格式的,也可以将上面两行改成jpg,转出jpg格式的, + //但是从转换效果来看png的清晰度会相对较高。有个小技巧是第一行行改成jpg, + //但第二行使用png,也就是转换成jpg格式但有png清晰度的图片。 + } catch (IOException e) { + e.printStackTrace(); + } + image.flush(); + document.dispose(); return outputStream; } - }catch (Exception e){ - e.printStackTrace(); + } catch (PDFException | PDFSecurityException | IOException e1) { + e1.printStackTrace(); + } finally { + try { + outputStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } } return outputStream; } - } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/PassLetterUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/PassLetterUtils.java index a78b41bf6..264061202 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/PassLetterUtils.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/PassLetterUtils.java @@ -42,11 +42,11 @@ public class PassLetterUtils { document.close(); //3. 填写通过函模板信息 - addContentToPdf(outputStream, partnerName + " 先生/女士", 122, 640); - addContentToPdf(outputStream, passCode, 122, 558); - addContentToPdf(outputStream, verifyCity, 155, 494); - addContentToPdf(outputStream, "60天", 135, 450); - addContentToPdf(outputStream, passTimeStr, 393, 152); + addContentToPdf(outputStream, partnerName + " 先生/女士", 122, 638); + addContentToPdf(outputStream, passCode, 122, 557); + addContentToPdf(outputStream, verifyCity, 155, 492); + addContentToPdf(outputStream, "60天", 135, 448); + addContentToPdf(outputStream, passTimeStr, 385, 152); return outputStream; } catch (IOException e) { throw new RuntimeException(e); @@ -75,9 +75,9 @@ public class PassLetterUtils { try { ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); PdfReader pdfReader = new PdfReader(inputStream); - String fontFamillyPath = PassLetterUtils.class.getResource("/static/simsun.ttc").getPath(); - BaseFont font = BaseFont.createFont(fontFamillyPath + ",0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); - PDFUtils.putParagraphAbsolutely(pdfReader, outputStream, x, y, content, font, 20, 1, new Color(255, 82,25)); + String fontFamilyPath = PassLetterUtils.class.getResource("/static/Alibaba-PuHuiTi-Regular.ttf").getPath(); + BaseFont font = BaseFont.createFont(fontFamilyPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); + PDFUtils.putParagraphAbsolutely(pdfReader, outputStream, x, y, content, font, 19, 1, new Color(255, 82,25)); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PartnerInterviewServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PartnerInterviewServiceImpl.java index b72867c98..fc9d6f8b5 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PartnerInterviewServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PartnerInterviewServiceImpl.java @@ -22,6 +22,8 @@ import org.springframework.transaction.annotation.Transactional; import java.io.*; +import static com.cool.store.utils.PDFUtils.pdf2Img; + @Service public class PartnerInterviewServiceImpl implements PartnerInterviewService { @@ -122,19 +124,15 @@ public class PartnerInterviewServiceImpl implements PartnerInterviewService { String code = passLetterDetail.getPassCode() == null ? PassLetterUtils.genPassCode(createTime) : passLetterDetail.getPassCode(); //生成的 pdf 通过函内存输出流 ByteArrayOutputStream pdfOut = PassLetterUtils.genPassLetter(passLetterDetail.getPartnerName(), code, passLetterDetail.getVerifyCity(), createTime); - FileOutputStream fileOutputStream = new FileOutputStream("passLetter.pdf"); - fileOutputStream.write(pdfOut.toByteArray()); - fileOutputStream.close(); //生成的 pdf 通过函内存输入流 ByteArrayInputStream inputStream = new ByteArrayInputStream(pdfOut.toByteArray()); -// String passPdfUrl = ossServer.uploadFileServer(inputStream, "partner/passLetter/" + code + ".pdf"); - String passPdfUrl = ""; + String passPdfUrl = ossServer.uploadFileServer(inputStream, "partner/passLetter/" + code + ".pdf"); //转换为图片 inputStream.reset(); ByteArrayOutputStream imageOut = PDFUtils.pdf2Img(inputStream, 2.0f); + inputStream = new ByteArrayInputStream(imageOut.toByteArray()); //上传 OSS -// String passImageUrl = ossServer.uploadFileServer(inputStream, "partner/passLetter/" + code + ".jpg"); - String passImageUrl = ""; + String passImageUrl = ossServer.uploadFileServer(inputStream, "partner/passLetter/" + code + ".png"); //计算有效期截止日期 DateTime expiryDate = DateUtil.offsetDay(createTime, 60); String expiryDateStr = DateUtil.format(expiryDate, "yyyy-MM-dd") + " 23:59:59"; diff --git a/coolstore-partner-webc/src/main/resources/static/Alibaba-PuHuiTi-Regular.ttf b/coolstore-partner-webc/src/main/resources/static/Alibaba-PuHuiTi-Regular.ttf new file mode 100644 index 000000000..9f8ab8d8f Binary files /dev/null and b/coolstore-partner-webc/src/main/resources/static/Alibaba-PuHuiTi-Regular.ttf differ