office tool

การรวมไฟล์ PDF ด้วย Node.js

By July 13, 2024 No Comments

บทความภาคต่อจาก ชุดเดิมที่ เติมเลขหน้าได้แล้ว เราจึงคิดว่า เราควรจบทุกอย่างด้วยคำสั่งชุดเดียว เลยออกแบบให้มีโปรแกรมรวมไฟล์ที่มาจาก command line ได้ด้วย คือการใช้งาน รวมไฟล์หลายๆ ไฟล์ แล้ว ก็มา เพิ่มเลขหน้า จะได้จบงาน

สำหรับ บทความนี้ การรวมไฟล์ PDF หลายไฟล์เป็นไฟล์เดียว เราสามารถใช้ Node.js และไลบรารี pdf-lib ในการจัดการและรวมไฟล์เหล่านั้นเข้าด้วยกันได้ง่าย ๆ บทความนี้จะแนะนำขั้นตอนการทำงานแบบ step-by-step รวมถึงการแปลงโปรแกรมเป็นไฟล์ .exe สำหรับใช้งานบน Windows

ขั้นตอนที่ 1: การติดตั้งไลบรารีที่จำเป็น

ก่อนอื่นให้ทำการติดตั้งไลบรารีที่จำเป็น ได้แก่ pdf-lib และ commander ซึ่งใช้ในการจัดการไฟล์ PDF และการรับค่า arguments จาก command line

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install pdf-lib commander
npm install pdf-lib commander
npm install pdf-lib commander

ขั้นตอนที่ 2: สร้างสคริปต์สำหรับรวมไฟล์ PDF

สร้างไฟล์ merge-pdfs.js แล้วเพิ่มโค้ดต่อไปนี้ลงไป:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const fs = require('fs');
const path = require('path');
const { PDFDocument } = require('pdf-lib');
const { Command } = require('commander');
async function mergePdfs(inputDir, outputPdfPath) {
const pdfDoc = await PDFDocument.create();
const files = fs.readdirSync(inputDir).filter(file => file.endsWith('.pdf'));
for (const file of files) {
const filePath = path.join(inputDir, file);
const pdfBytes = fs.readFileSync(filePath);
const pdfToMerge = await PDFDocument.load(pdfBytes);
const [copiedPages] = await pdfDoc.copyPages(pdfToMerge, pdfToMerge.getPageIndices());
copiedPages.forEach(page => {
pdfDoc.addPage(page);
});
}
const mergedPdfBytes = await pdfDoc.save();
fs.writeFileSync(outputPdfPath, mergedPdfBytes);
}
const program = new Command();
program
.requiredOption('-i, --input-dir ', 'input directory containing PDF files')
.requiredOption('-o, --output ', 'output PDF file path')
.parse(process.argv);
const options = program.opts();
const inputDir = options.inputDir;
const outputPdfPath = options.output;
mergePdfs(inputDir, outputPdfPath)
.then(() => console.log('PDF files merged successfully'))
.catch(err => console.error('Error:', err));
const fs = require('fs'); const path = require('path'); const { PDFDocument } = require('pdf-lib'); const { Command } = require('commander'); async function mergePdfs(inputDir, outputPdfPath) { const pdfDoc = await PDFDocument.create(); const files = fs.readdirSync(inputDir).filter(file => file.endsWith('.pdf')); for (const file of files) { const filePath = path.join(inputDir, file); const pdfBytes = fs.readFileSync(filePath); const pdfToMerge = await PDFDocument.load(pdfBytes); const [copiedPages] = await pdfDoc.copyPages(pdfToMerge, pdfToMerge.getPageIndices()); copiedPages.forEach(page => { pdfDoc.addPage(page); }); } const mergedPdfBytes = await pdfDoc.save(); fs.writeFileSync(outputPdfPath, mergedPdfBytes); } const program = new Command(); program .requiredOption('-i, --input-dir ', 'input directory containing PDF files') .requiredOption('-o, --output ', 'output PDF file path') .parse(process.argv); const options = program.opts(); const inputDir = options.inputDir; const outputPdfPath = options.output; mergePdfs(inputDir, outputPdfPath) .then(() => console.log('PDF files merged successfully')) .catch(err => console.error('Error:', err));
const fs = require('fs');
const path = require('path');
const { PDFDocument } = require('pdf-lib');
const { Command } = require('commander');

async function mergePdfs(inputDir, outputPdfPath) {
    const pdfDoc = await PDFDocument.create();
    const files = fs.readdirSync(inputDir).filter(file => file.endsWith('.pdf'));

    for (const file of files) {
        const filePath = path.join(inputDir, file);
        const pdfBytes = fs.readFileSync(filePath);
        const pdfToMerge = await PDFDocument.load(pdfBytes);
        const [copiedPages] = await pdfDoc.copyPages(pdfToMerge, pdfToMerge.getPageIndices());
        copiedPages.forEach(page => {
            pdfDoc.addPage(page);
        });
    }

    const mergedPdfBytes = await pdfDoc.save();
    fs.writeFileSync(outputPdfPath, mergedPdfBytes);
}

const program = new Command();
program
    .requiredOption('-i, --input-dir ', 'input directory containing PDF files')
    .requiredOption('-o, --output ', 'output PDF file path')
    .parse(process.argv);

const options = program.opts();
const inputDir = options.inputDir;
const outputPdfPath = options.output;

mergePdfs(inputDir, outputPdfPath)
    .then(() => console.log('PDF files merged successfully'))
    .catch(err => console.error('Error:', err));

โค้ดนี้จะทำการรวมไฟล์ PDF ทั้งหมดที่อยู่ในไดเรกทอรีที่กำหนดและบันทึกเป็นไฟล์ PDF ไฟล์เดียวที่ระบุ

ขั้นตอนที่ 3: การใช้งานสคริปต์

หลังจากสร้างไฟล์สคริปต์แล้ว คุณสามารถรันสคริปต์ได้โดยใช้คำสั่งดังนี้:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
node merge-pdfs.js --input-dir <ไดเรกทอรีที่มีไฟล์ PDF> --output <ไฟล์ PDF ที่ต้องการบันทึก>
node merge-pdfs.js --input-dir ./pdf-files --output merged.pdf
node merge-pdfs.js --input-dir <ไดเรกทอรีที่มีไฟล์ PDF> --output <ไฟล์ PDF ที่ต้องการบันทึก> node merge-pdfs.js --input-dir ./pdf-files --output merged.pdf
node merge-pdfs.js --input-dir <ไดเรกทอรีที่มีไฟล์ PDF> --output <ไฟล์ PDF ที่ต้องการบันทึก>
node merge-pdfs.js --input-dir ./pdf-files --output merged.pdf

ขั้นตอนที่ 4: การสร้างไฟล์ [.exe]

หากต้องการแปลงโปรแกรม Node.js เป็นไฟล์ [.exe] สำหรับใช้งานบน Windows สามารถใช้ไลบรารี [pkg] ได้

[1] ติดตั้ง [pkg]
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install -g pkg
npm install -g pkg
npm install -g pkg
[2] แก้ไข [package.json] เพื่อให้ [pkg] สามารถหาโมดูลที่จำเป็นได้

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
"name": "merge-pdfs",
"version": "1.0.0",
"main": "merge-pdfs.js",
"scripts": {
"start": "node merge-pdfs.js"
},
"bin": "merge-pdfs.js",
"pkg": {
"scripts": [
"merge-pdfs.js"
]
},
"dependencies": {
"pdf-lib": "^1.17.1",
"commander": "^8.0.0"
}
}
{ "name": "merge-pdfs", "version": "1.0.0", "main": "merge-pdfs.js", "scripts": { "start": "node merge-pdfs.js" }, "bin": "merge-pdfs.js", "pkg": { "scripts": [ "merge-pdfs.js" ] }, "dependencies": { "pdf-lib": "^1.17.1", "commander": "^8.0.0" } }
{
    "name": "merge-pdfs",
    "version": "1.0.0",
    "main": "merge-pdfs.js",
    "scripts": {
        "start": "node merge-pdfs.js"
    },
    "bin": "merge-pdfs.js",
    "pkg": {
        "scripts": [
            "merge-pdfs.js"
        ]
    },
    "dependencies": {
        "pdf-lib": "^1.17.1",
        "commander": "^8.0.0"
    }
}
[3] สร้างไฟล์ [.exe] ด้วยคำสั่ง [pkg]
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pkg . --targets node14-win-x64 --output merge-pdfs.exe
pkg . --targets node14-win-x64 --output merge-pdfs.exe
pkg . --targets node14-win-x64 --output merge-pdfs.exe
[4] ใช้ไฟล์ .exe ที่สร้างขึ้น

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
merge-pdfs.exe --input-dir <ไดเรกทอรีที่มีไฟล์ PDF> --output <ไฟล์ PDF ที่ต้องการบันทึก>
merge-pdfs.exe --input-dir <ไดเรกทอรีที่มีไฟล์ PDF> --output <ไฟล์ PDF ที่ต้องการบันทึก>
merge-pdfs.exe --input-dir <ไดเรกทอรีที่มีไฟล์ PDF> --output <ไฟล์ PDF ที่ต้องการบันทึก>

บทสรุป

บทความนี้แสดงขั้นตอนการรวมไฟล์ PDF หลายไฟล์เป็นไฟล์เดียวโดยใช้ Node.js และไลบรารี [pdf-lib] พร้อมกับการรับค่า arguments จาก command line ด้วย commander และการแปลงโปรแกรมเป็นไฟล์ .exe สำหรับใช้งานบน Windows หวังว่าบทความนี้จะเป็นประโยชน์สำหรับผู้ที่ต้องการจัดการไฟล์ PDF ด้วย Node.js

Leave a Reply