File size: 5,870 Bytes
0853b0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
document.addEventListener('DOMContentLoaded', () => {
    const pdfInput = document.getElementById('pdf-input');
    const processBtn = document.getElementById('process-btn');
    const downloadBtn = document.getElementById('download-btn');
    const previewContainer = document.getElementById('preview-container');
    const downloadContainer = document.getElementById('download-container');
    const preview = document.getElementById('preview');
    const reverseOrderCheckbox = document.getElementById('reverse-order');
    const addPageNumbersCheckbox = document.getElementById('add-page-numbers');

    let processedPdfBytes = null;

    pdfInput.addEventListener('change', handleFileSelect);
    processBtn.addEventListener('click', processPDF);
    downloadBtn.addEventListener('click', downloadPDF);

    async function handleFileSelect(event) {
        const file = event.target.files[0];
        if (!file) return;

        previewContainer.classList.remove('hidden');
        preview.innerHTML = '<p class="text-gray-500 text-center">Loading preview...</p>';

        try {
            const arrayBuffer = await file.arrayBuffer();
            const pdfDoc = await PDFLib.PDFDocument.load(arrayBuffer);
            const firstPage = pdfDoc.getPages()[0];
            
            // Create a simple preview
            const { width, height } = firstPage.getSize();
            preview.innerHTML = `
                <div class="text-center">
                    <p class="text-gray-700 mb-2"><strong>Original PDF Info</strong></p>
                    <p class="text-gray-600">Pages: ${pdfDoc.getPageCount()}</p>
                    <p class="text-gray-600">Dimensions: ${width.toFixed(0)} × ${height.toFixed(0)}</p>
                    <p class="text-gray-600">Orientation: ${width > height ? 'Landscape' : 'Portrait'}</p>
                </div>
            `;
        } catch (error) {
            preview.innerHTML = '<p class="text-red-500 text-center">Error loading PDF. Please try another file.</p>';
            console.error('Error loading PDF:', error);
        }
    }

    async function processPDF() {
        const file = pdfInput.files[0];
        if (!file) {
            alert('Please select a PDF file first');
            return;
        }

        processBtn.disabled = true;
        processBtn.innerHTML = '<i data-feather="loader" class="animate-spin mr-2"></i> Processing...';
        feather.replace();

        try {
            const arrayBuffer = await file.arrayBuffer();
            const originalPdfDoc = await PDFLib.PDFDocument.load(arrayBuffer);
            const newPdfDoc = await PDFLib.PDFDocument.create();
            
            const originalPages = originalPdfDoc.getPages();
            const pageCount = originalPages.length;
            const reverseOrder = reverseOrderCheckbox.checked;
            const addPageNumbers = addPageNumbersCheckbox.checked;

            // Process pages in pairs
            for (let i = 0; i < pageCount; i += 2) {
                const page1Index = reverseOrder ? pageCount - 1 - i : i;
                const page2Index = reverseOrder ? pageCount - 2 - i : i + 1;
                
                const page1 = originalPages[page1Index];
                const page2 = page2Index < pageCount ? originalPages[page2Index] : null;

                // Create a new landscape page (double width)
                const { width: pw, height: ph } = page1.getSize();
                const newPage = newPdfDoc.addPage([pw * 2, ph]);
                
                // Embed the first page
                const embeddedPage1 = await newPdfDoc.embedPage(page1);
                newPage.drawPage(embeddedPage1, {
                    x: 0,
                    y: 0,
                    width: pw,
                    height: ph,
                });

                // Embed the second page if it exists
                if (page2) {
                    const embeddedPage2 = await newPdfDoc.embedPage(page2);
                    newPage.drawPage(embeddedPage2, {
                        x: pw,
                        y: 0,
                        width: pw,
                        height: ph,
                    });
                }

                // Add page numbers if enabled
                if (addPageNumbers) {
                    const pageNumText = `Page ${page1Index + 1}${page2 ? `-${page2Index + 1}` : ''}`;
                    newPage.drawText(pageNumText, {
                        x: 10,
                        y: 10,
                        size: 12,
                        color: PDFLib.rgb(0.5, 0.5, 0.5),
                    });
                }
            }

            // Save the processed PDF
            processedPdfBytes = await newPdfDoc.save();
            
            // Update UI
            preview.innerHTML = `
                <div class="text-center">
                    <p class="text-green-600 mb-2"><strong>Processing Complete!</strong></p>
                    <p class="text-gray-700">Original pages: ${pageCount}</p>
                    <p class="text-gray-700">New pages: ${Math.ceil(pageCount / 2)}</p>
                </div>
            `;
            downloadContainer.classList.remove('hidden');
        } catch (error) {
            console.error('Error processing PDF:', error);
            preview.innerHTML = '<p class="text-red-500 text-center">Error processing PDF. Please try again.</p>';
        } finally {
            processBtn.disabled = false;
            processBtn.innerHTML = '<i data-feather="repeat" class="mr-2"></i> Process PDF';
            feather.replace();
        }
    }

    function downloadPDF() {
        if (!processedPdfBytes) return;
        
        const fileName = pdfInput.files[0].name.replace('.pdf', '') + '_processed.pdf';
        download(processedPdfBytes, fileName, 'application/pdf');
    }
});