liuyc 1 vuosi sitten
vanhempi
commit
621dc3325a

+ 4 - 5
blade-service/blade-archive/pom.xml

@@ -137,12 +137,11 @@
             <artifactId>spring-test</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.apache.pdfbox</groupId>
-            <artifactId>pdfbox</artifactId>
-            <version>2.0.20</version>
-            <scope>compile</scope>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itext7-core</artifactId>
+            <version>7.1.16</version>
+            <type>pom</type>
         </dependency>
-
     </dependencies>
 
     <build>

+ 6 - 29
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java

@@ -1,16 +1,10 @@
 package org.springblade.archive.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.itextpdf.text.Element;
-import com.itextpdf.text.pdf.*;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
-import org.apache.pdfbox.pdmodel.PDDocument;
-import org.apache.pdfbox.pdmodel.PDPage;
-import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.util.IOUtils;
 import org.springblade.archive.entity.ArchiveFormulaConfig;
@@ -21,6 +15,7 @@ import org.springblade.archive.service.IArchiveFormulaConfigService;
 import org.springblade.archive.service.IArchiveProjectConfigService;
 import org.springblade.archive.utils.FileUtils;
 import org.springblade.archive.utils.FormulaUtil;
+import org.springblade.archive.utils.PdfResizeTool;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.common.constant.CommonConstant;
@@ -30,7 +25,6 @@ import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.vo.DataVO;
 import org.springblade.common.vo.FileSize;
 import org.springblade.core.oss.model.BladeFile;
-import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.core.tool.utils.StringUtil;
@@ -38,9 +32,10 @@ import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.stereotype.Service;
 
+import java.io.InputStream;
+import java.io.OutputStream;
 
 import java.io.*;
-import java.net.URLEncoder;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
@@ -908,36 +903,18 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
             OutputStream outputStream = new FileOutputStream(localPdf);
             outputStream.write(bytes);
 
-            //将PDF设置为A4纸大小
-            this.setPdfToA4Size(localPdf, localPdf);
+            //设置PDF每页大小为A4,内容等比缩放,方向同步
+            PdfResizeTool.resizeToA4WithContentScaling(localPdf, localPdf);
 
             //上传到OSS
             String absoluteFileName = FileUtils.getOssPath(OssConstant.ARCHIVE_DIRECTORY, fileName, projectId);
             BladeFile file = newIOSSClient.uploadFile(absoluteFileName, localPdf);
             url = file.getLink();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return url;
-    }
 
-    /**
-     * 设置pdf大小默认为A4纸大小
-     *
-     * @param inputPdfPath
-     * @param outputPdfPath
-     */
-    private void setPdfToA4Size(String inputPdfPath, String outputPdfPath) {
-        try {
-            PDDocument document = PDDocument.load(new File(inputPdfPath));
-            PDPage newPage = new PDPage(PDRectangle.A4);
-            document.removePage(0);
-            document.addPage(newPage);
-            document.save(outputPdfPath);
-            document.close();
         } catch (Exception e) {
             e.printStackTrace();
         }
+        return url;
     }
 
 

+ 64 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/PdfResizeTool.java

@@ -0,0 +1,64 @@
+package org.springblade.archive.utils;
+
+import com.itextpdf.kernel.geom.PageSize;
+import com.itextpdf.kernel.geom.Rectangle;
+import com.itextpdf.kernel.pdf.*;
+import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
+
+
+import java.io.IOException;
+
+public class PdfResizeTool {
+
+    /**
+     * 设置PDF每页大小为A4,内容等比缩放,方向同步
+     *
+     * @param inputPdfPath
+     * @param outputPdfPath
+     * @throws IOException
+     */
+    public static void resizeToA4WithContentScaling(String inputPdfPath, String outputPdfPath) throws IOException {
+        PdfReader reader = new PdfReader(inputPdfPath);
+        PdfDocument inputDocument = new PdfDocument(reader);
+        int numberOfPages = inputDocument.getNumberOfPages();
+
+        PageSize a4PageSize = PageSize.A4;
+
+        PdfDocument outputDocument = new PdfDocument(new PdfWriter(outputPdfPath));
+
+        for (int pageNumber = 1; pageNumber <= numberOfPages; pageNumber++) {
+            PdfPage originalPage = inputDocument.getPage(pageNumber);
+            Rectangle originalPageSize = originalPage.getPageSize();
+
+            //创建新页面,保持原始方向
+            PageSize newPageSize = originalPageSize.getWidth() > originalPageSize.getHeight() ? a4PageSize.rotate() : a4PageSize;
+            PdfPage newPage = outputDocument.addNewPage(newPageSize);
+
+            //获取内容缩放相关参数
+            float scaleX = newPageSize.getWidth() / originalPageSize.getWidth();
+            float scaleY = newPageSize.getHeight() / originalPageSize.getHeight();
+            float scale = Math.min(scaleX, scaleY);
+
+            //创建一个PdfCanvas对象来操作页面内容
+            newPage.setRotation(originalPage.getRotation()); //保持旋转角度
+            newPage.setMediaBox(newPageSize); //设置MediaBox
+
+            PdfCanvas canvas = new PdfCanvas(newPage, true);
+            canvas.saveState();
+            canvas.concatMatrix(scale, 0, 0, scale, 0, 0); //缩放内容
+            canvas.addXObject(originalPage.copyAsFormXObject(outputDocument));
+            canvas.restoreState();
+        }
+
+        inputDocument.close();
+        outputDocument.close();
+    }
+
+    /*public static void main(String[] args) throws IOException {
+        String inputPdfPath = "D:\\Download\\66666.pdf";
+        String outputPdfPath = "D:\\Download\\6666611111.pdf";
+        resizeToA4WithContentScaling(inputPdfPath, outputPdfPath);
+    }*/
+
+}
+