forked from awesome-yasin/PDF-Verse
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest.js
82 lines (67 loc) · 2.23 KB
/
test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const { PDFDocument } = require('pdf-lib');
const sharp = require('sharp');
const router = express.Router();
const pdf2pic = require('pdf2pic');
const upload = multer({ dest: 'uploads/' });
router.get('/compress-pdf', (req, res) => {
res.render('compress');
});
router.post('/compress', upload.single('pdfFile'), async (req, res) => {
const pdfBuffer = fs.readFileSync(req.file.path);
const pdfDoc = await PDFDocument.load(pdfBuffer);
// Remove metadata
pdfDoc.setTitle('');
pdfDoc.setAuthor('');
pdfDoc.setSubject('');
pdfDoc.setKeywords([]);
pdfDoc.setProducer('');
pdfDoc.setCreator('');
// Convert PDF pages to images, compress them, and add them back to a new PDF
const newPdfDoc = await PDFDocument.create();
const pageCount = pdfDoc.getPages().length;
// Configure pdf2pic options
const pdf2picOptions = {
format: 'png',
size: '600x600',
density: 72,
savePath: './temp-images',
};
const converter = pdf2pic(pdf2picOptions);
for (let i = 0; i < pageCount; i++) {
const page = pdfDoc.getPages()[i];
const { width, height } = page.getSize();
// Convert PDF page to PNG image using pdf2pic
const imagePath = await converter.convertBulk(page, -1);
// Read PNG image into buffer
const pngImage = fs.readFileSync(imagePath);
// Compress image using Sharp
const compressedImage = await sharp(pngImage)
.resize(width, height, { fit: 'inside' })
.jpeg({ quality: 50 })
.toBuffer();
// Add compressed image to new PDF document
const newImage = await newPdfDoc.embedJpg(compressedImage);
const newPage = newPdfDoc.addPage([width, height]);
newPage.drawImage(newImage, {
x: 0,
y: 0,
width,
height,
});
// Delete temporary PNG image
fs.unlinkSync(imagePath);
}
const compressedPdfBytes = await newPdfDoc.save();
fs.writeFileSync('compressed.pdf', compressedPdfBytes);
// Clean up uploaded file
fs.unlinkSync(req.file.path);
res.download('compressed.pdf', 'compressed.pdf', (err) => {
if (err) throw err;
fs.unlinkSync('compressed.pdf');
});
});
module.exports = router;