我有一个项目,用于分割由用户上传的pdf文件,拆分后在pdf中获取相同的内容,然后使用PDODocument合并基于pdf内容的页面,对于合并pdf,我使用PDFMergerUtility,在marge之后我使用字节数组将合并pdf保存到数据库中。而且,在保存到DB之后,用户还可以下载已经分割的pdf,并根据内容合并,并在需要时重新上传。
但是我发现了一个问题,合并后pdf的大小比分裂前的pdf大。
我一直在努力寻找解决办法,但没有找到解决我的问题的办法,就这样
Is there a way to compress PDF to small size using Java?
还有另一个解决方案
有什么办法解决我的问题吗?我很乐意提供任何帮助。
这是我的密码
//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)
}
}
}发布于 2022-08-29 15:59:42
您可以使用cpdf https://community.coherentpdf.com无损压缩后的PDF文件。这将协调任何相同的对象和公共部分,并删除任何不需要的部分。
从命令行
cpdf -squeeze in.pdf -o out.pdf或者,来自Java:
jcpdf.squeezeInMemory(pdf);https://stackoverflow.com/questions/73328875
复制相似问题