首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并后压缩PDF,Kotlin Java Spring Boot

合并后压缩PDF,Kotlin Java Spring Boot
EN

Stack Overflow用户
提问于 2022-08-12 03:09:05
回答 1查看 98关注 0票数 0

我有一个项目,用于分割由用户上传的pdf文件,拆分后在pdf中获取相同的内容,然后使用PDODocument合并基于pdf内容的页面,对于合并pdf,我使用PDFMergerUtility,在marge之后我使用字节数组将合并pdf保存到数据库中。而且,在保存到DB之后,用户还可以下载已经分割的pdf,并根据内容合并,并在需要时重新上传。

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

我一直在努力寻找解决办法,但没有找到解决我的问题的办法,就这样

Android PdfDocument file size

Is there a way to compress PDF to small size using Java?

还有另一个解决方案

有什么办法解决我的问题吗?我很乐意提供任何帮助。

这是我的密码

代码语言:javascript
复制
//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)
        }
      }
    }
EN

回答 1

Stack Overflow用户

发布于 2022-08-29 15:59:42

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

从命令行

代码语言:javascript
复制
cpdf -squeeze in.pdf -o out.pdf

或者,来自Java:

代码语言:javascript
复制
jcpdf.squeezeInMemory(pdf);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73328875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档