提问者:小点点

合并后压缩PDF,静态编程语言JavaSpring Boot


我有一个项目,用于拆分用户上传的pdf文件,拆分后,然后得到相同的内容在pdf中,然后合并页面基于pdf内容使用PDODocument和合并pdf我使用PDFMergerU的,合并后我保存合并pdf到数据库使用byteraray。

但是我发现一个问题,合并后pdf的大小比拆分前的pdf大。

我试图找到解决办法但没有发现工作对我的问题这样的我们

Android PdfDocument文件大小

有没有办法使用Java将PDF压缩到小尺寸?

和另一个解决方案

有什么办法可以解决我的问题吗?我很乐意得到任何帮助。

这是我的代码

//file: MultipartFile -> file is send from front-end using API

var inpStream: InputStream = file.getInputStream()
inpStream = file.getInputStream()
pdfDocument = PDDocument.load(inpStream)


// splitting the pages of a PDF document
pagesPdf = splitter.split(pdfDocument)
val n = pdfDocument.numberOfPages

val batchSize:Int = 200
val finalBatchSize: Int = n % batchSize
val numOfBatch: Int = (n - finalBatchSize) / batchSize
val batchFinal: Int = if (finalBatchSize == 0) numOfBatch else (numOfBatch + 1)
var batchNo: Int = 1
var startPage: Int
var endPage: Int = 0
while (batchNo <= batchFinal) {
    startPage = endPage + 1
    if (batchNo > numOfBatch) {
        endPage = endPage + finalBatchSize
    } else {
        endPage = endPage + batchSize
    }
    val splitter:Splitter = Splitter()
    splitter.setStartPage(startPage)
    splitter.setEndPage(endPage)

    // splitting the pages of a PDF document
    pagesPdf = splitter.split(pdfDocument)

    batchNo++
    i = startPage
    var groupPage: Int = i
    var pageNo = 0
    
    
    var pdfMerger: PDFMergerUtility = PDFMergerUtility()
        var mergedFileByteArrOut: ByteArrayOutputStream = ByteArrayOutputStream()
        pdfMerger.setDestinationStream(mergedFileByteArrOut)
    var fileObj:ByteArray? = null,
    for (pd in pagesPdf) {
        pageNo++;
        if (!pd.isEncrypted) {
        val stripper = PDFTextStripper()
        //CODE TO GET CONTEN
        
        if(condition1 == true){
          var fileByteArrOut: ByteArrayOutputStream = ByteArrayOutputStream()
              pd.save(fileByteArrOut)
              pd.close()
              var fileByteArrIn: ByteArrayInputStream = ByteArrayInputStream(fileByteArrOut.toByteArray())
              pdfMerger.addSource(fileByteArrIn)
          fileObj = fileByteArrOut.toByteArray(),
        } 
        if(condition2 == true){
        
            //I want to compress fileObj  first before save to DB
            //code to save to DB
            
            fileObj = null
            pdfMerger = PDFMergerUtility()
                      mergedFileByteArrOut= ByteArrayOutputStream()
                      pdfMerger.setDestinationStream(mergedFileByteArrOut)
        }
      }
    }

共1个答案

匿名用户

您可以使用cpdfhttps://community.coherentpdf.com无损压缩PDF文件。这将协调任何相同的对象和公共部分,并删除任何不需要的部分。

从命令行

cpdf -squeeze in.pdf -o out.pdf

或者,从Java:

jcpdf.squeezeInMemory(pdf);