feat(email-to-pdf): add inline images, clickable links, and embedded attachments

- Add CID inline image support via base64 data URI replacement
- Implement clickable link extraction from HTML anchors using regex
- Embed email attachments into PDF using pymupdf embfile_add
- Reduce font sizes for more compact PDF output (18px subject, 12px body)
- Format date with timezone (UTC+HH:MM) while preserving original time
- Clean email address formatting (Name (email) instead of <brackets>)
- Add UI options: page size selector, CC/BCC toggle, attachments toggle
This commit is contained in:
abdullahalam123
2026-01-08 21:36:21 +05:30
parent 4a4a47158f
commit 280348763d
30 changed files with 3978 additions and 9416 deletions

View File

@@ -95,8 +95,6 @@
/> />
<link rel="icon" href="/favicon.ico" sizes="32x32" /> <link rel="icon" href="/favicon.ico" sizes="32x32" />
<!-- i18n: hreflang tags for SEO -->
<link href="src/css/styles.css" rel="stylesheet" /> <link href="src/css/styles.css" rel="stylesheet" />
</head> </head>

41
package-lock.json generated
View File

@@ -10,7 +10,7 @@
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
"dependencies": { "dependencies": {
"@bentopdf/gs-wasm": "^0.1.0", "@bentopdf/gs-wasm": "^0.1.0",
"@bentopdf/pymupdf-wasm": "^0.1.10", "@bentopdf/pymupdf-wasm": "^0.1.11",
"@fontsource/cedarville-cursive": "^5.2.7", "@fontsource/cedarville-cursive": "^5.2.7",
"@fontsource/dancing-script": "^5.2.8", "@fontsource/dancing-script": "^5.2.8",
"@fontsource/dm-sans": "^5.2.8", "@fontsource/dm-sans": "^5.2.8",
@@ -18,6 +18,7 @@
"@fontsource/kalam": "^5.2.8", "@fontsource/kalam": "^5.2.8",
"@fontsource/lato": "^5.2.7", "@fontsource/lato": "^5.2.7",
"@fontsource/merriweather": "^5.2.11", "@fontsource/merriweather": "^5.2.11",
"@kenjiuno/msgreader": "^1.27.1-alpha.1",
"@matbee/libreoffice-converter": "^2.3.1", "@matbee/libreoffice-converter": "^2.3.1",
"@neslinesli93/qpdf-wasm": "^0.3.0", "@neslinesli93/qpdf-wasm": "^0.3.0",
"@pdf-lib/fontkit": "^1.1.1", "@pdf-lib/fontkit": "^1.1.1",
@@ -58,6 +59,7 @@
"pdf-lib": "^1.17.1", "pdf-lib": "^1.17.1",
"pdfjs-dist": "^5.4.296", "pdfjs-dist": "^5.4.296",
"pdfkit": "^0.17.2", "pdfkit": "^0.17.2",
"postal-mime": "^2.7.1",
"sortablejs": "^1.15.6", "sortablejs": "^1.15.6",
"tailwindcss": "^4.1.14", "tailwindcss": "^4.1.14",
"terser": "^5.44.0", "terser": "^5.44.0",
@@ -514,9 +516,9 @@
} }
}, },
"node_modules/@bentopdf/pymupdf-wasm": { "node_modules/@bentopdf/pymupdf-wasm": {
"version": "0.1.10", "version": "0.1.11",
"resolved": "https://registry.npmjs.org/@bentopdf/pymupdf-wasm/-/pymupdf-wasm-0.1.10.tgz", "resolved": "https://registry.npmjs.org/@bentopdf/pymupdf-wasm/-/pymupdf-wasm-0.1.11.tgz",
"integrity": "sha512-gej9ItnAswVZhJin8gb0D7rYKqEWvBtO72M4d0eRKP4oARS67eOQERLaKBE4wulIst1x3r3PtHi7673PCmIv+A==", "integrity": "sha512-sbDFmvm2KzT3oCmqNqMx7w6TMsKpLXeooVK8EVRjyQIV4hU5Ioq0JxWMr8SX7MESu8Caz1feeELd6zt5K966SA==",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"peerDependencies": { "peerDependencies": {
"@bentopdf/gs-wasm": "*" "@bentopdf/gs-wasm": "*"
@@ -2055,6 +2057,25 @@
"@jridgewell/sourcemap-codec": "^1.4.14" "@jridgewell/sourcemap-codec": "^1.4.14"
} }
}, },
"node_modules/@kenjiuno/decompressrtf": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/@kenjiuno/decompressrtf/-/decompressrtf-0.1.4.tgz",
"integrity": "sha512-v9c/iFz17jRWyd2cRnrvJg4VOg/4I/VCk+bG8JnoX2gJ9sAesPzo3uTqcmlVXdpasTI8hChpBVw00pghKe3qTQ==",
"license": "BSD-2-Clause"
},
"node_modules/@kenjiuno/msgreader": {
"version": "1.27.1-alpha.1",
"resolved": "https://registry.npmjs.org/@kenjiuno/msgreader/-/msgreader-1.27.1-alpha.1.tgz",
"integrity": "sha512-r/Fc6cW+68YpYfA8K0uRI31AV484QzcFzJWZkVz5HHBUf1TrzznvSZ9rRwCRqdO2uTLoMtMf7FovZ+MNfa379g==",
"license": "Apache-2.0",
"dependencies": {
"@kenjiuno/decompressrtf": "^0.1.3",
"iconv-lite": "^0.6.3"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/@matbee/libreoffice-converter": { "node_modules/@matbee/libreoffice-converter": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/@matbee/libreoffice-converter/-/libreoffice-converter-2.3.1.tgz", "resolved": "https://registry.npmjs.org/@matbee/libreoffice-converter/-/libreoffice-converter-2.3.1.tgz",
@@ -9906,6 +9927,12 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/postal-mime": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/postal-mime/-/postal-mime-2.7.1.tgz",
"integrity": "sha512-0VslL0CLSV7PBmglwWR8eCGC5fgsdVictjOG4PEA+vvA0+QJF5SC0tV018CbvAcW4XbpbMIJNd91Dt8vTa9kbA==",
"license": "MIT-0"
},
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.5.6", "version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
@@ -9935,9 +9962,9 @@
} }
}, },
"node_modules/preact": { "node_modules/preact": {
"version": "10.28.1", "version": "10.28.2",
"resolved": "https://registry.npmjs.org/preact/-/preact-10.28.1.tgz", "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz",
"integrity": "sha512-u1/ixq/lVQI0CakKNvLDEcW5zfCjUQfZdK9qqWuIJtsezuyG6pk9TWj75GMuI/EzRSZB/VAE43sNWWZfiy8psw==", "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==",
"license": "MIT", "license": "MIT",
"peer": true, "peer": true,
"funding": { "funding": {

View File

@@ -64,7 +64,7 @@
}, },
"dependencies": { "dependencies": {
"@bentopdf/gs-wasm": "^0.1.0", "@bentopdf/gs-wasm": "^0.1.0",
"@bentopdf/pymupdf-wasm": "^0.1.10", "@bentopdf/pymupdf-wasm": "^0.1.11",
"@fontsource/cedarville-cursive": "^5.2.7", "@fontsource/cedarville-cursive": "^5.2.7",
"@fontsource/dancing-script": "^5.2.8", "@fontsource/dancing-script": "^5.2.8",
"@fontsource/dm-sans": "^5.2.8", "@fontsource/dm-sans": "^5.2.8",
@@ -72,6 +72,7 @@
"@fontsource/kalam": "^5.2.8", "@fontsource/kalam": "^5.2.8",
"@fontsource/lato": "^5.2.7", "@fontsource/lato": "^5.2.7",
"@fontsource/merriweather": "^5.2.11", "@fontsource/merriweather": "^5.2.11",
"@kenjiuno/msgreader": "^1.27.1-alpha.1",
"@matbee/libreoffice-converter": "^2.3.1", "@matbee/libreoffice-converter": "^2.3.1",
"@neslinesli93/qpdf-wasm": "^0.3.0", "@neslinesli93/qpdf-wasm": "^0.3.0",
"@pdf-lib/fontkit": "^1.1.1", "@pdf-lib/fontkit": "^1.1.1",
@@ -112,6 +113,7 @@
"pdf-lib": "^1.17.1", "pdf-lib": "^1.17.1",
"pdfjs-dist": "^5.4.296", "pdfjs-dist": "^5.4.296",
"pdfkit": "^0.17.2", "pdfkit": "^0.17.2",
"postal-mime": "^2.7.1",
"sortablejs": "^1.15.6", "sortablejs": "^1.15.6",
"tailwindcss": "^4.1.14", "tailwindcss": "^4.1.14",
"terser": "^5.44.0", "terser": "^5.44.0",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -515,5 +515,11 @@
"name": "Validasi Tanda Tangan PDF", "name": "Validasi Tanda Tangan PDF",
"pageTitle": "Validasi Tanda Tangan PDF - Verifikasi Tanda Tangan Digital | BentoPDF", "pageTitle": "Validasi Tanda Tangan PDF - Verifikasi Tanda Tangan Digital | BentoPDF",
"subtitle": "Verifikasi tanda tangan digital di file PDF Anda. Periksa validitas sertifikat, lihat detail penandatangan, dan konfirmasi integritas dokumen. Semua pemrosesan terjadi di browser Anda." "subtitle": "Verifikasi tanda tangan digital di file PDF Anda. Periksa validitas sertifikat, lihat detail penandatangan, dan konfirmasi integritas dokumen. Semua pemrosesan terjadi di browser Anda."
},
"emailToPdf": {
"name": "Email ke PDF",
"subtitle": "Konversi file email (EML, MSG) ke format PDF. Mendukung ekspor Outlook dan format email standar.",
"acceptedFormats": "File EML, MSG",
"convertButton": "Konversi ke PDF"
} }
} }

View File

@@ -1,492 +1,498 @@
{ {
"categories": { "categories": {
"popularTools": "Strumenti popolari", "popularTools": "Strumenti popolari",
"editAnnotate": "Modifica e Annota", "editAnnotate": "Modifica e Annota",
"convertToPdf": "Converti in PDF", "convertToPdf": "Converti in PDF",
"convertFromPdf": "Convert da PDF", "convertFromPdf": "Convert da PDF",
"organizeManage": "Organizza e Gestisci", "organizeManage": "Organizza e Gestisci",
"optimizeRepair": "Ottimizza e Ripara", "optimizeRepair": "Ottimizza e Ripara",
"securePdf": "Proteggi PDF" "securePdf": "Proteggi PDF"
}, },
"pdfMultiTool": { "pdfMultiTool": {
"name": "PDF Multi Tool", "name": "PDF Multi Tool",
"subtitle": "Unisci, Dividi, Organizza, Elimina, Ruota, Aggiungi Pagine Vuote, Estrai e Duplica in un'interfaccia unificata." "subtitle": "Unisci, Dividi, Organizza, Elimina, Ruota, Aggiungi Pagine Vuote, Estrai e Duplica in un'interfaccia unificata."
}, },
"mergePdf": { "mergePdf": {
"name": "Unisci PDF", "name": "Unisci PDF",
"subtitle": "Unisci più PDF in un unico file. Conserva i Segnalibri." "subtitle": "Unisci più PDF in un unico file. Conserva i Segnalibri."
}, },
"splitPdf": { "splitPdf": {
"name": "Dividi PDF", "name": "Dividi PDF",
"subtitle": "Estrai un insieme di pagine in un nuovo PDF." "subtitle": "Estrai un insieme di pagine in un nuovo PDF."
}, },
"compressPdf": { "compressPdf": {
"name": "Comprimi PDF", "name": "Comprimi PDF",
"subtitle": "Riduci le dimensioni del tuo PDF.", "subtitle": "Riduci le dimensioni del tuo PDF.",
"algorithmLabel": "Algoritmo di compressione", "algorithmLabel": "Algoritmo di compressione",
"condense": "Condensa (Consigliato)", "condense": "Condensa (Consigliato)",
"photon": "Photon (Per PDF con molte foto)", "photon": "Photon (Per PDF con molte foto)",
"condenseInfo": "Condensa usa la compressione avanzata: rimuove peso inutile, ottimizza le immagini, riduce i font. Migliore per la maggior parte dei PDF.", "condenseInfo": "Condensa usa la compressione avanzata: rimuove peso inutile, ottimizza le immagini, riduce i font. Migliore per la maggior parte dei PDF.",
"photonInfo": "Photon converte le pagine in immagini. Usalo per PDF con molte foto o scannerizzati.", "photonInfo": "Photon converte le pagine in immagini. Usalo per PDF con molte foto o scannerizzati.",
"photonWarning": "Attenzione: il testo non sarà selezionabile e i link smetteranno di funzionare.", "photonWarning": "Attenzione: il testo non sarà selezionabile e i link smetteranno di funzionare.",
"levelLabel": "Livello di compressione", "levelLabel": "Livello di compressione",
"light": "Leggero (Preserva qualità)", "light": "Leggero (Preserva qualità)",
"balanced": "Bilanciato (Consigliato)", "balanced": "Bilanciato (Consigliato)",
"aggressive": "Aggressivo (File più piccoli)", "aggressive": "Aggressivo (File più piccoli)",
"extreme": "Estremo (Compressione massima)", "extreme": "Estremo (Compressione massima)",
"grayscale": "Converti in scala di grigi", "grayscale": "Converti in scala di grigi",
"grayscaleHint": "Riduce le dimensioni rimuovendo le informazioni di colore", "grayscaleHint": "Riduce le dimensioni rimuovendo le informazioni di colore",
"customSettings": "Impostazioni personalizzate", "customSettings": "Impostazioni personalizzate",
"customSettingsHint": "Affina i parametri di compressione:", "customSettingsHint": "Affina i parametri di compressione:",
"outputQuality": "Qualità di output", "outputQuality": "Qualità di output",
"resizeImagesTo": "Ridimensiona le immagini a", "resizeImagesTo": "Ridimensiona le immagini a",
"onlyProcessAbove": "Elabora solo sopra", "onlyProcessAbove": "Elabora solo sopra",
"removeMetadata": "Rimuovi metadati", "removeMetadata": "Rimuovi metadati",
"subsetFonts": "Riduci i font (rimuovi glifi non usati)", "subsetFonts": "Riduci i font (rimuovi glifi non usati)",
"removeThumbnails": "Rimuovi miniature incorporate", "removeThumbnails": "Rimuovi miniature incorporate",
"compressButton": "Comprimi PDF" "compressButton": "Comprimi PDF"
}, },
"pdfEditor": { "pdfEditor": {
"name": "Editor PDF", "name": "Editor PDF",
"subtitle": "Annota, evidenzia, redigi, commenta, aggiungi forme/immagini, cerca e visualizza PDF." "subtitle": "Annota, evidenzia, redigi, commenta, aggiungi forme/immagini, cerca e visualizza PDF."
}, },
"jpgToPdf": { "jpgToPdf": {
"name": "JPG in PDF", "name": "JPG in PDF",
"subtitle": "Crea un PDF da immagini JPG, JPEG e JPEG2000 (JP2/JPX)." "subtitle": "Crea un PDF da immagini JPG, JPEG e JPEG2000 (JP2/JPX)."
}, },
"signPdf": { "signPdf": {
"name": "Firma PDF", "name": "Firma PDF",
"subtitle": "Disegna, digita o carica la tua firma." "subtitle": "Disegna, digita o carica la tua firma."
}, },
"cropPdf": { "cropPdf": {
"name": "Ritaglia PDF", "name": "Ritaglia PDF",
"subtitle": "Rimuovi i margini di ogni pagina del tuo PDF." "subtitle": "Rimuovi i margini di ogni pagina del tuo PDF."
}, },
"extractPages": { "extractPages": {
"name": "Estrai Pagine", "name": "Estrai Pagine",
"subtitle": "Salva una selezione di pagine come nuovi file." "subtitle": "Salva una selezione di pagine come nuovi file."
}, },
"duplicateOrganize": { "duplicateOrganize": {
"name": "Duplica e Organizza", "name": "Duplica e Organizza",
"subtitle": "Duplica, riordina e elimina pagine." "subtitle": "Duplica, riordina e elimina pagine."
}, },
"deletePages": { "deletePages": {
"name": "Elimina Pagine", "name": "Elimina Pagine",
"subtitle": "Rimuovi pagine specifiche dal tuo documento." "subtitle": "Rimuovi pagine specifiche dal tuo documento."
}, },
"editBookmarks": { "editBookmarks": {
"name": "Modifica Segnalibri", "name": "Modifica Segnalibri",
"subtitle": "Aggiungi, modifica, importa, elimina ed estrai segnalibri PDF." "subtitle": "Aggiungi, modifica, importa, elimina ed estrai segnalibri PDF."
}, },
"tableOfContents": { "tableOfContents": {
"name": "Indice", "name": "Indice",
"subtitle": "Genera una pagina di indice dai segnalibri del PDF." "subtitle": "Genera una pagina di indice dai segnalibri del PDF."
}, },
"pageNumbers": { "pageNumbers": {
"name": "Numeri di Pagina", "name": "Numeri di Pagina",
"subtitle": "Inserisci i numeri di pagina nel tuo documento." "subtitle": "Inserisci i numeri di pagina nel tuo documento."
}, },
"addWatermark": { "addWatermark": {
"name": "Aggiungi Filigrana", "name": "Aggiungi Filigrana",
"subtitle": "Applica testo o un'immagine sulle pagine del tuo PDF." "subtitle": "Applica testo o un'immagine sulle pagine del tuo PDF."
}, },
"headerFooter": { "headerFooter": {
"name": "Intestazione e Piè di Pagina", "name": "Intestazione e Piè di Pagina",
"subtitle": "Aggiungi testo nella parte superiore e inferiore delle pagine." "subtitle": "Aggiungi testo nella parte superiore e inferiore delle pagine."
}, },
"invertColors": { "invertColors": {
"name": "Inverti Colori", "name": "Inverti Colori",
"subtitle": "Crea una versione \"modalità scura\" del tuo PDF." "subtitle": "Crea una versione \"modalità scura\" del tuo PDF."
}, },
"backgroundColor": { "backgroundColor": {
"name": "Colore di Sfondo", "name": "Colore di Sfondo",
"subtitle": "Cambia il colore di sfondo del tuo PDF." "subtitle": "Cambia il colore di sfondo del tuo PDF."
}, },
"changeTextColor": { "changeTextColor": {
"name": "Cambia Colore Testo", "name": "Cambia Colore Testo",
"subtitle": "Cambia il colore del testo nel tuo PDF." "subtitle": "Cambia il colore del testo nel tuo PDF."
}, },
"addStamps": { "addStamps": {
"name": "Aggiungi Timbri", "name": "Aggiungi Timbri",
"subtitle": "Aggiungi timbri immagine al tuo PDF usando la barra degli strumenti di annotazione.", "subtitle": "Aggiungi timbri immagine al tuo PDF usando la barra degli strumenti di annotazione.",
"usernameLabel": "Nome sul timbro", "usernameLabel": "Nome sul timbro",
"usernamePlaceholder": "Inserisci il tuo nome (per i timbri)", "usernamePlaceholder": "Inserisci il tuo nome (per i timbri)",
"usernameHint": "Questo nome apparirà sui timbri che crei." "usernameHint": "Questo nome apparirà sui timbri che crei."
}, },
"removeAnnotations": { "removeAnnotations": {
"name": "Rimuovi Annotazioni", "name": "Rimuovi Annotazioni",
"subtitle": "Rimuovi commenti, evidenziazioni e link." "subtitle": "Rimuovi commenti, evidenziazioni e link."
}, },
"pdfFormFiller": { "pdfFormFiller": {
"name": "Compilatore Moduli PDF", "name": "Compilatore Moduli PDF",
"subtitle": "Compila i moduli direttamente nel browser. Supporta anche i moduli XFA." "subtitle": "Compila i moduli direttamente nel browser. Supporta anche i moduli XFA."
}, },
"createPdfForm": { "createPdfForm": {
"name": "Crea Modulo PDF", "name": "Crea Modulo PDF",
"subtitle": "Crea moduli PDF compilabili con campi di testo drag-and-drop." "subtitle": "Crea moduli PDF compilabili con campi di testo drag-and-drop."
}, },
"removeBlankPages": { "removeBlankPages": {
"name": "Rimuovi Pagine Vuote", "name": "Rimuovi Pagine Vuote",
"subtitle": "Rileva e elimina automaticamente le pagine vuote." "subtitle": "Rileva e elimina automaticamente le pagine vuote."
}, },
"imageToPdf": { "imageToPdf": {
"name": "Immagini in PDF", "name": "Immagini in PDF",
"subtitle": "Converti JPG, PNG, BMP, GIF, TIFF, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2, PSD, SVG, HEIC, WebP in PDF." "subtitle": "Converti JPG, PNG, BMP, GIF, TIFF, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2, PSD, SVG, HEIC, WebP in PDF."
}, },
"pngToPdf": { "pngToPdf": {
"name": "PNG in PDF", "name": "PNG in PDF",
"subtitle": "Crea un PDF da una o più immagini PNG." "subtitle": "Crea un PDF da una o più immagini PNG."
}, },
"webpToPdf": { "webpToPdf": {
"name": "WebP in PDF", "name": "WebP in PDF",
"subtitle": "Crea un PDF da una o più immagini WebP." "subtitle": "Crea un PDF da una o più immagini WebP."
}, },
"svgToPdf": { "svgToPdf": {
"name": "SVG in PDF", "name": "SVG in PDF",
"subtitle": "Crea un PDF da una o più immagini SVG." "subtitle": "Crea un PDF da una o più immagini SVG."
}, },
"bmpToPdf": { "bmpToPdf": {
"name": "BMP in PDF", "name": "BMP in PDF",
"subtitle": "Crea un PDF da una o più immagini BMP." "subtitle": "Crea un PDF da una o più immagini BMP."
}, },
"heicToPdf": { "heicToPdf": {
"name": "HEIC in PDF", "name": "HEIC in PDF",
"subtitle": "Crea un PDF da una o più immagini HEIC." "subtitle": "Crea un PDF da una o più immagini HEIC."
}, },
"tiffToPdf": { "tiffToPdf": {
"name": "TIFF in PDF", "name": "TIFF in PDF",
"subtitle": "Crea un PDF da una o più immagini TIFF." "subtitle": "Crea un PDF da una o più immagini TIFF."
}, },
"textToPdf": { "textToPdf": {
"name": "Testo in PDF", "name": "Testo in PDF",
"subtitle": "Converti un file di testo semplice in un PDF." "subtitle": "Converti un file di testo semplice in un PDF."
}, },
"jsonToPdf": { "jsonToPdf": {
"name": "JSON in PDF", "name": "JSON in PDF",
"subtitle": "Converti file JSON in formato PDF." "subtitle": "Converti file JSON in formato PDF."
}, },
"pdfToJpg": { "pdfToJpg": {
"name": "PDF in JPG", "name": "PDF in JPG",
"subtitle": "Converti ogni pagina del PDF in un'immagine JPG." "subtitle": "Converti ogni pagina del PDF in un'immagine JPG."
}, },
"pdfToPng": { "pdfToPng": {
"name": "PDF in PNG", "name": "PDF in PNG",
"subtitle": "Converti ogni pagina del PDF in un'immagine PNG." "subtitle": "Converti ogni pagina del PDF in un'immagine PNG."
}, },
"pdfToWebp": { "pdfToWebp": {
"name": "PDF in WebP", "name": "PDF in WebP",
"subtitle": "Converti ogni pagina del PDF in un'immagine WebP." "subtitle": "Converti ogni pagina del PDF in un'immagine WebP."
}, },
"pdfToBmp": { "pdfToBmp": {
"name": "PDF in BMP", "name": "PDF in BMP",
"subtitle": "Converti ogni pagina del PDF in un'immagine BMP." "subtitle": "Converti ogni pagina del PDF in un'immagine BMP."
}, },
"pdfToTiff": { "pdfToTiff": {
"name": "PDF in TIFF", "name": "PDF in TIFF",
"subtitle": "Converti ogni pagina del PDF in un'immagine TIFF." "subtitle": "Converti ogni pagina del PDF in un'immagine TIFF."
}, },
"pdfToGreyscale": { "pdfToGreyscale": {
"name": "PDF in Scala di Grigi", "name": "PDF in Scala di Grigi",
"subtitle": "Converti tutti i colori in scala di grigi." "subtitle": "Converti tutti i colori in scala di grigi."
}, },
"pdfToJson": { "pdfToJson": {
"name": "PDF in JSON", "name": "PDF in JSON",
"subtitle": "Converti file PDF in formato JSON." "subtitle": "Converti file PDF in formato JSON."
}, },
"ocrPdf": { "ocrPdf": {
"name": "OCR PDF", "name": "OCR PDF",
"subtitle": "Rendi un PDF ricercabile e copiabile." "subtitle": "Rendi un PDF ricercabile e copiabile."
}, },
"alternateMix": { "alternateMix": {
"name": "Alterna e Riordina Pagine", "name": "Alterna e Riordina Pagine",
"subtitle": "Unisci PDF sostituendo le pagine di ogni file. Conserva i segnalibri." "subtitle": "Unisci PDF sostituendo le pagine di ogni file. Conserva i segnalibri."
}, },
"addAttachments": { "addAttachments": {
"name": "Aggiungi Allegati", "name": "Aggiungi Allegati",
"subtitle": "Incorpora uno o più file nel tuo PDF." "subtitle": "Incorpora uno o più file nel tuo PDF."
}, },
"extractAttachments": { "extractAttachments": {
"name": "Estrai Allegati", "name": "Estrai Allegati",
"subtitle": "Estrai tutti i file incorporati dai PDF come archivio ZIP." "subtitle": "Estrai tutti i file incorporati dai PDF come archivio ZIP."
}, },
"editAttachments": { "editAttachments": {
"name": "Modifica Allegati", "name": "Modifica Allegati",
"subtitle": "Visualizza o rimuovi gli allegati nel tuo PDF." "subtitle": "Visualizza o rimuovi gli allegati nel tuo PDF."
}, },
"dividePages": { "dividePages": {
"name": "Dividi Pagine", "name": "Dividi Pagine",
"subtitle": "Dividi le pagine orizzontalmente o verticalmente." "subtitle": "Dividi le pagine orizzontalmente o verticalmente."
}, },
"addBlankPage": { "addBlankPage": {
"name": "Aggiungi Pagina Vuota", "name": "Aggiungi Pagina Vuota",
"subtitle": "Inserisci una pagina vuota in qualsiasi punto del tuo PDF." "subtitle": "Inserisci una pagina vuota in qualsiasi punto del tuo PDF."
}, },
"reversePages": { "reversePages": {
"name": "Inverti Pagine", "name": "Inverti Pagine",
"subtitle": "Inverti l'ordine di tutte le pagine del documento." "subtitle": "Inverti l'ordine di tutte le pagine del documento."
}, },
"rotatePdf": { "rotatePdf": {
"name": "Ruota PDF", "name": "Ruota PDF",
"subtitle": "Ruota le pagine per multipli di 90 gradi." "subtitle": "Ruota le pagine per multipli di 90 gradi."
}, },
"rotateCustom": { "rotateCustom": {
"name": "Ruota di Gradi Personalizzati", "name": "Ruota di Gradi Personalizzati",
"subtitle": "Ruota le pagine di un angolo personalizzato." "subtitle": "Ruota le pagine di un angolo personalizzato."
}, },
"nUpPdf": { "nUpPdf": {
"name": "N-Up PDF", "name": "N-Up PDF",
"subtitle": "Disponi più pagine su un unico foglio." "subtitle": "Disponi più pagine su un unico foglio."
}, },
"combineToSinglePage": { "combineToSinglePage": {
"name": "Combina in Una Pagina", "name": "Combina in Una Pagina",
"subtitle": "Unisci tutte le pagine in un'unica pagina continua." "subtitle": "Unisci tutte le pagine in un'unica pagina continua."
}, },
"viewMetadata": { "viewMetadata": {
"name": "Visualizza Metadati", "name": "Visualizza Metadati",
"subtitle": "Ispeziona le proprietà nascoste del tuo PDF." "subtitle": "Ispeziona le proprietà nascoste del tuo PDF."
}, },
"editMetadata": { "editMetadata": {
"name": "Modifica Metadati", "name": "Modifica Metadati",
"subtitle": "Modifica autore, titolo e altre proprietà." "subtitle": "Modifica autore, titolo e altre proprietà."
}, },
"pdfsToZip": { "pdfsToZip": {
"name": "PDF in ZIP", "name": "PDF in ZIP",
"subtitle": "Raggruppa più file PDF in un archivio ZIP." "subtitle": "Raggruppa più file PDF in un archivio ZIP."
}, },
"comparePdfs": { "comparePdfs": {
"name": "Confronta PDF", "name": "Confronta PDF",
"subtitle": "Confronta due PDF fianco a fianco." "subtitle": "Confronta due PDF fianco a fianco."
}, },
"posterizePdf": { "posterizePdf": {
"name": "Posterizza PDF", "name": "Posterizza PDF",
"subtitle": "Dividi una pagina grande in più pagine più piccole." "subtitle": "Dividi una pagina grande in più pagine più piccole."
}, },
"fixPageSize": { "fixPageSize": {
"name": "Correggi Dimensione Pagina", "name": "Correggi Dimensione Pagina",
"subtitle": "Uniforma tutte le pagine a una dimensione standard." "subtitle": "Uniforma tutte le pagine a una dimensione standard."
}, },
"linearizePdf": { "linearizePdf": {
"name": "Linearizza PDF", "name": "Linearizza PDF",
"subtitle": "Ottimizza il PDF per una visualizzazione web più veloce." "subtitle": "Ottimizza il PDF per una visualizzazione web più veloce."
}, },
"pageDimensions": { "pageDimensions": {
"name": "Dimensioni Pagina", "name": "Dimensioni Pagina",
"subtitle": "Analizza dimensione, orientamento e unità delle pagine." "subtitle": "Analizza dimensione, orientamento e unità delle pagine."
}, },
"removeRestrictions": { "removeRestrictions": {
"name": "Rimuovi Restrizioni", "name": "Rimuovi Restrizioni",
"subtitle": "Rimuovi la protezione tramite password e le restrizioni di sicurezza associate ai PDF firmati digitalmente." "subtitle": "Rimuovi la protezione tramite password e le restrizioni di sicurezza associate ai PDF firmati digitalmente."
}, },
"repairPdf": { "repairPdf": {
"name": "Ripara PDF", "name": "Ripara PDF",
"subtitle": "Recupera i dati da file PDF corrotti o danneggiati." "subtitle": "Recupera i dati da file PDF corrotti o danneggiati."
}, },
"encryptPdf": { "encryptPdf": {
"name": "Cripta PDF", "name": "Cripta PDF",
"subtitle": "Proteggi il tuo PDF aggiungendo una password." "subtitle": "Proteggi il tuo PDF aggiungendo una password."
}, },
"sanitizePdf": { "sanitizePdf": {
"name": "Sanitizza PDF", "name": "Sanitizza PDF",
"subtitle": "Rimuovi metadati, annotazioni, script e altro." "subtitle": "Rimuovi metadati, annotazioni, script e altro."
}, },
"decryptPdf": { "decryptPdf": {
"name": "Decrittografa PDF", "name": "Decrittografa PDF",
"subtitle": "Sblocca il PDF rimuovendo la protezione tramite password." "subtitle": "Sblocca il PDF rimuovendo la protezione tramite password."
}, },
"flattenPdf": { "flattenPdf": {
"name": "Appiattisci PDF", "name": "Appiattisci PDF",
"subtitle": "Rendi i campi dei moduli e le annotazioni non modificabili." "subtitle": "Rendi i campi dei moduli e le annotazioni non modificabili."
}, },
"removeMetadata": { "removeMetadata": {
"name": "Rimuovi metadati", "name": "Rimuovi metadati",
"subtitle": "Rimuovi i dati nascosti dal tuo PDF." "subtitle": "Rimuovi i dati nascosti dal tuo PDF."
}, },
"changePermissions": { "changePermissions": {
"name": "Modifica permessi", "name": "Modifica permessi",
"subtitle": "Imposta o modifica i permessi utente su un PDF." "subtitle": "Imposta o modifica i permessi utente su un PDF."
}, },
"odtToPdf": { "odtToPdf": {
"name": "ODT in PDF", "name": "ODT in PDF",
"subtitle": "Converti file OpenDocument Text in formato PDF. Supporta più file.", "subtitle": "Converti file OpenDocument Text in formato PDF. Supporta più file.",
"acceptedFormats": "File ODT", "acceptedFormats": "File ODT",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"csvToPdf": { "csvToPdf": {
"name": "CSV in PDF", "name": "CSV in PDF",
"subtitle": "Converti file di foglio di calcolo CSV in formato PDF. Supporta più file.", "subtitle": "Converti file di foglio di calcolo CSV in formato PDF. Supporta più file.",
"acceptedFormats": "File CSV", "acceptedFormats": "File CSV",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"rtfToPdf": { "rtfToPdf": {
"name": "RTF in PDF", "name": "RTF in PDF",
"subtitle": "Converti documenti Rich Text Format in PDF. Supporta più file.", "subtitle": "Converti documenti Rich Text Format in PDF. Supporta più file.",
"acceptedFormats": "File RTF", "acceptedFormats": "File RTF",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"wordToPdf": { "wordToPdf": {
"name": "Word in PDF", "name": "Word in PDF",
"subtitle": "Converti documenti Word (DOCX, DOC, ODT, RTF) in formato PDF. Supporta più file.", "subtitle": "Converti documenti Word (DOCX, DOC, ODT, RTF) in formato PDF. Supporta più file.",
"acceptedFormats": "File DOCX, DOC, ODT, RTF", "acceptedFormats": "File DOCX, DOC, ODT, RTF",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"excelToPdf": { "excelToPdf": {
"name": "Excel in PDF", "name": "Excel in PDF",
"subtitle": "Converti fogli Excel (XLSX, XLS, ODS, CSV) in formato PDF. Supporta più file.", "subtitle": "Converti fogli Excel (XLSX, XLS, ODS, CSV) in formato PDF. Supporta più file.",
"acceptedFormats": "File XLSX, XLS, ODS, CSV", "acceptedFormats": "File XLSX, XLS, ODS, CSV",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"powerpointToPdf": { "powerpointToPdf": {
"name": "PowerPoint in PDF", "name": "PowerPoint in PDF",
"subtitle": "Converti presentazioni PowerPoint (PPTX, PPT, ODP) in formato PDF. Supporta più file.", "subtitle": "Converti presentazioni PowerPoint (PPTX, PPT, ODP) in formato PDF. Supporta più file.",
"acceptedFormats": "File PPTX, PPT, ODP", "acceptedFormats": "File PPTX, PPT, ODP",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"markdownToPdf": { "markdownToPdf": {
"name": "Markdown in PDF", "name": "Markdown in PDF",
"subtitle": "Scrivi o incolla Markdown ed esportalo come un PDF ben formattato.", "subtitle": "Scrivi o incolla Markdown ed esportalo come un PDF ben formattato.",
"paneMarkdown": "Markdown", "paneMarkdown": "Markdown",
"panePreview": "Anteprima", "panePreview": "Anteprima",
"btnUpload": "Carica", "btnUpload": "Carica",
"btnSyncScroll": "Sincronizza scorrimento", "btnSyncScroll": "Sincronizza scorrimento",
"btnSettings": "Impostazioni", "btnSettings": "Impostazioni",
"btnExportPdf": "Esporta PDF", "btnExportPdf": "Esporta PDF",
"settingsTitle": "Impostazioni Markdown", "settingsTitle": "Impostazioni Markdown",
"settingsPreset": "Preset", "settingsPreset": "Preset",
"presetDefault": "Predefinito (simile a GFM)", "presetDefault": "Predefinito (simile a GFM)",
"presetCommonmark": "CommonMark (rigoroso)", "presetCommonmark": "CommonMark (rigoroso)",
"presetZero": "Minimale (nessuna funzionalità)", "presetZero": "Minimale (nessuna funzionalità)",
"settingsOptions": "Opzioni Markdown", "settingsOptions": "Opzioni Markdown",
"optAllowHtml": "Consenti tag HTML", "optAllowHtml": "Consenti tag HTML",
"optBreaks": "Converti nuove righe in <br>", "optBreaks": "Converti nuove righe in <br>",
"optLinkify": "Converti automaticamente gli URL in link", "optLinkify": "Converti automaticamente gli URL in link",
"optTypographer": "Tipografia (virgolette intelligenti, ecc.)" "optTypographer": "Tipografia (virgolette intelligenti, ecc.)"
}, },
"pdfBooklet": { "pdfBooklet": {
"name": "Opuscolo PDF", "name": "Opuscolo PDF",
"subtitle": "Riorganizza le pagine per la stampa di opuscoli fronte-retro. Piega e pinza per creare un opuscolo.", "subtitle": "Riorganizza le pagine per la stampa di opuscoli fronte-retro. Piega e pinza per creare un opuscolo.",
"howItWorks": "Come funziona:", "howItWorks": "Come funziona:",
"step1": "Carica un file PDF.", "step1": "Carica un file PDF.",
"step2": "Le pagine saranno riorganizzate in ordine per opuscolo.", "step2": "Le pagine saranno riorganizzate in ordine per opuscolo.",
"step3": "Stampa fronte-retro, capovolgi sul lato corto, piega e pinza.", "step3": "Stampa fronte-retro, capovolgi sul lato corto, piega e pinza.",
"paperSize": "Formato carta", "paperSize": "Formato carta",
"orientation": "Orientamento", "orientation": "Orientamento",
"portrait": "Ritratto", "portrait": "Ritratto",
"landscape": "Paesaggio", "landscape": "Paesaggio",
"pagesPerSheet": "Pagine per foglio", "pagesPerSheet": "Pagine per foglio",
"createBooklet": "Crea opuscolo", "createBooklet": "Crea opuscolo",
"processing": "Elaborazione...", "processing": "Elaborazione...",
"pageCount": "Il conteggio delle pagine verrà arrotondato ad un multiplo di 4 se necessario." "pageCount": "Il conteggio delle pagine verrà arrotondato ad un multiplo di 4 se necessario."
}, },
"xpsToPdf": { "xpsToPdf": {
"name": "XPS in PDF", "name": "XPS in PDF",
"subtitle": "Converti documenti XPS/OXPS in formato PDF. Supporta più file.", "subtitle": "Converti documenti XPS/OXPS in formato PDF. Supporta più file.",
"acceptedFormats": "File XPS, OXPS", "acceptedFormats": "File XPS, OXPS",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"mobiToPdf": { "mobiToPdf": {
"name": "MOBI in PDF", "name": "MOBI in PDF",
"subtitle": "Converti e-book MOBI in formato PDF. Supporta più file.", "subtitle": "Converti e-book MOBI in formato PDF. Supporta più file.",
"acceptedFormats": "File MOBI", "acceptedFormats": "File MOBI",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"epubToPdf": { "epubToPdf": {
"name": "EPUB in PDF", "name": "EPUB in PDF",
"subtitle": "Converti e-book EPUB in formato PDF. Supporta più file.", "subtitle": "Converti e-book EPUB in formato PDF. Supporta più file.",
"acceptedFormats": "File EPUB", "acceptedFormats": "File EPUB",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"fb2ToPdf": { "fb2ToPdf": {
"name": "FB2 in PDF", "name": "FB2 in PDF",
"subtitle": "Converti e-book FictionBook (FB2) in formato PDF. Supporta più file.", "subtitle": "Converti e-book FictionBook (FB2) in formato PDF. Supporta più file.",
"acceptedFormats": "File FB2", "acceptedFormats": "File FB2",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"cbzToPdf": { "cbzToPdf": {
"name": "CBZ in PDF", "name": "CBZ in PDF",
"subtitle": "Converti archivi di fumetti (CBZ/CBR) in formato PDF. Supporta più file.", "subtitle": "Converti archivi di fumetti (CBZ/CBR) in formato PDF. Supporta più file.",
"acceptedFormats": "File CBZ, CBR", "acceptedFormats": "File CBZ, CBR",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"wpdToPdf": { "wpdToPdf": {
"name": "WPD in PDF", "name": "WPD in PDF",
"subtitle": "Converti documenti WordPerfect (WPD) in formato PDF. Supporta più file.", "subtitle": "Converti documenti WordPerfect (WPD) in formato PDF. Supporta più file.",
"acceptedFormats": "File WPD", "acceptedFormats": "File WPD",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"wpsToPdf": { "wpsToPdf": {
"name": "WPS in PDF", "name": "WPS in PDF",
"subtitle": "Converti documenti WPS Office in formato PDF. Supporta più file.", "subtitle": "Converti documenti WPS Office in formato PDF. Supporta più file.",
"acceptedFormats": "File WPS", "acceptedFormats": "File WPS",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"xmlToPdf": { "xmlToPdf": {
"name": "XML in PDF", "name": "XML in PDF",
"subtitle": "Converti documenti XML in formato PDF. Supporta più file.", "subtitle": "Converti documenti XML in formato PDF. Supporta più file.",
"acceptedFormats": "File XML", "acceptedFormats": "File XML",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"pagesToPdf": { "pagesToPdf": {
"name": "Pages in PDF", "name": "Pages in PDF",
"subtitle": "Converti documenti Apple Pages in formato PDF. Supporta più file.", "subtitle": "Converti documenti Apple Pages in formato PDF. Supporta più file.",
"acceptedFormats": "File Pages", "acceptedFormats": "File Pages",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"odgToPdf": { "odgToPdf": {
"name": "ODG in PDF", "name": "ODG in PDF",
"subtitle": "Converti OpenDocument Graphics (ODG) in formato PDF. Supporta più file.", "subtitle": "Converti OpenDocument Graphics (ODG) in formato PDF. Supporta più file.",
"acceptedFormats": "File ODG", "acceptedFormats": "File ODG",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"odsToPdf": { "odsToPdf": {
"name": "ODS in PDF", "name": "ODS in PDF",
"subtitle": "Converti fogli OpenDocument (ODS) in formato PDF. Supporta più file.", "subtitle": "Converti fogli OpenDocument (ODS) in formato PDF. Supporta più file.",
"acceptedFormats": "File ODS", "acceptedFormats": "File ODS",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"odpToPdf": { "odpToPdf": {
"name": "ODP in PDF", "name": "ODP in PDF",
"subtitle": "Converti presentazioni OpenDocument (ODP) in formato PDF. Supporta più file.", "subtitle": "Converti presentazioni OpenDocument (ODP) in formato PDF. Supporta più file.",
"acceptedFormats": "File ODP", "acceptedFormats": "File ODP",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"pubToPdf": { "pubToPdf": {
"name": "PUB in PDF", "name": "PUB in PDF",
"subtitle": "Converti file Microsoft Publisher (PUB) in formato PDF. Supporta più file.", "subtitle": "Converti file Microsoft Publisher (PUB) in formato PDF. Supporta più file.",
"acceptedFormats": "File PUB", "acceptedFormats": "File PUB",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"vsdToPdf": { "vsdToPdf": {
"name": "VSD in PDF", "name": "VSD in PDF",
"subtitle": "Converti file Microsoft Visio (VSD, VSDX) in formato PDF. Supporta più file.", "subtitle": "Converti file Microsoft Visio (VSD, VSDX) in formato PDF. Supporta più file.",
"acceptedFormats": "File VSD, VSDX", "acceptedFormats": "File VSD, VSDX",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"psdToPdf": { "psdToPdf": {
"name": "PSD in PDF", "name": "PSD in PDF",
"subtitle": "Converti file Adobe Photoshop (PSD) in formato PDF. Supporta più file.", "subtitle": "Converti file Adobe Photoshop (PSD) in formato PDF. Supporta più file.",
"acceptedFormats": "File PSD", "acceptedFormats": "File PSD",
"convertButton": "Converti in PDF" "convertButton": "Converti in PDF"
}, },
"pdfToSvg": { "pdfToSvg": {
"name": "PDF in SVG", "name": "PDF in SVG",
"subtitle": "Converti ogni pagina di un file PDF in un'immagine vettoriale scalabile (SVG) per qualità perfetta a qualsiasi dimensione." "subtitle": "Converti ogni pagina di un file PDF in un'immagine vettoriale scalabile (SVG) per qualità perfetta a qualsiasi dimensione."
}, },
"extractTables": { "extractTables": {
"name": "Estrai tabelle PDF", "name": "Estrai tabelle PDF",
"subtitle": "Estrai le tabelle dai file PDF ed esportale come CSV, JSON o Markdown." "subtitle": "Estrai le tabelle dai file PDF ed esportale come CSV, JSON o Markdown."
}, },
"pdfToCsv": { "pdfToCsv": {
"name": "PDF in CSV", "name": "PDF in CSV",
"subtitle": "Estrai tabelle dai PDF e convertili in formato CSV." "subtitle": "Estrai tabelle dai PDF e convertili in formato CSV."
}, },
"pdfToExcel": { "pdfToExcel": {
"name": "PDF in Excel", "name": "PDF in Excel",
"subtitle": "Estrai tabelle dai PDF e convertili in Excel (XLSX)." "subtitle": "Estrai tabelle dai PDF e convertili in Excel (XLSX)."
}, },
"pdfToText": { "pdfToText": {
"name": "PDF in Testo", "name": "PDF in Testo",
"subtitle": "Estrai il testo dai file PDF e salvalo come testo semplice (.txt). Supporta più file.", "subtitle": "Estrai il testo dai file PDF e salvalo come testo semplice (.txt). Supporta più file.",
"note": "Questo strumento funziona SOLO con PDF creati digitalmente. Per documenti scansionati o basati su immagini, usa invece il nostro strumento OCR PDF.", "note": "Questo strumento funziona SOLO con PDF creati digitalmente. Per documenti scansionati o basati su immagini, usa invece il nostro strumento OCR PDF.",
"convertButton": "Estrai testo" "convertButton": "Estrai testo"
} },
} "emailToPdf": {
"name": "Email in PDF",
"subtitle": "Converti file email (EML, MSG) in formato PDF. Supporta esportazioni Outlook e formati email standard.",
"acceptedFormats": "File EML, MSG",
"convertButton": "Converti in PDF"
}
}

View File

@@ -1,282 +1,288 @@
{ {
"categories": { "categories": {
"popularTools": "Popüler Araçlar", "popularTools": "Popüler Araçlar",
"editAnnotate": "Düzenle & Açıklama Ekle", "editAnnotate": "Düzenle & Açıklama Ekle",
"convertToPdf": "PDF'ye Dönüştür", "convertToPdf": "PDF'ye Dönüştür",
"convertFromPdf": "PDF'den Dönüştür", "convertFromPdf": "PDF'den Dönüştür",
"organizeManage": "Düzenle & Yönet", "organizeManage": "Düzenle & Yönet",
"optimizeRepair": "Optimize Et & Onar", "optimizeRepair": "Optimize Et & Onar",
"securePdf": "PDF Güvenliği" "securePdf": "PDF Güvenliği"
}, },
"pdfMultiTool": { "pdfMultiTool": {
"name": "PDF Çoklu Araç", "name": "PDF Çoklu Araç",
"subtitle": "Birleştir, Böl, Düzenle, Sil, Döndür, Boş Sayfa Ekle, Çıkar ve Çoğalt işlemlerini tek bir arayüzde yapın." "subtitle": "Birleştir, Böl, Düzenle, Sil, Döndür, Boş Sayfa Ekle, Çıkar ve Çoğalt işlemlerini tek bir arayüzde yapın."
}, },
"mergePdf": { "mergePdf": {
"name": "PDF Birleştir", "name": "PDF Birleştir",
"subtitle": "Birden fazla PDF'yi tek bir dosyada birleştirin. Yer imlerini korur." "subtitle": "Birden fazla PDF'yi tek bir dosyada birleştirin. Yer imlerini korur."
}, },
"splitPdf": { "splitPdf": {
"name": "PDF Böl", "name": "PDF Böl",
"subtitle": "Sayfa aralığını yeni bir PDF olarak çıkarın." "subtitle": "Sayfa aralığını yeni bir PDF olarak çıkarın."
}, },
"compressPdf": { "compressPdf": {
"name": "PDF Sıkıştır", "name": "PDF Sıkıştır",
"subtitle": "PDF dosya boyutunu küçültün." "subtitle": "PDF dosya boyutunu küçültün."
}, },
"pdfEditor": { "pdfEditor": {
"name": "PDF Düzenleyici", "name": "PDF Düzenleyici",
"subtitle": "Açıklama ekleyin, vurgulayın, düzenleyin, yorum yapın, şekil/resim ekleyin, arama yapın ve PDF'leri görüntüleyin." "subtitle": "Açıklama ekleyin, vurgulayın, düzenleyin, yorum yapın, şekil/resim ekleyin, arama yapın ve PDF'leri görüntüleyin."
}, },
"jpgToPdf": { "jpgToPdf": {
"name": "JPG'den PDF'ye", "name": "JPG'den PDF'ye",
"subtitle": "Bir veya daha fazla JPG görselinden PDF oluşturun." "subtitle": "Bir veya daha fazla JPG görselinden PDF oluşturun."
}, },
"signPdf": { "signPdf": {
"name": "PDF İmzala", "name": "PDF İmzala",
"subtitle": "İmzanızı çizin, yazın veya yükleyin." "subtitle": "İmzanızı çizin, yazın veya yükleyin."
}, },
"cropPdf": { "cropPdf": {
"name": "PDF Kırp", "name": "PDF Kırp",
"subtitle": "PDF'nizdeki her sayfanın kenar boşluklarını kırpın." "subtitle": "PDF'nizdeki her sayfanın kenar boşluklarını kırpın."
}, },
"extractPages": { "extractPages": {
"name": "Sayfaları Çıkar", "name": "Sayfaları Çıkar",
"subtitle": "Seçili sayfaları yeni dosyalar olarak kaydedin." "subtitle": "Seçili sayfaları yeni dosyalar olarak kaydedin."
}, },
"duplicateOrganize": { "duplicateOrganize": {
"name": "Çoğalt & Düzenle", "name": "Çoğalt & Düzenle",
"subtitle": "Sayfaları çoğaltın, yeniden sıralayın ve silin." "subtitle": "Sayfaları çoğaltın, yeniden sıralayın ve silin."
}, },
"deletePages": { "deletePages": {
"name": "Sayfaları Sil", "name": "Sayfaları Sil",
"subtitle": "Belgenizden belirli sayfaları kaldırın." "subtitle": "Belgenizden belirli sayfaları kaldırın."
}, },
"editBookmarks": { "editBookmarks": {
"name": "Yer İşaretlerini Düzenle", "name": "Yer İşaretlerini Düzenle",
"subtitle": "PDF yer imlerini ekleyin, düzenleyin, içe aktarın, silin ve çıkarın." "subtitle": "PDF yer imlerini ekleyin, düzenleyin, içe aktarın, silin ve çıkarın."
}, },
"tableOfContents": { "tableOfContents": {
"name": "İçindekiler", "name": "İçindekiler",
"subtitle": "PDF yer imlerinden bir içindekiler sayfası oluşturun." "subtitle": "PDF yer imlerinden bir içindekiler sayfası oluşturun."
}, },
"pageNumbers": { "pageNumbers": {
"name": "Sayfa Numaraları", "name": "Sayfa Numaraları",
"subtitle": "Belgenize sayfa numaraları ekleyin." "subtitle": "Belgenize sayfa numaraları ekleyin."
}, },
"addWatermark": { "addWatermark": {
"name": "Filigran Ekle", "name": "Filigran Ekle",
"subtitle": "PDF sayfalarınızın üzerine metin veya görsel damgası ekleyin." "subtitle": "PDF sayfalarınızın üzerine metin veya görsel damgası ekleyin."
}, },
"headerFooter": { "headerFooter": {
"name": "Üst Bilgi & Alt Bilgi", "name": "Üst Bilgi & Alt Bilgi",
"subtitle": "Sayfaların üst ve alt kısmına metin ekleyin." "subtitle": "Sayfaların üst ve alt kısmına metin ekleyin."
}, },
"invertColors": { "invertColors": {
"name": "Renkleri Ters Çevir", "name": "Renkleri Ters Çevir",
"subtitle": "PDF'niz için \"karanlık mod\" sürümü oluşturun." "subtitle": "PDF'niz için \"karanlık mod\" sürümü oluşturun."
}, },
"backgroundColor": { "backgroundColor": {
"name": "Arka Plan Rengi", "name": "Arka Plan Rengi",
"subtitle": "PDF'nizin arka plan rengini değiştirin." "subtitle": "PDF'nizin arka plan rengini değiştirin."
}, },
"changeTextColor": { "changeTextColor": {
"name": "Metin Rengini Değiştir", "name": "Metin Rengini Değiştir",
"subtitle": "PDF'nizdeki metnin rengini değiştirin." "subtitle": "PDF'nizdeki metnin rengini değiştirin."
}, },
"addStamps": { "addStamps": {
"name": "Damga Ekle", "name": "Damga Ekle",
"subtitle": "Açıklama araç çubuğunu kullanarak PDF'nize damga ekleyin.", "subtitle": "Açıklama araç çubuğunu kullanarak PDF'nize damga ekleyin.",
"usernameLabel": "Kullanıcı Adı", "usernameLabel": "Kullanıcı Adı",
"usernamePlaceholder": "Adınızı girin (damgalar için)", "usernamePlaceholder": "Adınızı girin (damgalar için)",
"usernameHint": "Bu isim oluşturduğunuz damgalarda görünecektir." "usernameHint": "Bu isim oluşturduğunuz damgalarda görünecektir."
}, },
"removeAnnotations": { "removeAnnotations": {
"name": "Açıklamaları Kaldır", "name": "Açıklamaları Kaldır",
"subtitle": "Yorumları, vurguları ve bağlantıları kaldırın." "subtitle": "Yorumları, vurguları ve bağlantıları kaldırın."
}, },
"pdfFormFiller": { "pdfFormFiller": {
"name": "PDF Form Doldurucu", "name": "PDF Form Doldurucu",
"subtitle": "Formları doğrudan tarayıcıda doldurun. XFA formlarını da destekler." "subtitle": "Formları doğrudan tarayıcıda doldurun. XFA formlarını da destekler."
}, },
"createPdfForm": { "createPdfForm": {
"name": "PDF Formu Oluştur", "name": "PDF Formu Oluştur",
"subtitle": "Sürükle-bırak metin alanları ile doldurulabilir PDF formları oluşturun." "subtitle": "Sürükle-bırak metin alanları ile doldurulabilir PDF formları oluşturun."
}, },
"removeBlankPages": { "removeBlankPages": {
"name": "Boş Sayfaları Kaldır", "name": "Boş Sayfaları Kaldır",
"subtitle": "Boş sayfaları otomatik olarak tespit edin ve silin." "subtitle": "Boş sayfaları otomatik olarak tespit edin ve silin."
}, },
"imageToPdf": { "imageToPdf": {
"name": "Görselden PDF'ye", "name": "Görselden PDF'ye",
"subtitle": "JPG, PNG, WebP, BMP, TIFF, SVG, HEIC formatlarını PDF'ye dönüştürün." "subtitle": "JPG, PNG, WebP, BMP, TIFF, SVG, HEIC formatlarını PDF'ye dönüştürün."
}, },
"pngToPdf": { "pngToPdf": {
"name": "PNG'den PDF'ye", "name": "PNG'den PDF'ye",
"subtitle": "Bir veya daha fazla PNG görselinden PDF oluşturun." "subtitle": "Bir veya daha fazla PNG görselinden PDF oluşturun."
}, },
"webpToPdf": { "webpToPdf": {
"name": "WebP'den PDF'ye", "name": "WebP'den PDF'ye",
"subtitle": "Bir veya daha fazla WebP görselinden PDF oluşturun." "subtitle": "Bir veya daha fazla WebP görselinden PDF oluşturun."
}, },
"svgToPdf": { "svgToPdf": {
"name": "SVG'den PDF'ye", "name": "SVG'den PDF'ye",
"subtitle": "Bir veya daha fazla SVG görselinden PDF oluşturun." "subtitle": "Bir veya daha fazla SVG görselinden PDF oluşturun."
}, },
"bmpToPdf": { "bmpToPdf": {
"name": "BMP'den PDF'ye", "name": "BMP'den PDF'ye",
"subtitle": "Bir veya daha fazla BMP görselinden PDF oluşturun." "subtitle": "Bir veya daha fazla BMP görselinden PDF oluşturun."
}, },
"heicToPdf": { "heicToPdf": {
"name": "HEIC'den PDF'ye", "name": "HEIC'den PDF'ye",
"subtitle": "Bir veya daha fazla HEIC görselinden PDF oluşturun." "subtitle": "Bir veya daha fazla HEIC görselinden PDF oluşturun."
}, },
"tiffToPdf": { "tiffToPdf": {
"name": "TIFF'den PDF'ye", "name": "TIFF'den PDF'ye",
"subtitle": "Bir veya daha fazla TIFF görselinden PDF oluşturun." "subtitle": "Bir veya daha fazla TIFF görselinden PDF oluşturun."
}, },
"textToPdf": { "textToPdf": {
"name": "Metinden PDF'ye", "name": "Metinden PDF'ye",
"subtitle": "Düz metin dosyasını PDF'ye dönüştürün." "subtitle": "Düz metin dosyasını PDF'ye dönüştürün."
}, },
"jsonToPdf": { "jsonToPdf": {
"name": "JSON'dan PDF'ye", "name": "JSON'dan PDF'ye",
"subtitle": "JSON dosyalarını PDF formatına dönüştürün." "subtitle": "JSON dosyalarını PDF formatına dönüştürün."
}, },
"pdfToJpg": { "pdfToJpg": {
"name": "PDF'den JPG'ye", "name": "PDF'den JPG'ye",
"subtitle": "Her PDF sayfasını JPG görseline dönüştürün." "subtitle": "Her PDF sayfasını JPG görseline dönüştürün."
}, },
"pdfToPng": { "pdfToPng": {
"name": "PDF'den PNG'ye", "name": "PDF'den PNG'ye",
"subtitle": "Her PDF sayfasını PNG görseline dönüştürün." "subtitle": "Her PDF sayfasını PNG görseline dönüştürün."
}, },
"pdfToWebp": { "pdfToWebp": {
"name": "PDF'den WebP'ye", "name": "PDF'den WebP'ye",
"subtitle": "Her PDF sayfasını WebP görseline dönüştürün." "subtitle": "Her PDF sayfasını WebP görseline dönüştürün."
}, },
"pdfToBmp": { "pdfToBmp": {
"name": "PDF'den BMP'ye", "name": "PDF'den BMP'ye",
"subtitle": "Her PDF sayfasını BMP görseline dönüştürün." "subtitle": "Her PDF sayfasını BMP görseline dönüştürün."
}, },
"pdfToTiff": { "pdfToTiff": {
"name": "PDF'den TIFF'e", "name": "PDF'den TIFF'e",
"subtitle": "Her PDF sayfasını TIFF görseline dönüştürün." "subtitle": "Her PDF sayfasını TIFF görseline dönüştürün."
}, },
"pdfToGreyscale": { "pdfToGreyscale": {
"name": "PDF'yi Gri Tonlamaya Çevir", "name": "PDF'yi Gri Tonlamaya Çevir",
"subtitle": "Tüm renkleri siyah beyaza çevirin." "subtitle": "Tüm renkleri siyah beyaza çevirin."
}, },
"pdfToJson": { "pdfToJson": {
"name": "PDF'den JSON'a", "name": "PDF'den JSON'a",
"subtitle": "PDF dosyalarını JSON formatına dönüştürün." "subtitle": "PDF dosyalarını JSON formatına dönüştürün."
}, },
"ocrPdf": { "ocrPdf": {
"name": "PDF'de OCR", "name": "PDF'de OCR",
"subtitle": "PDF'yi aranabilir ve kopyalanabilir hale getirin." "subtitle": "PDF'yi aranabilir ve kopyalanabilir hale getirin."
}, },
"alternateMix": { "alternateMix": {
"name": "Sayfaları Karıştır & Birleştir", "name": "Sayfaları Karıştır & Birleştir",
"subtitle": "PDF'leri her birinden sayfaları sırayla birleştirin. Yer imlerini korur." "subtitle": "PDF'leri her birinden sayfaları sırayla birleştirin. Yer imlerini korur."
}, },
"addAttachments": { "addAttachments": {
"name": "Ek Dosya Ekle", "name": "Ek Dosya Ekle",
"subtitle": "PDF'nize bir veya daha fazla dosya ekleyin." "subtitle": "PDF'nize bir veya daha fazla dosya ekleyin."
}, },
"extractAttachments": { "extractAttachments": {
"name": "Ek Dosyaları Çıkar", "name": "Ek Dosyaları Çıkar",
"subtitle": "PDF'lerden tüm gömülü dosyaları ZIP olarak çıkarın." "subtitle": "PDF'lerden tüm gömülü dosyaları ZIP olarak çıkarın."
}, },
"editAttachments": { "editAttachments": {
"name": "Ek Dosyaları Düzenle", "name": "Ek Dosyaları Düzenle",
"subtitle": "PDF'nizdeki ek dosyaları görüntüleyin veya kaldırın." "subtitle": "PDF'nizdeki ek dosyaları görüntüleyin veya kaldırın."
}, },
"dividePages": { "dividePages": {
"name": "Sayfaları Böl", "name": "Sayfaları Böl",
"subtitle": "Sayfaları yatay veya dikey olarak bölün." "subtitle": "Sayfaları yatay veya dikey olarak bölün."
}, },
"addBlankPage": { "addBlankPage": {
"name": "Boş Sayfa Ekle", "name": "Boş Sayfa Ekle",
"subtitle": "PDF'nize herhangi bir yerine boş sayfa ekleyin." "subtitle": "PDF'nize herhangi bir yerine boş sayfa ekleyin."
}, },
"reversePages": { "reversePages": {
"name": "Sayfaları Ters Çevir", "name": "Sayfaları Ters Çevir",
"subtitle": "Belgenizdeki tüm sayfaların sırasını tersine çevirin." "subtitle": "Belgenizdeki tüm sayfaların sırasını tersine çevirin."
}, },
"rotatePdf": { "rotatePdf": {
"name": "PDF'yi Döndür", "name": "PDF'yi Döndür",
"subtitle": "Sayfaları 90 derecelik artışlarla döndürün." "subtitle": "Sayfaları 90 derecelik artışlarla döndürün."
}, },
"nUpPdf": { "nUpPdf": {
"name": "N'li PDF", "name": "N'li PDF",
"subtitle": "Birden fazla sayfayı tek bir sayfaya yerleştirin." "subtitle": "Birden fazla sayfayı tek bir sayfaya yerleştirin."
}, },
"combineToSinglePage": { "combineToSinglePage": {
"name": "Tek Sayfada Birleştir", "name": "Tek Sayfada Birleştir",
"subtitle": "Tüm sayfaları tek bir sürekli kaydırılabilir sayfada birleştirin." "subtitle": "Tüm sayfaları tek bir sürekli kaydırılabilir sayfada birleştirin."
}, },
"viewMetadata": { "viewMetadata": {
"name": "Üst Veriyi Görüntüle", "name": "Üst Veriyi Görüntüle",
"subtitle": "PDF'nizin gizli özelliklerini inceleyin." "subtitle": "PDF'nizin gizli özelliklerini inceleyin."
}, },
"editMetadata": { "editMetadata": {
"name": "Üst Veriyi Düzenle", "name": "Üst Veriyi Düzenle",
"subtitle": "Yazar, başlık ve diğer özellikleri değiştirin." "subtitle": "Yazar, başlık ve diğer özellikleri değiştirin."
}, },
"pdfsToZip": { "pdfsToZip": {
"name": "PDF'leri ZIP Yap", "name": "PDF'leri ZIP Yap",
"subtitle": "Birden fazla PDF dosyasını bir ZIP arşivinde paketleyin." "subtitle": "Birden fazla PDF dosyasını bir ZIP arşivinde paketleyin."
}, },
"comparePdfs": { "comparePdfs": {
"name": "PDF'leri Karşılaştır", "name": "PDF'leri Karşılaştır",
"subtitle": "İki PDF'yi yan yana karşılaştırın." "subtitle": "İki PDF'yi yan yana karşılaştırın."
}, },
"posterizePdf": { "posterizePdf": {
"name": "PDF'yi Posta Boyutuna Böl", "name": "PDF'yi Posta Boyutuna Böl",
"subtitle": "Büyük bir sayfayı birden fazla küçük sayfaya bölün." "subtitle": "Büyük bir sayfayı birden fazla küçük sayfaya bölün."
}, },
"fixPageSize": { "fixPageSize": {
"name": "Sayfa Boyutunu Düzelt", "name": "Sayfa Boyutunu Düzelt",
"subtitle": "Tüm sayfaları standart bir boyuta getirin." "subtitle": "Tüm sayfaları standart bir boyuta getirin."
}, },
"linearizePdf": { "linearizePdf": {
"name": "PDF'yi Doğrusallaştır", "name": "PDF'yi Doğrusallaştır",
"subtitle": "Hızlı web görüntüleme için PDF'yi optimize edin." "subtitle": "Hızlı web görüntüleme için PDF'yi optimize edin."
}, },
"pageDimensions": { "pageDimensions": {
"name": "Sayfa Boyutları", "name": "Sayfa Boyutları",
"subtitle": "Sayfa boyutunu, yönlendirmeyi ve birimleri analiz edin." "subtitle": "Sayfa boyutunu, yönlendirmeyi ve birimleri analiz edin."
}, },
"removeRestrictions": { "removeRestrictions": {
"name": "Kısıtlamaları Kaldır", "name": "Kısıtlamaları Kaldır",
"subtitle": "Dijital olarak imzalanmış PDF dosyalarıyla ilişkili şifre korumasını ve güvenlik kısıtlamalarını kaldırın." "subtitle": "Dijital olarak imzalanmış PDF dosyalarıyla ilişkili şifre korumasını ve güvenlik kısıtlamalarını kaldırın."
}, },
"repairPdf": { "repairPdf": {
"name": "PDF'yi Onar", "name": "PDF'yi Onar",
"subtitle": "Bozulmuş veya hasarlı PDF dosyalarından veri kurtarın." "subtitle": "Bozulmuş veya hasarlı PDF dosyalarından veri kurtarın."
}, },
"encryptPdf": { "encryptPdf": {
"name": "PDF'yi Şifrele", "name": "PDF'yi Şifrele",
"subtitle": "PDF'nizi şifre ekleyerek koruyun." "subtitle": "PDF'nizi şifre ekleyerek koruyun."
}, },
"sanitizePdf": { "sanitizePdf": {
"name": "PDF'yi Temizle", "name": "PDF'yi Temizle",
"subtitle": "Üst verileri, açıklamaları, betikleri ve daha fazlasını kaldırın." "subtitle": "Üst verileri, açıklamaları, betikleri ve daha fazlasını kaldırın."
}, },
"decryptPdf": { "decryptPdf": {
"name": "PDF'nin Şifresini Çöz", "name": "PDF'nin Şifresini Çöz",
"subtitle": "Şifre korumasını kaldırarak PDF'nin kilidini açın." "subtitle": "Şifre korumasını kaldırarak PDF'nin kilidini açın."
}, },
"flattenPdf": { "flattenPdf": {
"name": "PDF'yi Düzleştir", "name": "PDF'yi Düzleştir",
"subtitle": "Form alanlarını ve açıklamaları düzenlenemez hale getirin." "subtitle": "Form alanlarını ve açıklamaları düzenlenemez hale getirin."
}, },
"removeMetadata": { "removeMetadata": {
"name": "Üst Veriyi Kaldır", "name": "Üst Veriyi Kaldır",
"subtitle": "PDF'nizdeki gizli verileri temizleyin." "subtitle": "PDF'nizdeki gizli verileri temizleyin."
}, },
"changePermissions": { "changePermissions": {
"name": "İzinleri Değiştir", "name": "İzinleri Değiştir",
"subtitle": "Bir PDF üzerindeki kullanıcı izinlerini ayarlayın veya değiştirin." "subtitle": "Bir PDF üzerindeki kullanıcı izinlerini ayarlayın veya değiştirin."
} },
} "emailToPdf": {
"name": "E-posta'dan PDF'ye",
"subtitle": "E-posta dosyalarını (EML, MSG) PDF formatına dönüştürün. Outlook dışa aktarmalarını ve standart e-posta formatlarını destekler.",
"acceptedFormats": "EML, MSG Dosyaları",
"convertButton": "PDF'ye Dönüştür"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -281,6 +281,12 @@
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.5</priority> <priority>0.5</priority>
</url> </url>
<url>
<loc>https://www.bentopdf.com/email-to-pdf</loc>
<lastmod>2026-01-08</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url> <url>
<loc>https://www.bentopdf.com/xps-to-pdf</loc> <loc>https://www.bentopdf.com/xps-to-pdf</loc>
<lastmod>2024-12-28</lastmod> <lastmod>2024-12-28</lastmod>

View File

@@ -7,7 +7,8 @@ export const categories = [
href: import.meta.env.BASE_URL + 'pdf-multi-tool.html', href: import.meta.env.BASE_URL + 'pdf-multi-tool.html',
name: 'PDF Multi Tool', name: 'PDF Multi Tool',
icon: 'ph-pencil-ruler', icon: 'ph-pencil-ruler',
subtitle: 'Merge, Split, Organize, Delete, Rotate, Add Blank Pages, Extract and Duplicate in an unified interface.', subtitle:
'Merge, Split, Organize, Delete, Rotate, Add Blank Pages, Extract and Duplicate in an unified interface.',
}, },
{ {
href: import.meta.env.BASE_URL + 'merge-pdf.html', href: import.meta.env.BASE_URL + 'merge-pdf.html',
@@ -158,7 +159,8 @@ export const categories = [
href: import.meta.env.BASE_URL + 'form-filler.html', href: import.meta.env.BASE_URL + 'form-filler.html',
name: 'PDF Form Filler', name: 'PDF Form Filler',
icon: 'ph-pencil-line', icon: 'ph-pencil-line',
subtitle: 'Fill in forms directly in the browser. Also supports XFA forms.', subtitle:
'Fill in forms directly in the browser. Also supports XFA forms.',
}, },
{ {
href: import.meta.env.BASE_URL + 'form-creator.html', href: import.meta.env.BASE_URL + 'form-creator.html',
@@ -181,7 +183,8 @@ export const categories = [
href: import.meta.env.BASE_URL + 'image-to-pdf.html', href: import.meta.env.BASE_URL + 'image-to-pdf.html',
name: 'Images to PDF', name: 'Images to PDF',
icon: 'ph-images', icon: 'ph-images',
subtitle: 'Convert JPG, PNG, BMP, GIF, TIFF, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2, PSD, SVG, HEIC, WebP to PDF.', subtitle:
'Convert JPG, PNG, BMP, GIF, TIFF, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2, PSD, SVG, HEIC, WebP to PDF.',
}, },
{ {
href: import.meta.env.BASE_URL + 'jpg-to-pdf.html', href: import.meta.env.BASE_URL + 'jpg-to-pdf.html',
@@ -235,7 +238,8 @@ export const categories = [
href: import.meta.env.BASE_URL + 'markdown-to-pdf.html', href: import.meta.env.BASE_URL + 'markdown-to-pdf.html',
name: 'Markdown to PDF', name: 'Markdown to PDF',
icon: 'ph-markdown-logo', icon: 'ph-markdown-logo',
subtitle: 'Convert Markdown to PDF with live preview and syntax highlighting.', subtitle:
'Convert Markdown to PDF with live preview and syntax highlighting.',
}, },
{ {
href: import.meta.env.BASE_URL + 'json-to-pdf.html', href: import.meta.env.BASE_URL + 'json-to-pdf.html',
@@ -367,7 +371,14 @@ export const categories = [
href: import.meta.env.BASE_URL + 'psd-to-pdf.html', href: import.meta.env.BASE_URL + 'psd-to-pdf.html',
name: 'PSD to PDF', name: 'PSD to PDF',
icon: 'ph-image', icon: 'ph-image',
subtitle: 'Convert Adobe Photoshop (PSD) files to PDF. Multiple files supported.', subtitle:
'Convert Adobe Photoshop (PSD) files to PDF. Multiple files supported.',
},
{
href: import.meta.env.BASE_URL + 'email-to-pdf.html',
name: 'Email to PDF',
icon: 'ph-envelope',
subtitle: 'Convert email files (EML, MSG) to PDF format.',
}, },
], ],
}, },
@@ -456,7 +467,8 @@ export const categories = [
href: import.meta.env.BASE_URL + 'prepare-pdf-for-ai.html', href: import.meta.env.BASE_URL + 'prepare-pdf-for-ai.html',
name: 'Prepare PDF for AI', name: 'Prepare PDF for AI',
icon: 'ph-sparkle', icon: 'ph-sparkle',
subtitle: 'Extract PDF content as LlamaIndex JSON for RAG/LLM pipelines.', subtitle:
'Extract PDF content as LlamaIndex JSON for RAG/LLM pipelines.',
}, },
{ {
href: import.meta.env.BASE_URL + 'pdf-to-text.html', href: import.meta.env.BASE_URL + 'pdf-to-text.html',
@@ -485,7 +497,8 @@ export const categories = [
href: import.meta.env.BASE_URL + 'alternate-merge.html', href: import.meta.env.BASE_URL + 'alternate-merge.html',
name: 'Alternate & Mix Pages', name: 'Alternate & Mix Pages',
icon: 'ph-shuffle', icon: 'ph-shuffle',
subtitle: 'Merge PDFs by alternating pages from each PDF. Preserves Bookmarks', subtitle:
'Merge PDFs by alternating pages from each PDF. Preserves Bookmarks',
}, },
{ {
href: import.meta.env.BASE_URL + 'organize-pdf.html', href: import.meta.env.BASE_URL + 'organize-pdf.html',
@@ -677,7 +690,8 @@ export const categories = [
href: import.meta.env.BASE_URL + 'rasterize-pdf.html', href: import.meta.env.BASE_URL + 'rasterize-pdf.html',
name: 'Rasterize PDF', name: 'Rasterize PDF',
icon: 'ph-image', icon: 'ph-image',
subtitle: 'Convert PDF to image-based PDF. Flatten layers and remove selectable text.', subtitle:
'Convert PDF to image-based PDF. Flatten layers and remove selectable text.',
}, },
], ],
}, },
@@ -724,7 +738,8 @@ export const categories = [
href: import.meta.env.BASE_URL + 'digital-sign-pdf.html', href: import.meta.env.BASE_URL + 'digital-sign-pdf.html',
name: 'Digital Signature', name: 'Digital Signature',
icon: 'ph-certificate', icon: 'ph-certificate',
subtitle: 'Add a cryptographic digital signature using X.509 certificates.', subtitle:
'Add a cryptographic digital signature using X.509 certificates.',
}, },
{ {
href: import.meta.env.BASE_URL + 'validate-signature-pdf.html', href: import.meta.env.BASE_URL + 'validate-signature-pdf.html',

View File

@@ -3,29 +3,45 @@ import LanguageDetector from 'i18next-browser-languagedetector';
import HttpBackend from 'i18next-http-backend'; import HttpBackend from 'i18next-http-backend';
// Supported languages // Supported languages
export const supportedLanguages = ['en', 'de', 'zh', 'vi', 'tr'] as const; export const supportedLanguages = [
'en',
'de',
'zh',
'vi',
'tr',
'id',
'it',
] as const;
export type SupportedLanguage = (typeof supportedLanguages)[number]; export type SupportedLanguage = (typeof supportedLanguages)[number];
export const languageNames: Record<SupportedLanguage, string> = { export const languageNames: Record<SupportedLanguage, string> = {
en: 'English', en: 'English',
de: 'Deutsch', de: 'Deutsch',
zh: '中文', zh: '中文',
vi: 'Tiếng Việt', vi: 'Tiếng Việt',
tr: 'Türkçe', tr: 'Türkçe',
id: 'Bahasa Indonesia',
it: 'Italiano',
}; };
export const getLanguageFromUrl = (): SupportedLanguage => { export const getLanguageFromUrl = (): SupportedLanguage => {
const path = window.location.pathname; const path = window.location.pathname;
const langMatch = path.match(/^\/(en|de|zh|vi|tr)(?:\/|$)/); const langMatch = path.match(/^\/(en|de|zh|vi|tr|id|it)(?:\/|$)/);
if (langMatch && supportedLanguages.includes(langMatch[1] as SupportedLanguage)) { if (
return langMatch[1] as SupportedLanguage; langMatch &&
} supportedLanguages.includes(langMatch[1] as SupportedLanguage)
const storedLang = localStorage.getItem('i18nextLng'); ) {
if (storedLang && supportedLanguages.includes(storedLang as SupportedLanguage)) { return langMatch[1] as SupportedLanguage;
return storedLang as SupportedLanguage; }
} const storedLang = localStorage.getItem('i18nextLng');
if (
storedLang &&
supportedLanguages.includes(storedLang as SupportedLanguage)
) {
return storedLang as SupportedLanguage;
}
return 'en'; return 'en';
}; };
let initialized = false; let initialized = false;
@@ -66,22 +82,22 @@ export const t = (key: string, options?: Record<string, unknown>): string => {
}; };
export const changeLanguage = (lang: SupportedLanguage): void => { export const changeLanguage = (lang: SupportedLanguage): void => {
if (!supportedLanguages.includes(lang)) return; if (!supportedLanguages.includes(lang)) return;
const currentPath = window.location.pathname; const currentPath = window.location.pathname;
const currentLang = getLanguageFromUrl(); const currentLang = getLanguageFromUrl();
let newPath: string; let newPath: string;
if (currentPath.match(/^\/(en|de|zh|vi|tr)\//)) { if (currentPath.match(/^\/(en|de|zh|vi|tr|id|it)\//)) {
newPath = currentPath.replace(/^\/(en|de|zh|vi|tr)\//, `/${lang}/`); newPath = currentPath.replace(/^\/(en|de|zh|vi|tr|id|it)\//, `/${lang}/`);
} else if (currentPath.match(/^\/(en|de|zh|vi|tr)$/)) { } else if (currentPath.match(/^\/(en|de|zh|vi|tr|id|it)$/)) {
newPath = `/${lang}`; newPath = `/${lang}`;
} else { } else {
newPath = `/${lang}${currentPath}`; newPath = `/${lang}${currentPath}`;
} }
const newUrl = newPath + window.location.search + window.location.hash; const newUrl = newPath + window.location.search + window.location.hash;
window.location.href = newUrl; window.location.href = newUrl;
}; };
// Apply translations to all elements with data-i18n attribute // Apply translations to all elements with data-i18n attribute
@@ -120,38 +136,40 @@ export const applyTranslations = (): void => {
}; };
export const rewriteLinks = (): void => { export const rewriteLinks = (): void => {
const currentLang = getLanguageFromUrl(); const currentLang = getLanguageFromUrl();
if (currentLang === 'en') return; if (currentLang === 'en') return;
const links = document.querySelectorAll('a[href]'); const links = document.querySelectorAll('a[href]');
links.forEach((link) => { links.forEach((link) => {
const href = link.getAttribute('href'); const href = link.getAttribute('href');
if (!href) return; if (!href) return;
if (href.startsWith('http') || if (
href.startsWith('mailto:') || href.startsWith('http') ||
href.startsWith('tel:') || href.startsWith('mailto:') ||
href.startsWith('#') || href.startsWith('tel:') ||
href.startsWith('javascript:')) { href.startsWith('#') ||
return; href.startsWith('javascript:')
} ) {
return;
}
if (href.match(/^\/(en|de|zh|vi|tr|id)\//)) { if (href.match(/^\/(en|de|zh|vi|tr|id|it)\//)) {
return; return;
} }
let newHref: string; let newHref: string;
if (href.startsWith('/')) { if (href.startsWith('/')) {
newHref = `/${currentLang}${href}`; newHref = `/${currentLang}${href}`;
} else if (href.startsWith('./')) { } else if (href.startsWith('./')) {
newHref = href.replace('./', `/${currentLang}/`); newHref = href.replace('./', `/${currentLang}/`);
} else if (href === '/' || href === '') { } else if (href === '/' || href === '') {
newHref = `/${currentLang}/`; newHref = `/${currentLang}/`;
} else { } else {
newHref = `/${currentLang}/${href}`; newHref = `/${currentLang}/${href}`;
} }
link.setAttribute('href', newHref); link.setAttribute('href', newHref);
}); });
}; };
export default i18next; export default i18next;

View File

@@ -0,0 +1,268 @@
import { showLoader, hideLoader, showAlert } from '../ui.js';
import { downloadFile, formatBytes } from '../utils/helpers.js';
import { state } from '../state.js';
import { createIcons, icons } from 'lucide';
import { parseEmailFile, renderEmailToHtml } from './email-to-pdf.js';
import { PyMuPDF } from '@bentopdf/pymupdf-wasm';
import { getWasmBaseUrl } from '../config/wasm-cdn-config.js';
const EXTENSIONS = ['.eml', '.msg'];
const TOOL_NAME = 'Email';
document.addEventListener('DOMContentLoaded', () => {
const fileInput = document.getElementById('file-input') as HTMLInputElement;
const dropZone = document.getElementById('drop-zone');
const processBtn = document.getElementById('process-btn');
const fileDisplayArea = document.getElementById('file-display-area');
const fileControls = document.getElementById('file-controls');
const addMoreBtn = document.getElementById('add-more-btn');
const clearFilesBtn = document.getElementById('clear-files-btn');
const backBtn = document.getElementById('back-to-tools');
if (backBtn) {
backBtn.addEventListener('click', () => {
window.location.href = import.meta.env.BASE_URL;
});
}
const convertOptions = document.getElementById('convert-options');
const updateUI = async () => {
if (!fileDisplayArea || !processBtn || !fileControls) return;
if (state.files.length > 0) {
fileDisplayArea.innerHTML = '';
for (let index = 0; index < state.files.length; index++) {
const file = state.files[index];
const fileDiv = document.createElement('div');
fileDiv.className =
'flex items-center justify-between bg-gray-700 p-3 rounded-lg text-sm';
const infoContainer = document.createElement('div');
infoContainer.className = 'flex flex-col overflow-hidden';
const nameSpan = document.createElement('div');
nameSpan.className = 'truncate font-medium text-gray-200 text-sm mb-1';
nameSpan.textContent = file.name;
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = formatBytes(file.size);
infoContainer.append(nameSpan, metaSpan);
const removeBtn = document.createElement('button');
removeBtn.className =
'ml-4 text-red-400 hover:text-red-300 flex-shrink-0';
removeBtn.innerHTML = '<i data-lucide="trash-2" class="w-4 h-4"></i>';
removeBtn.onclick = () => {
state.files = state.files.filter((_, i) => i !== index);
updateUI();
};
fileDiv.append(infoContainer, removeBtn);
fileDisplayArea.appendChild(fileDiv);
}
createIcons({ icons });
fileControls.classList.remove('hidden');
if (convertOptions) convertOptions.classList.remove('hidden');
(processBtn as HTMLButtonElement).disabled = false;
} else {
fileDisplayArea.innerHTML = '';
fileControls.classList.add('hidden');
if (convertOptions) convertOptions.classList.add('hidden');
(processBtn as HTMLButtonElement).disabled = true;
}
};
const resetState = () => {
state.files = [];
state.pdfDoc = null;
updateUI();
};
const convertToPdf = async () => {
try {
if (state.files.length === 0) {
showAlert(
'No Files',
`Please select at least one ${TOOL_NAME} file (.eml or .msg).`
);
return;
}
const pageSizeSelect = document.getElementById(
'page-size'
) as HTMLSelectElement;
const includeCcBccCheckbox = document.getElementById(
'include-cc-bcc'
) as HTMLInputElement;
const includeAttachmentsCheckbox = document.getElementById(
'include-attachments'
) as HTMLInputElement;
const pageSize =
(pageSizeSelect?.value as 'a4' | 'letter' | 'legal') || 'a4';
const includeCcBcc = includeCcBccCheckbox?.checked ?? true;
const includeAttachments = includeAttachmentsCheckbox?.checked ?? true;
showLoader('Loading PDF engine...');
const pymupdf = new PyMuPDF(getWasmBaseUrl('pymupdf'));
await pymupdf.load();
if (state.files.length === 1) {
const originalFile = state.files[0];
showLoader(`Parsing ${originalFile.name}...`);
const email = await parseEmailFile(originalFile);
showLoader('Generating PDF...');
const htmlContent = renderEmailToHtml(email, {
includeCcBcc,
includeAttachments,
pageSize,
});
const pdfBlob = await (pymupdf as any).htmlToPdf(htmlContent, {
pageSize,
margins: { top: 50, right: 50, bottom: 50, left: 50 },
attachments: email.attachments
.filter((a) => a.content)
.map((a) => ({
filename: a.filename,
content: a.content!,
})),
});
const fileName = originalFile.name.replace(/\.[^.]+$/, '') + '.pdf';
downloadFile(pdfBlob, fileName);
hideLoader();
showAlert(
'Conversion Complete',
`Successfully converted ${originalFile.name} to PDF.`,
'success',
() => resetState()
);
} else {
showLoader('Converting emails...');
const JSZip = (await import('jszip')).default;
const zip = new JSZip();
for (let i = 0; i < state.files.length; i++) {
const file = state.files[i];
showLoader(
`Converting ${i + 1}/${state.files.length}: ${file.name}...`
);
try {
const email = await parseEmailFile(file);
const htmlContent = renderEmailToHtml(email, {
includeCcBcc,
includeAttachments,
pageSize,
});
const pdfBlob = await (pymupdf as any).htmlToPdf(htmlContent, {
pageSize,
margins: { top: 50, right: 50, bottom: 50, left: 50 },
attachments: email.attachments
.filter((a) => a.content)
.map((a) => ({
filename: a.filename,
content: a.content!,
})),
});
const baseName = file.name.replace(/\.[^.]+$/, '');
const pdfBuffer = await pdfBlob.arrayBuffer();
zip.file(`${baseName}.pdf`, pdfBuffer);
} catch (e: any) {
console.error(`Failed to convert ${file.name}:`, e);
}
}
const zipBlob = await zip.generateAsync({ type: 'blob' });
downloadFile(zipBlob, 'emails-converted.zip');
hideLoader();
showAlert(
'Conversion Complete',
`Successfully converted ${state.files.length} ${TOOL_NAME} file(s) to PDF.`,
'success',
() => resetState()
);
}
} catch (e: any) {
console.error(`[${TOOL_NAME}2PDF] ERROR:`, e);
hideLoader();
showAlert(
'Error',
`An error occurred during conversion. Error: ${e.message}`
);
}
};
const handleFileSelect = (files: FileList | null) => {
if (files && files.length > 0) {
state.files = [...state.files, ...Array.from(files)];
updateUI();
}
};
if (fileInput && dropZone) {
fileInput.addEventListener('change', (e) => {
handleFileSelect((e.target as HTMLInputElement).files);
});
dropZone.addEventListener('dragover', (e) => {
e.preventDefault();
dropZone.classList.add('bg-gray-700');
});
dropZone.addEventListener('dragleave', (e) => {
e.preventDefault();
dropZone.classList.remove('bg-gray-700');
});
dropZone.addEventListener('drop', (e) => {
e.preventDefault();
dropZone.classList.remove('bg-gray-700');
const files = e.dataTransfer?.files;
if (files && files.length > 0) {
const validFiles = Array.from(files).filter((f) => {
const name = f.name.toLowerCase();
return EXTENSIONS.some((ext) => name.endsWith(ext));
});
if (validFiles.length > 0) {
const dataTransfer = new DataTransfer();
validFiles.forEach((f) => dataTransfer.items.add(f));
handleFileSelect(dataTransfer.files);
}
}
});
fileInput.addEventListener('click', () => {
fileInput.value = '';
});
}
if (addMoreBtn) {
addMoreBtn.addEventListener('click', () => {
fileInput.click();
});
}
if (clearFilesBtn) {
clearFilesBtn.addEventListener('click', () => {
resetState();
});
}
if (processBtn) {
processBtn.addEventListener('click', convertToPdf);
}
});

View File

@@ -0,0 +1,393 @@
import PostalMime from 'postal-mime';
import MsgReader from '@kenjiuno/msgreader';
import { formatBytes, escapeHtml } from '../utils/helpers.js';
import type { EmailAttachment, ParsedEmail, EmailRenderOptions } from '@/types';
// Re-export types for convenience
export type { EmailAttachment, ParsedEmail, EmailRenderOptions };
/**
* Format email address without angle brackets for cleaner display
*/
function formatAddress(
name: string | undefined,
email: string | undefined
): string {
if (name && email) {
return `${name} (${email})`;
}
return email || name || '';
}
export async function parseEmlFile(file: File): Promise<ParsedEmail> {
const arrayBuffer = await file.arrayBuffer();
const parser = new PostalMime();
const email = await parser.parse(arrayBuffer);
const from =
formatAddress(email.from?.name, email.from?.address) || 'Unknown Sender';
const to = (email.to || [])
.map((addr) => formatAddress(addr.name, addr.address))
.filter(Boolean);
const cc = (email.cc || [])
.map((addr) => formatAddress(addr.name, addr.address))
.filter(Boolean);
const bcc = (email.bcc || [])
.map((addr) => formatAddress(addr.name, addr.address))
.filter(Boolean);
// Helper to map parsing result to EmailAttachment
const mapAttachment = (att: any): EmailAttachment => {
let content: Uint8Array | undefined;
let size = 0;
if (att.content) {
if (att.content instanceof ArrayBuffer) {
content = new Uint8Array(att.content);
size = content.byteLength;
} else if (att.content instanceof Uint8Array) {
content = att.content;
size = content.byteLength;
}
}
return {
filename: att.filename || 'unnamed',
size,
contentType: att.mimeType || 'application/octet-stream',
content,
contentId: att.contentId
? att.contentId.replace(/^<|>$/g, '')
: undefined,
};
};
const attachments: EmailAttachment[] = [
...(email.attachments || []).map(mapAttachment),
...((email as any).inline || []).map(mapAttachment),
];
// Preserve original date string from headers
let rawDateString = '';
if (email.headers) {
const dateHeader = email.headers.find(
(h) => h.key.toLowerCase() === 'date'
);
if (dateHeader) {
rawDateString = dateHeader.value as string;
}
}
if (!rawDateString && email.date) {
rawDateString = email.date; // fallback if header missing but parsed date exists as string?
}
let parsedDate: Date | null = null;
if (email.date) {
try {
parsedDate = new Date(email.date);
if (isNaN(parsedDate.getTime())) {
parsedDate = null;
}
} catch {
parsedDate = null;
}
}
return {
subject: email.subject || '(No Subject)',
from,
to,
cc,
bcc,
date: parsedDate,
rawDateString,
htmlBody: email.html || '',
textBody: email.text || '',
attachments,
};
}
export async function parseMsgFile(file: File): Promise<ParsedEmail> {
const arrayBuffer = await file.arrayBuffer();
const msgReader = new MsgReader(arrayBuffer);
const msgData = msgReader.getFileData();
const from =
formatAddress(msgData.senderName, msgData.senderEmail) || 'Unknown Sender';
const to: string[] = [];
const cc: string[] = [];
const bcc: string[] = [];
if (msgData.recipients) {
for (const recipient of msgData.recipients) {
const recipientStr = formatAddress(recipient.name, recipient.email);
if (!recipientStr) continue;
const recipType = String(recipient.recipType).toLowerCase();
if (recipType === 'cc' || recipType === '2') {
cc.push(recipientStr);
} else if (recipType === 'bcc' || recipType === '3') {
bcc.push(recipientStr);
} else {
to.push(recipientStr);
}
}
}
const attachments: EmailAttachment[] = (msgData.attachments || []).map(
(att: any) => ({
filename: att.fileName || att.name || 'unnamed',
size: att.content?.length || 0,
contentType: att.mimeType || 'application/octet-stream',
content: att.content ? new Uint8Array(att.content) : undefined,
contentId: att.pidContentId
? att.pidContentId.replace(/^<|>$/g, '')
: undefined,
})
);
let date: Date | null = null;
let rawDateString = '';
if (msgData.messageDeliveryTime) {
rawDateString = msgData.messageDeliveryTime;
date = new Date(msgData.messageDeliveryTime);
} else if (msgData.clientSubmitTime) {
rawDateString = msgData.clientSubmitTime;
date = new Date(msgData.clientSubmitTime);
}
return {
subject: msgData.subject || '(No Subject)',
from,
to,
cc,
bcc,
date,
rawDateString,
htmlBody: msgData.bodyHtml || '',
textBody: msgData.body || '',
attachments,
};
}
/**
* Formats a raw RFC 2822 date string into a nicer human-readable format,
* while preserving the original timezone and time.
* Example input: "Sun, 8 Jan 2017 20:37:44 +0200"
* Example output: "Sunday, January 8, 2017 at 8:37 PM (+0200)"
*/
function formatRawDate(raw: string): string {
try {
// Regex to parse RFC 2822 date parts: Day, DD Mon YYYY HH:MM:SS Timezone
const match = raw.match(
/([A-Za-z]{3}),\s+(\d{1,2})\s+([A-Za-z]{3})\s+(\d{4})\s+(\d{2}):(\d{2})(?::(\d{2}))?\s+([+-]\d{4})/
);
if (match) {
const [
,
dayAbbr,
dom,
monthAbbr,
year,
hoursStr,
minsStr,
secsStr,
timezone,
] = match;
// Map abbreviations to full names
const days: Record<string, string> = {
Sun: 'Sunday',
Mon: 'Monday',
Tue: 'Tuesday',
Wed: 'Wednesday',
Thu: 'Thursday',
Fri: 'Friday',
Sat: 'Saturday',
};
const months: Record<string, string> = {
Jan: 'January',
Feb: 'February',
Mar: 'March',
Apr: 'April',
May: 'May',
Jun: 'June',
Jul: 'July',
Aug: 'August',
Sep: 'September',
Oct: 'October',
Nov: 'November',
Dec: 'December',
};
const fullDay = days[dayAbbr] || dayAbbr;
const fullMonth = months[monthAbbr] || monthAbbr;
// Convert to 12-hour format manually
let hours = parseInt(hoursStr, 10);
const ampm = hours >= 12 ? 'PM' : 'AM';
hours = hours % 12;
hours = hours ? hours : 12; // the hour '0' should be '12'
// Format timezone: +0200 -> UTC+02:00
const tzSign = timezone.substring(0, 1);
const tzHours = timezone.substring(1, 3);
const tzMins = timezone.substring(3, 5);
const formattedTz = `UTC${tzSign}${tzHours}:${tzMins}`;
return `${fullDay}, ${fullMonth} ${dom}, ${year} at ${hours}:${minsStr} ${ampm} (${formattedTz})`;
}
} catch (e) {
// Fallback to raw string if parsing fails
}
return raw;
}
/**
* Replace CID references in HTML with base64 data URIs
*/
function processInlineImages(
html: string,
attachments: EmailAttachment[]
): string {
if (!html) return html;
// Create a map of contentIds to attachments
const cidMap = new Map<string, EmailAttachment>();
attachments.forEach((att) => {
if (att.contentId) {
cidMap.set(att.contentId, att);
}
});
// Replace src="cid:..."
return html.replace(/src=["']cid:([^"']+)["']/g, (match, cid) => {
const att = cidMap.get(cid);
if (att && att.content) {
// Convert Uint8Array to base64
let binary = '';
const len = att.content.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(att.content[i]);
}
const base64 =
typeof btoa === 'function'
? btoa(binary)
: Buffer.from(binary, 'binary').toString('base64');
return `src="data:${att.contentType};base64,${base64}"`;
}
return match; // Keep original if not found
});
}
export function renderEmailToHtml(
email: ParsedEmail,
options: EmailRenderOptions = {}
): string {
const { includeCcBcc = true, includeAttachments = true } = options;
let processedHtml = '';
if (email.htmlBody) {
processedHtml = processInlineImages(email.htmlBody, email.attachments);
} else {
processedHtml = `<pre style="white-space: pre-wrap; font-family: inherit; margin: 0;">${escapeHtml(email.textBody)}</pre>`;
}
// Format date in a human-readable way
let dateStr = 'Unknown Date';
if (email.rawDateString) {
dateStr = formatRawDate(email.rawDateString);
} else if (email.date && !isNaN(email.date.getTime())) {
dateStr = email.date.toLocaleString('en-US', {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
hour: 'numeric',
minute: '2-digit',
hour12: true,
});
}
const attachmentHtml =
includeAttachments && email.attachments.length > 0
? `
<div style="margin-top: 20px; padding-top: 15px; border-top: 1px solid #cccccc;">
<p style="margin: 0 0 8px 0; font-size: 11px; color: #666; font-weight: 600;">Attachments (${email.attachments.length})</p>
<ul style="margin: 0; padding-left: 20px; font-size: 10px; color: #555;">
${email.attachments
.map(
(att) =>
`<li style="margin-bottom: 5px;">${escapeHtml(att.filename)} <span style="color: #999;">(${formatBytes(att.size)})</span></li>`
)
.join('')}
</ul>
</div>
`
: '';
// Build CC/BCC rows
let ccBccHtml = '';
if (includeCcBcc) {
if (email.cc.length > 0) {
ccBccHtml += `
<div style="margin-bottom: 8px;">
<span style="font-weight: 600; color: #666; margin-right: 8px;">CC:</span>
<span style="color: #333;">${escapeHtml(email.cc.join(', '))}</span>
</div>`;
}
if (email.bcc.length > 0) {
ccBccHtml += `
<div style="margin-bottom: 8px;">
<span style="font-weight: 600; color: #666; margin-right: 8px;">BCC:</span>
<span style="color: #333;">${escapeHtml(email.bcc.join(', '))}</span>
</div>`;
}
}
return `<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; line-height: 1.6; color: #333; max-width: 800px; margin: 0 auto; padding: 40px 20px; background: #fff;">
<div style="border-bottom: 2px solid #999999; padding-bottom: 20px; margin-bottom: 30px;">
<h1 style="font-size: 18px; font-weight: 600; color: #1a1a1a; margin: 0 0 12px 0;">${escapeHtml(email.subject)}</h1>
<div style="font-size: 12px; color: #555;">
<div style="margin-bottom: 8px;">
<span style="font-weight: 600; color: #666; margin-right: 8px;">From:</span>
<span style="color: #333;">${escapeHtml(email.from)}</span>
</div>
<div style="margin-bottom: 8px;">
<span style="font-weight: 600; color: #666; margin-right: 8px;">To:</span>
<span style="color: #333;">${escapeHtml(email.to.join(', ') || 'Unknown')}</span>
</div>
${ccBccHtml}
<div style="margin-bottom: 8px;">
<span style="font-weight: 600; color: #666; margin-right: 8px;">Date:</span>
<span style="color: #333;">${escapeHtml(dateStr)}</span>
</div>
</div>
</div>
<div style="font-size: 12px; color: #333;">
${processedHtml}
</div>
${attachmentHtml}
</body>
</html>`;
}
export async function parseEmailFile(file: File): Promise<ParsedEmail> {
const ext = file.name.toLowerCase().split('.').pop();
if (ext === 'eml') {
return parseEmlFile(file);
} else if (ext === 'msg') {
return parseMsgFile(file);
} else {
throw new Error(`Unsupported file type: .${ext}`);
}
}

View File

@@ -270,6 +270,7 @@ const init = async () => {
'Flatten PDF': 'tools:flattenPdf', 'Flatten PDF': 'tools:flattenPdf',
'Remove Metadata': 'tools:removeMetadata', 'Remove Metadata': 'tools:removeMetadata',
'Change Permissions': 'tools:changePermissions', 'Change Permissions': 'tools:changePermissions',
'Email to PDF': 'tools:emailToPdf',
}; };
// Homepage-only tool grid rendering (not used on individual tool pages) // Homepage-only tool grid rendering (not used on individual tool pages)

View File

@@ -0,0 +1,26 @@
export interface EmailAttachment {
filename: string;
size: number;
contentType: string;
content?: Uint8Array;
contentId?: string;
}
export interface ParsedEmail {
subject: string;
from: string;
to: string[];
cc: string[];
bcc: string[];
date: Date | null;
rawDateString: string;
htmlBody: string;
textBody: string;
attachments: EmailAttachment[];
}
export interface EmailRenderOptions {
includeCcBcc?: boolean;
includeAttachments?: boolean;
pageSize?: 'a4' | 'letter' | 'legal';
}

View File

@@ -1,48 +1,48 @@
export * from './ocr-type.js'; export * from './ocr-type.ts';
export * from './form-creator-type.js'; export * from './form-creator-type.ts';
export * from './digital-sign-type.js'; export * from './digital-sign-type.ts';
export * from './attachment-type.js'; export * from './attachment-type.ts';
export * from './edit-attachments-type.js'; export * from './edit-attachments-type.ts';
export * from './edit-metadata-type.js'; export * from './edit-metadata-type.ts';
export * from './divide-pages-type.js'; export * from './divide-pages-type.ts';
export * from './alternate-merge-page-type.js'; export * from './alternate-merge-page-type.ts';
export * from './add-blank-page-type.js'; export * from './add-blank-page-type.ts';
export * from './compare-pdfs-type.js'; export * from './compare-pdfs-type.ts';
export * from './fix-page-size-type.js'; export * from './fix-page-size-type.ts';
export * from './view-metadata-type.js'; export * from './view-metadata-type.ts';
export * from './header-footer-type.js'; export * from './header-footer-type.ts';
export * from './encrypt-pdf-type.js'; export * from './encrypt-pdf-type.ts';
export * from './flatten-pdf-type.js'; export * from './flatten-pdf-type.ts';
export * from './crop-pdf-type.js'; export * from './crop-pdf-type.ts';
export * from './background-color-type.js'; export * from './background-color-type.ts';
export * from './posterize-type.js'; export * from './posterize-type.ts';
export * from './decrypt-pdf-type.js'; export * from './decrypt-pdf-type.ts';
export * from './combine-single-page-type.js'; export * from './combine-single-page-type.ts';
export * from './change-permissions-type.js'; export * from './change-permissions-type.ts';
export * from './validate-signature-type.js'; export * from './validate-signature-type.ts';
export * from './remove-restrictions-type.js'; export * from './remove-restrictions-type.ts';
export * from './page-dimensions-type.js'; export * from './page-dimensions-type.ts';
export * from './extract-attachments-type.js'; export * from './extract-attachments-type.ts';
export * from './pdf-multi-tool-type.js'; export * from './pdf-multi-tool-type.ts';
export * from './ocr-pdf-type.js'; export * from './ocr-pdf-type.ts';
export * from './delete-pages-type.js'; export * from './delete-pages-type.ts';
export * from './invert-colors-type.js'; export * from './invert-colors-type.ts';
export * from './table-of-contents-type.js'; export * from './table-of-contents-type.ts';
export * from './organize-pdf-type.js'; export * from './organize-pdf-type.ts';
export * from './merge-pdf-type.js'; export * from './merge-pdf-type.ts';
export * from './extract-images-type.js'; export * from './extract-images-type.ts';
export * from './extract-pages-type.js'; export * from './extract-pages-type.ts';
export * from './pdf-layers-type.js'; export * from './pdf-layers-type.ts';
export * from './sanitize-pdf-type.js'; export * from './sanitize-pdf-type.ts';
export * from './reverse-pages-type.js'; export * from './reverse-pages-type.ts';
export * from './text-color-type.js'; export * from './text-color-type.ts';
export * from './n-up-pdf-type.js'; export * from './n-up-pdf-type.ts';
export * from './linearize-pdf-type.js'; export * from './linearize-pdf-type.ts';
export * from './remove-metadata-type.js'; export * from './remove-metadata-type.ts';
export * from './rotate-pdf-type.js'; export * from './rotate-pdf-type.ts';
export * from './pdf-booklet-type.js'; export * from './pdf-booklet-type.ts';
export * from './page-numbers-type.js'; export * from './page-numbers-type.ts';
export * from './pdf-to-zip-type.js'; export * from './pdf-to-zip-type.ts';
export * from './sign-pdf-type.js'; export * from './sign-pdf-type.ts';
export * from './add-watermark-type.js'; export * from './add-watermark-type.ts';
export * from './email-to-pdf-type.ts';

View File

@@ -2,8 +2,7 @@ import createModule from '@neslinesli93/qpdf-wasm';
import { showLoader, hideLoader, showAlert } from '../ui.js'; import { showLoader, hideLoader, showAlert } from '../ui.js';
import { createIcons } from 'lucide'; import { createIcons } from 'lucide';
import { state, resetState } from '../state.js'; import { state, resetState } from '../state.js';
import * as pdfjsLib from 'pdfjs-dist' import * as pdfjsLib from 'pdfjs-dist';
const STANDARD_SIZES = { const STANDARD_SIZES = {
A4: { width: 595.28, height: 841.89 }, A4: { width: 595.28, height: 841.89 },
@@ -50,14 +49,14 @@ export function convertPoints(points: any, unit: any) {
// Convert hex color to RGB // Convert hex color to RGB
export function hexToRgb(hex: string): { r: number; g: number; b: number } { export function hexToRgb(hex: string): { r: number; g: number; b: number } {
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex) const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result return result
? { ? {
r: parseInt(result[1], 16) / 255, r: parseInt(result[1], 16) / 255,
g: parseInt(result[2], 16) / 255, g: parseInt(result[2], 16) / 255,
b: parseInt(result[3], 16) / 255, b: parseInt(result[3], 16) / 255,
} }
: { r: 0, g: 0, b: 0 } : { r: 0, g: 0, b: 0 };
} }
export const formatBytes = (bytes: any, decimals = 1) => { export const formatBytes = (bytes: any, decimals = 1) => {
@@ -89,7 +88,10 @@ export const readFileAsArrayBuffer = (file: any) => {
}); });
}; };
export function parsePageRanges(rangeString: string, totalPages: number): number[] { export function parsePageRanges(
rangeString: string,
totalPages: number
): number[] {
if (!rangeString || rangeString.trim() === '') { if (!rangeString || rangeString.trim() === '') {
return Array.from({ length: totalPages }, (_, i) => i); return Array.from({ length: totalPages }, (_, i) => i);
} }
@@ -128,11 +130,9 @@ export function parsePageRanges(rangeString: string, totalPages: number): number
} }
} }
return Array.from(indices).sort((a, b) => a - b); return Array.from(indices).sort((a, b) => a - b);
} }
/** /**
* Formats an ISO 8601 date string (e.g., "2008-02-21T17:15:56-08:00") * Formats an ISO 8601 date string (e.g., "2008-02-21T17:15:56-08:00")
* into a localized, human-readable string. * into a localized, human-readable string.
@@ -198,7 +198,7 @@ export function formatStars(num: number) {
return (num / 1000).toFixed(1) + 'K'; return (num / 1000).toFixed(1) + 'K';
} }
return num.toLocaleString(); return num.toLocaleString();
}; }
/** /**
* Truncates a filename to a maximum length, adding ellipsis if needed. * Truncates a filename to a maximum length, adding ellipsis if needed.
@@ -207,14 +207,18 @@ export function formatStars(num: number) {
* @param maxLength - Maximum length (default: 30) * @param maxLength - Maximum length (default: 30)
* @returns Truncated filename with ellipsis if needed * @returns Truncated filename with ellipsis if needed
*/ */
export function truncateFilename(filename: string, maxLength: number = 25): string { export function truncateFilename(
filename: string,
maxLength: number = 25
): string {
if (filename.length <= maxLength) { if (filename.length <= maxLength) {
return filename; return filename;
} }
const lastDotIndex = filename.lastIndexOf('.'); const lastDotIndex = filename.lastIndexOf('.');
const extension = lastDotIndex !== -1 ? filename.substring(lastDotIndex) : ''; const extension = lastDotIndex !== -1 ? filename.substring(lastDotIndex) : '';
const nameWithoutExt = lastDotIndex !== -1 ? filename.substring(0, lastDotIndex) : filename; const nameWithoutExt =
lastDotIndex !== -1 ? filename.substring(0, lastDotIndex) : filename;
const availableLength = maxLength - extension.length - 3; // 3 for '...' const availableLength = maxLength - extension.length - 3; // 3 for '...'
@@ -225,7 +229,10 @@ export function truncateFilename(filename: string, maxLength: number = 25): stri
return nameWithoutExt.substring(0, availableLength) + '...' + extension; return nameWithoutExt.substring(0, availableLength) + '...' + extension;
} }
export function formatShortcutDisplay(shortcut: string, isMac: boolean): string { export function formatShortcutDisplay(
shortcut: string,
isMac: boolean
): string {
if (!shortcut) return ''; if (!shortcut) return '';
return shortcut return shortcut
.replace('mod', isMac ? '⌘' : 'Ctrl') .replace('mod', isMac ? '⌘' : 'Ctrl')
@@ -233,7 +240,7 @@ export function formatShortcutDisplay(shortcut: string, isMac: boolean): string
.replace('alt', isMac ? '⌥' : 'Alt') .replace('alt', isMac ? '⌥' : 'Alt')
.replace('shift', 'Shift') .replace('shift', 'Shift')
.split('+') .split('+')
.map(k => k.charAt(0).toUpperCase() + k.slice(1)) .map((k) => k.charAt(0).toUpperCase() + k.slice(1))
.join(isMac ? '' : '+'); .join(isMac ? '' : '+');
} }
@@ -263,7 +270,7 @@ export function resetAndReloadTool(preResetCallback?: () => void) {
export function getPDFDocument(src: any) { export function getPDFDocument(src: any) {
let params = src; let params = src;
// Handle different input types similar to how getDocument handles them, // Handle different input types similar to how getDocument handles them,
// but we ensure we have an object to attach wasmUrl to. // but we ensure we have an object to attach wasmUrl to.
if (typeof src === 'string') { if (typeof src === 'string') {
params = { url: src }; params = { url: src };
@@ -283,3 +290,19 @@ export function getPDFDocument(src: any) {
wasmUrl: import.meta.env.BASE_URL + 'pdfjs-viewer/wasm/', wasmUrl: import.meta.env.BASE_URL + 'pdfjs-viewer/wasm/',
}); });
} }
/**
* Escape HTML special characters to prevent XSS
* @param text - The text to escape
* @returns The escaped text
*/
export function escapeHtml(text: string): string {
const map: Record<string, string> = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#039;',
};
return text.replace(/[&<>"']/g, (m) => map[m]);
}

View File

@@ -1,864 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Primary Meta Tags -->
<title>
Compress PDF Online Free - Reduce PDF Size Up to 90% | BentoPDF
</title>
<meta
name="title"
content="Compress PDF Online Free - Reduce PDF Size Up to 90% | BentoPDF"
/>
<meta
name="description"
content="★ Compress PDF files for free - Reduce size by up to 90% ★ No signup required ★ Works offline in browser ★ Unlimited files ★ Privacy-first ★ Multiple compression levels"
/>
<meta
name="keywords"
content="compress pdf, reduce pdf size, pdf compressor, shrink pdf, pdf optimizer, free pdf compression, online pdf reducer"
/>
<meta name="author" content="BentoPDF" />
<meta
name="robots"
content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
/>
<!-- Canonical URL -->
<link rel="canonical" href="https://www.bentopdf.com/compress-pdf" />
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/compress-pdf" />
<meta
property="og:title"
content="Compress PDF Free Online - Reduce PDF File Size | BentoPDF"
/>
<meta
property="og:description"
content="Free PDF compressor - reduce file size by up to 90%. No signup, works in browser, unlimited files, privacy-first."
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-compress-pdf.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:site_name" content="BentoPDF" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/compress-pdf" />
<meta name="twitter:title" content="Compress PDF Free - Reduce PDF Size" />
<meta
name="twitter:description"
content="Free PDF compression tool. Reduce file size up to 90%, no signup, privacy-first."
/>
<meta
name="twitter:image"
content="https://www.bentopdf.com/images/twitter-compress-pdf.png"
/>
<meta name="twitter:site" content="@BentoPDF" />
<!-- Mobile Web App -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Compress PDF" />
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/compress-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/compress-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/compress-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/compress-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />
</head>
<body class="antialiased bg-gray-900">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16">
<div
class="flex-shrink-0 flex items-center cursor-pointer"
id="home-logo"
>
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-8 w-8"
/>
<span class="text-white font-bold text-xl ml-2">
<a href="/">BentoPDF</a>
</span>
</div>
<div class="hidden md:flex items-center space-x-8 text-white">
<a href="/" class="nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="nav-link">About</a>
<a href="/contact.html" class="nav-link">Contact</a>
<a href="/" class="nav-link" data-i18n="nav.allTools">All Tools</a>
</div>
<div class="md:hidden flex items-center">
<button
id="mobile-menu-button"
type="button"
class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500 transition-colors"
aria-controls="mobile-menu"
aria-expanded="false"
>
<span class="sr-only">Open main menu</span>
<svg
id="menu-icon"
class="block h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4 6h16M4 12h16M4 18h16"
/>
</svg>
<svg
id="close-icon"
class="hidden h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
</div>
</div>
<div
id="mobile-menu"
class="hidden md:hidden bg-gray-800 border-t border-gray-700"
>
<div class="px-2 pt-2 pb-3 space-y-1 text-center">
<a href="/" class="mobile-nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="mobile-nav-link">About</a>
<a href="/contact.html" class="mobile-nav-link">Contact</a>
<a href="/" class="mobile-nav-link" data-i18n="nav.allTools"
>All Tools</a
>
</div>
</div>
</nav>
<div
id="uploader"
class="min-h-screen flex flex-col items-center justify-start py-12 p-4 bg-gray-900"
>
<div
id="tool-uploader"
class="bg-gray-800 rounded-xl shadow-xl px-4 py-8 md:p-8 max-w-2xl w-full text-gray-200 border border-gray-700"
>
<button
id="back-to-tools"
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 mb-6 font-semibold"
>
<i data-lucide="arrow-left" class="cursor-pointer"></i>
<span class="cursor-pointer" data-i18n="tools.backToTools">
Back to Tools
</span>
</button>
<h1
class="text-2xl font-bold text-white mb-2"
data-i18n="tools:compressPdf.name"
>
Compress PDF Free Online - Reduce File Size Fast
</h1>
<p class="text-gray-400 mb-6" data-i18n="tools:compressPdf.subtitle">
Reduce file size by choosing the compression method that best suits
your document. Supports multiple PDFs.
</p>
<div
id="drop-zone"
class="relative flex flex-col items-center justify-center w-full h-48 md:h-64 border-2 border-dashed border-gray-600 rounded-xl cursor-pointer bg-gray-900 hover:bg-gray-700 transition-colors duration-300"
>
<div class="flex flex-col items-center justify-center pt-5 pb-6">
<i
data-lucide="upload-cloud"
class="w-10 h-10 mb-3 text-gray-400"
></i>
<p class="mb-2 text-sm text-gray-400">
<span class="font-semibold">Click to select files</span>
<span data-i18n="upload.orDragAndDrop">or drag and drop</span>
</p>
<p class="text-xs text-gray-500">One or more PDF files</p>
<p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave">
Your files never leave your device.
</p>
</div>
<input
id="file-input"
type="file"
class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
accept="application/pdf"
multiple
/>
</div>
<div id="file-controls" class="hidden mt-4 flex gap-3">
<button
id="add-more-btn"
class="btn bg-indigo-600 hover:bg-indigo-700 text-white font-semibold px-4 py-2 rounded-lg flex items-center gap-2"
>
<i data-lucide="plus"></i>
<span data-i18n="upload.addMore">Add More Files</span>
</button>
<button
id="clear-files-btn"
class="btn bg-gray-700 hover:bg-gray-600 text-white font-semibold px-4 py-2 rounded-lg flex items-center gap-2"
>
<i data-lucide="trash-2"></i>
<span data-i18n="upload.clearAll">Clear All</span>
</button>
</div>
<div id="file-display-area" class="mt-4 space-y-2"></div>
<div id="compress-options" class="hidden mt-6 space-y-6">
<div>
<label
for="compression-algorithm"
class="block mb-2 text-sm font-medium text-gray-300"
>Compression Algorithm</label
>
<select
id="compression-algorithm"
class="w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2.5 focus:ring-indigo-500 focus:border-indigo-500"
>
<option value="condense">Condense (Recommended)</option>
<option value="photon">Photon (For Photo-Heavy PDFs)</option>
</select>
<div id="algorithm-info" class="mt-2 text-xs text-gray-400">
<p id="condense-info">
<strong>Condense</strong> uses advanced compression: removes
dead-weight, optimizes images, subsets fonts. Best for most
PDFs.
</p>
<p id="photon-info" class="hidden">
<strong>Photon</strong> converts pages to images. Use for
photo-heavy/scanned PDFs.
<span class="text-yellow-500"
>⚠️ Warning: Text will become non-selectable and links will
stop working.</span
>
</p>
</div>
</div>
<div>
<label
for="compression-level"
class="block mb-2 text-sm font-medium text-gray-300"
>Compression Level</label
>
<select
id="compression-level"
class="w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2.5 focus:ring-indigo-500 focus:border-indigo-500"
>
<option value="light">Light (Preserve Quality)</option>
<option value="balanced" selected>Balanced (Recommended)</option>
<option value="aggressive">Aggressive (Smaller Files)</option>
<option value="extreme">Extreme (Maximum Compression)</option>
</select>
</div>
<!-- Grayscale toggle - always visible -->
<div
class="flex items-center gap-3 p-3 bg-gray-800 rounded-lg border border-gray-700"
>
<input
type="checkbox"
id="convert-to-grayscale"
class="w-5 h-5 rounded cursor-pointer flex-shrink-0"
/>
<div>
<label
for="convert-to-grayscale"
class="text-sm font-medium text-gray-300 cursor-pointer"
>Convert to Grayscale</label
>
<p class="text-xs text-gray-500 mt-0.5">
Reduces file size by removing color information
</p>
</div>
</div>
<div>
<button
id="toggle-custom-settings"
type="button"
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 text-sm font-medium"
>
<i data-lucide="settings" class="w-4 h-4"></i>
<span>Custom Settings</span>
<i
data-lucide="chevron-down"
id="custom-settings-chevron"
class="w-4 h-4"
></i>
</button>
<div
id="custom-settings-panel"
class="hidden mt-4 p-4 bg-gray-900 rounded-lg border border-gray-700 space-y-4"
>
<div class="text-sm text-gray-400 mb-2">
Fine-tune compression parameters:
</div>
<div class="grid grid-cols-3 gap-4">
<div>
<label
for="image-quality"
class="block mb-1 text-xs font-medium text-gray-400"
>Output Quality</label
>
<input
type="number"
id="image-quality"
value="75"
min="1"
max="100"
class="w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2 text-sm"
/>
<p class="text-xs text-gray-500 mt-1">1-100%</p>
</div>
<div>
<label
for="dpi-target"
class="block mb-1 text-xs font-medium text-gray-400"
>Resize Images To</label
>
<input
type="number"
id="dpi-target"
value="96"
min="36"
max="300"
class="w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2 text-sm"
/>
<p class="text-xs text-gray-500 mt-1">DPI</p>
</div>
<div>
<label
for="dpi-threshold"
class="block mb-1 text-xs font-medium text-gray-400"
>Only Process Above</label
>
<input
type="number"
id="dpi-threshold"
value="150"
min="72"
max="600"
class="w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2 text-sm"
/>
<p class="text-xs text-gray-500 mt-1">DPI</p>
</div>
</div>
<div class="space-y-2">
<label class="flex items-center gap-2 cursor-pointer">
<input
type="checkbox"
id="remove-metadata"
checked
class="w-4 h-4 rounded"
/>
<span class="text-sm text-gray-300">Remove metadata</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input
type="checkbox"
id="subset-fonts"
checked
class="w-4 h-4 rounded"
/>
<span class="text-sm text-gray-300"
>Subset fonts (remove unused glyphs)</span
>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input
type="checkbox"
id="remove-thumbnails"
checked
class="w-4 h-4 rounded"
/>
<span class="text-sm text-gray-300"
>Remove embedded thumbnails</span
>
</label>
</div>
</div>
</div>
<button id="process-btn" class="btn-gradient w-full mt-4">
Compress PDF
</button>
</div>
</div>
</div>
<div
id="loader-modal"
class="hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50"
>
<div
class="bg-gray-800 p-8 rounded-lg flex flex-col items-center gap-4 border border-gray-700 shadow-xl"
>
<div class="solid-spinner"></div>
<p id="loader-text" class="text-white text-lg font-medium">
Processing...
</p>
</div>
</div>
<div
id="alert-modal"
class="fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50 hidden"
>
<div
class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700"
>
<h3
id="alert-title"
class="text-xl font-bold text-white mb-2"
data-i18n="alert.title"
data-i18n="alert.title"
>
Alert
</h3>
<p id="alert-message" class="text-gray-300 mb-6"></p>
<button
id="alert-ok"
class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded-lg transition-colors duration-200"
>
OK
</button>
</div>
</div>
<!-- How It Works Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-8 text-center">
How It Works
</h2>
<div class="space-y-6">
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
1
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Upload PDFs</h3>
<p class="text-gray-400">
Click or drag and drop one or more PDF files
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
2
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">
Choose Algorithm
</h3>
<p class="text-gray-400">
Select Condense (recommended) or Photon (for photo-heavy PDFs)
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
3
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">
Select Compression Level
</h3>
<p class="text-gray-400">
Pick Light, Balanced, Aggressive, or Extreme compression
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
4
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">
Customize & Compress
</h3>
<p class="text-gray-400">
Optionally enable grayscale or custom settings, then compress
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
5
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Download</h3>
<p class="text-gray-400">
Save your compressed PDFs - up to 90% smaller
</p>
</div>
</div>
</div>
</section>
<!-- Related Tools Section -->
<section class="max-w-6xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Related PDF Tools
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a
href="/merge-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Merge Pdf</h3>
<p class="text-gray-400 text-sm">Free online merge pdf tool</p>
</a>
<a
href="/split-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Split Pdf</h3>
<p class="text-gray-400 text-sm">Free online split pdf tool</p>
</a>
<a
href="/optimize-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Optimize Pdf</h3>
<p class="text-gray-400 text-sm">Free online optimize pdf tool</p>
</a>
<a
href="/pdf-to-jpg"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Pdf To Jpg</h3>
<p class="text-gray-400 text-sm">Free online pdf to jpg tool</p>
</a>
<a
href="/reduce-pdf-size"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Reduce Pdf Size</h3>
<p class="text-gray-400 text-sm">Free online reduce pdf size tool</p>
</a>
</div>
</section>
<!-- FAQ Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Frequently Asked Questions
</h2>
<div class="space-y-4">
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
What's the difference between Condense and Photon?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Condense removes dead-weight, optimizes images, and subsets fonts -
best for most PDFs. Photon converts pages to images - ideal for
photo-heavy/scanned PDFs but makes text non-selectable.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Which compression level should I use?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Balanced (recommended) offers great size reduction with minimal
quality loss. Use Light to preserve maximum quality, Aggressive for
smaller files, or Extreme for maximum compression.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Are there file size limits?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
No limits! Compress as many PDFs as you need, of any size,
completely free.
</p>
</details>
</div>
</section>
<footer class="mt-16 border-t-2 border-gray-700 py-8">
<div class="container mx-auto px-4">
<div
class="grid grid-cols-1 md:grid-cols-4 gap-8 text-center md:text-left"
>
<div class="mb-8 md:mb-0">
<div class="flex items-center justify-center md:justify-start mb-4">
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-10 w-10 mr-3"
/>
<span class="text-xl font-bold text-white">BentoPDF</span>
</div>
<p class="text-gray-400 text-sm">
&copy; 2026 BentoPDF. All rights reserved.
</p>
<p class="text-gray-500 text-xs mt-2">
Version <span id="app-version"></span>
</p>
</div>
<div>
<h3 class="font-bold text-white mb-4">Company</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/about.html" class="hover:text-indigo-400">About Us</a>
</li>
<li>
<a href="/faq.html" class="hover:text-indigo-400">FAQ</a>
</li>
<li>
<a href="/contact.html" class="hover:text-indigo-400"
>Contact Us</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/licensing.html" class="hover:text-indigo-400"
>Licensing</a
>
</li>
<li>
<a href="/terms.html" class="hover:text-indigo-400"
>Terms and Conditions</a
>
</li>
<li>
<a href="/privacy.html" class="hover:text-indigo-400"
>Privacy Policy</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Follow Us</h3>
<div class="flex justify-center md:justify-start space-x-4">
<a
href="https://github.com/alam00000/bentopdf"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="GitHub"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"
/>
</svg>
</a>
<a
href="https://discord.gg/Bgq3Ay3f2w"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="Discord"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"
/>
</svg>
</a>
<a
href="https://www.instagram.com/thebentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="Instagram"
>
<i data-lucide="instagram"></i>
</a>
<a
href="https://www.linkedin.com/company/bentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="LinkedIn"
>
<i data-lucide="linkedin"></i>
</a>
<a
href="https://x.com/BentoPDF"
class="text-gray-400 hover:text-indigo-400"
title="X (Twitter)"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
/>
</svg>
</a>
</div>
</div>
</div>
</div>
</footer>
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/utils/full-width.ts"></script>
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
<script type="module" src="/src/version.ts"></script>
<script type="module" src="/src/js/logic/compress-pdf-page.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module" src="/src/js/main.ts"></script>
<!-- JSON-LD Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Compress PDF - BentoPDF",
"applicationCategory": "PDF Compression Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"ratingCount": "3421"
},
"featureList": [
"Reduce PDF file size",
"Multiple compression algorithms",
"Batch processing",
"No file size limits",
"Condense algorithm for smart compression",
"Photon algorithm for image-heavy PDFs"
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to Compress PDF Files Online Free",
"description": "Learn how to compress PDF files to reduce size while maintaining quality",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Upload Your PDF",
"text": "Click or drag and drop your PDF file into the upload area"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Choose Compression Level",
"text": "Select your desired compression level: Light, Balanced, Aggressive, or Extreme"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Select Algorithm",
"text": "Choose Condense (recommended) or Photon algorithm based on your PDF type"
},
{
"@type": "HowToStep",
"position": 4,
"name": "Compress and Download",
"text": "Click 'Compress PDF' and download your optimized file"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.bentopdf.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Compress PDF",
"item": "https://www.bentopdf.com/compress-pdf"
}
]
}
</script>
</body>
</html>

View File

@@ -1,634 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Primary Meta Tags -->
<title>Edit PDF Online Free - Edit PDF Tool | BentoPDF</title>
<meta
name="title"
content="Edit PDF Online Free - Edit PDF Tool | BentoPDF"
/>
<meta
name="description"
content="★ Edit PDF online free - Edit PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
name="keywords"
content="edit pdf, pdf editor, modify pdf, change pdf"
/>
<meta name="author" content="BentoPDF" />
<meta
name="robots"
content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
/>
<!-- Canonical URL -->
<link rel="canonical" href="https://www.bentopdf.com/edit-pdf" />
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/edit-pdf" />
<meta
property="og:title"
content="Edit PDF Online Free - Edit PDF Tool | BentoPDF"
/>
<meta
property="og:description"
content="★ Edit PDF online free - Edit PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-edit-pdf.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:site_name" content="BentoPDF" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/edit-pdf" />
<meta name="twitter:title" content="Edit PDF Free" />
<meta
name="twitter:description"
content="★ Edit PDF online free - Edit PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secu"
/>
<meta
name="twitter:image"
content="https://www.bentopdf.com/images/twitter-edit-pdf.png"
/>
<meta name="twitter:site" content="@BentoPDF" />
<!-- Mobile Web App -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Edit PDF" />
<title>PDF Editor - BentoPDF</title>
<meta
name="description"
content="Annotate, highlight, redact, comment, add shapes/images, search, and view PDFs. Free, secure, and runs entirely in your browser."
/>
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/edit-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/edit-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/edit-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/edit-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />
</head>
<body class="antialiased bg-gray-900">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16">
<div
class="flex-shrink-0 flex items-center cursor-pointer"
id="home-logo"
>
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-8 w-8"
/>
<span class="text-white font-bold text-xl ml-2">
<a href="/">BentoPDF</a>
</span>
</div>
<div class="hidden md:flex items-center space-x-8 text-white">
<a href="/" class="nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="nav-link" data-i18n="nav.about"
>About</a
>
<a href="/contact.html" class="nav-link" data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="nav-link" data-i18n="nav.allTools">All Tools</a>
</div>
<div class="md:hidden flex items-center">
<button
id="mobile-menu-button"
type="button"
class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500 transition-colors"
aria-controls="mobile-menu"
aria-expanded="false"
>
<span class="sr-only">Open main menu</span>
<svg
id="menu-icon"
class="block h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4 6h16M4 12h16M4 18h16"
/>
</svg>
<svg
id="close-icon"
class="hidden h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
</div>
</div>
<div
id="mobile-menu"
class="hidden md:hidden bg-gray-800 border-t border-gray-700"
>
<div class="px-2 pt-2 pb-3 space-y-1 text-center">
<a href="/" class="mobile-nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="mobile-nav-link" data-i18n="nav.about"
>About</a
>
<a
href="/contact.html"
class="mobile-nav-link"
data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="mobile-nav-link" data-i18n="nav.allTools"
>All Tools</a
>
</div>
</div>
</nav>
<div
id="uploader"
class="min-h-screen flex flex-col items-center justify-start py-12 p-4 bg-gray-900"
>
<div
id="tool-uploader"
class="bg-gray-800 rounded-xl shadow-xl px-4 py-8 md:p-8 max-w-2xl w-full text-blue-400 border border-gray-700"
>
<button
id="back-to-tools"
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 mb-6 font-semibold"
>
<i data-lucide="arrow-left" class="cursor-pointer"></i>
<span class="cursor-pointer" data-i18n="tools.backToTools">
Back to Tools
</span>
</button>
<h1
class="text-2xl font-bold text-white mb-2"
data-i18n="tools:pdfEditor.name"
>
Edit PDF Free Online - Modify PDFs Securely
</h1>
<p class="text-gray-400 mb-6" data-i18n="tools:pdfEditor.subtitle">
Annotate, highlight, redact, comment, add shapes/images, search, and
view PDFs.
</p>
<div
id="drop-zone"
class="relative flex flex-col items-center justify-center w-full h-48 md:h-64 border-2 border-dashed border-gray-600 rounded-xl cursor-pointer bg-gray-900 hover:bg-gray-700 transition-colors duration-300"
>
<div class="flex flex-col items-center justify-center pt-5 pb-6">
<i
data-lucide="upload-cloud"
class="w-10 h-10 mb-3 text-gray-400"
></i>
<p class="mb-2 text-sm text-gray-400">
<span class="font-semibold" data-i18n="upload.clickToSelect"
>Click to select a file</span
>
<span data-i18n="upload.orDragAndDrop">or drag and drop</span>
</p>
<p class="text-xs text-gray-500">PDF file</p>
<p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave">
Your files never leave your device.
</p>
</div>
<input
id="file-input"
type="file"
class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
accept="application/pdf"
multiple
/>
</div>
<div id="file-display-area" class="mt-4 space-y-2"></div>
<div id="embed-pdf-wrapper" class="hidden mt-6">
<div
id="embed-pdf-container"
class="w-full h-[75vh] border border-gray-600 rounded-lg"
></div>
</div>
</div>
</div>
<div
id="loader-modal"
class="hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50"
>
<div
class="bg-gray-800 p-8 rounded-lg flex flex-col items-center gap-4 border border-gray-700 shadow-xl"
>
<div class="solid-spinner"></div>
<p id="loader-text" class="text-white text-lg font-medium">
Processing...
</p>
</div>
</div>
<div
id="alert-modal"
class="fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50 hidden"
>
<div
class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700"
>
<h3
id="alert-title"
class="text-xl font-bold text-white mb-2"
data-i18n="alert.title"
data-i18n="alert.title"
>
Alert
</h3>
<p id="alert-message" class="text-gray-300 mb-6"></p>
<button
id="alert-ok"
class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded-lg transition-colors duration-200"
>
OK
</button>
</div>
</div>
<!-- How It Works Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-8 text-center">
How It Works
</h2>
<div class="space-y-6">
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
1
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Upload File</h3>
<p class="text-gray-400">
Click or drag and drop your file to begin
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
2
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Process</h3>
<p class="text-gray-400">Click the process button to start</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
3
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Download</h3>
<p class="text-gray-400">Save your processed file instantly</p>
</div>
</div>
</div>
</section>
<!-- Related Tools Section -->
<section class="max-w-6xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Related PDF Tools
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a
href="/compress-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Compress Pdf</h3>
<p class="text-gray-400 text-sm">Free online compress pdf tool</p>
</a>
<a
href="/merge-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Merge Pdf</h3>
<p class="text-gray-400 text-sm">Free online merge pdf tool</p>
</a>
<a
href="/rotate-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Rotate Pdf</h3>
<p class="text-gray-400 text-sm">Free online rotate pdf tool</p>
</a>
<a
href="/delete-pages"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Delete Pages</h3>
<p class="text-gray-400 text-sm">Free online delete pages tool</p>
</a>
<a
href="/add-watermark"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Add Watermark</h3>
<p class="text-gray-400 text-sm">Free online add watermark tool</p>
</a>
</div>
</section>
<!-- FAQ Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Frequently Asked Questions
</h2>
<div class="space-y-4">
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Is edit pdf really free?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Are my files private and secure?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Is there a file size limit?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
No! Process files of any size, as many times as you want, completely
free.
</p>
</details>
</div>
</section>
<footer class="mt-16 border-t-2 border-gray-700 py-8">
<div class="container mx-auto px-4">
<div
class="grid grid-cols-1 md:grid-cols-4 gap-8 text-center md:text-left"
>
<div class="mb-8 md:mb-0">
<div class="flex items-center justify-center md:justify-start mb-4">
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-10 w-10 mr-3"
/>
<span class="text-xl font-bold text-white">BentoPDF</span>
</div>
<p class="text-gray-400 text-sm">
&copy; 2026 BentoPDF. All rights reserved.
</p>
<p class="text-gray-500 text-xs mt-2">
Version <span id="app-version"></span>
</p>
</div>
<div>
<h3 class="font-bold text-white mb-4">Company</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/about.html" class="hover:text-indigo-400">About Us</a>
</li>
<li>
<a href="/faq.html" class="hover:text-indigo-400">FAQ</a>
</li>
<li>
<a href="/contact.html" class="hover:text-indigo-400"
>Contact Us</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/licensing.html" class="hover:text-indigo-400"
>Licensing</a
>
</li>
<li>
<a href="/terms.html" class="hover:text-indigo-400"
>Terms and Conditions</a
>
</li>
<li>
<a href="/privacy.html" class="hover:text-indigo-400"
>Privacy Policy</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Follow Us</h3>
<div class="flex justify-center md:justify-start space-x-4">
<a
href="https://github.com/alam00000/bentopdf"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="GitHub"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"
/>
</svg>
</a>
<a
href="https://discord.gg/Bgq3Ay3f2w"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="Discord"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"
/>
</svg>
</a>
<a
href="https://www.instagram.com/thebentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="Instagram"
>
<i data-lucide="instagram"></i>
</a>
<a
href="https://www.linkedin.com/company/bentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="LinkedIn"
>
<i data-lucide="linkedin"></i>
</a>
<a
href="https://x.com/BentoPDF"
class="text-gray-400 hover:text-indigo-400"
title="X (Twitter)"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
/>
</svg>
</a>
</div>
</div>
</div>
</div>
</footer>
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/utils/full-width.ts"></script>
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
<script type="module" src="/src/version.ts"></script>
<script type="module" src="/src/js/logic/edit-pdf-page.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module" src="/src/js/main.ts"></script>
<!-- JSON-LD Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Edit PDF - BentoPDF",
"applicationCategory": "PDF Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"ratingCount": "4169"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to edit online",
"description": "Learn how to edit using BentoPDF",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Upload File",
"text": "Click or drag and drop your file"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Process",
"text": "Click the process button"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Download",
"text": "Download your processed file"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.bentopdf.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Edit PDF",
"item": "https://www.bentopdf.com/edit-pdf"
}
]
}
</script>
</body>
</html>

View File

@@ -1,754 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Primary Meta Tags -->
<title>
Merge PDF Files Free Online - Combine Multiple PDFs | BentoPDF
</title>
<meta
name="title"
content="Merge PDF Files Free Online - Combine Multiple PDFs | BentoPDF"
/>
<meta
name="description"
content="★ Merge PDF files instantly - Combine multiple PDFs into one ★ Free forever ★ No file limits ★ Drag & drop pages ★ Privacy-first ★ Works in browser"
/>
<meta
name="keywords"
content="merge pdf, combine pdf, join pdf files, pdf merger, concatenate pdf, merge pdf free, combine pdf online"
/>
<meta name="author" content="BentoPDF" />
<meta
name="robots"
content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
/>
<!-- Canonical URL -->
<link rel="canonical" href="https://www.bentopdf.com/merge-pdf" />
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/merge-pdf" />
<meta
property="og:title"
content="Merge PDF Free - Combine Multiple PDF Files | BentoPDF"
/>
<meta
property="og:description"
content="Free PDF merger. Combine multiple PDFs into one document. No signup, unlimited files, privacy-first."
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-merge-pdf.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:site_name" content="BentoPDF" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/merge-pdf" />
<meta name="twitter:title" content="Merge PDF Free - Combine PDFs" />
<meta
name="twitter:description"
content="Free PDF merger. Combine multiple PDFs, no signup, privacy-first."
/>
<meta
name="twitter:image"
content="https://www.bentopdf.com/images/twitter-merge-pdf.png"
/>
<meta name="twitter:site" content="@BentoPDF" />
<!-- Mobile Web App -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Merge PDF" />
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/merge-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/merge-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/merge-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/merge-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />
</head>
<body class="antialiased bg-gray-900">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16">
<div
class="flex-shrink-0 flex items-center cursor-pointer"
id="home-logo"
>
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-8 w-8"
/>
<span class="text-white font-bold text-xl ml-2">
<a href="/">BentoPDF</a>
</span>
</div>
<!-- Desktop Navigation -->
<div class="hidden md:flex items-center space-x-8 text-white">
<a href="/" class="nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="nav-link" data-i18n="nav.about"
>About</a
>
<a href="/contact.html" class="nav-link" data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="nav-link" data-i18n="nav.allTools">All Tools</a>
</div>
<!-- Mobile Hamburger Button -->
<div class="md:hidden flex items-center">
<button
id="mobile-menu-button"
type="button"
class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500 transition-colors"
aria-controls="mobile-menu"
aria-expanded="false"
>
<span class="sr-only">Open main menu</span>
<!-- Hamburger Icon -->
<svg
id="menu-icon"
class="block h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4 6h16M4 12h16M4 18h16"
/>
</svg>
<!-- Close Icon -->
<svg
id="close-icon"
class="hidden h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
</div>
</div>
<!-- Mobile Menu Dropdown -->
<div
id="mobile-menu"
class="hidden md:hidden bg-gray-800 border-t border-gray-700"
>
<div class="px-2 pt-2 pb-3 space-y-1 text-center">
<a href="/" class="mobile-nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="mobile-nav-link" data-i18n="nav.about"
>About</a
>
<a
href="/contact.html"
class="mobile-nav-link"
data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="mobile-nav-link" data-i18n="nav.allTools"
>All Tools</a
>
</div>
</div>
</nav>
<div
id="uploader"
class="min-h-screen flex flex-col items-center justify-start py-12 p-4 bg-gray-900"
>
<div
id="tool-uploader"
class="bg-gray-800 rounded-xl shadow-xl px-4 py-8 md:p-8 max-w-2xl w-full text-gray-200 border border-gray-700"
>
<button
id="back-to-tools"
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 mb-6 font-semibold"
>
<i data-lucide="arrow-left" class="cursor-pointer"></i>
<span class="cursor-pointer" data-i18n="tools.backToTools">
Back to Tools
</span>
</button>
<h1
class="text-2xl font-bold text-white mb-2"
data-i18n="tools:mergePdf.name"
>
Merge PDF Files Free - Combine PDFs Instantly
</h1>
<p class="text-gray-400 mb-6" data-i18n="tools:mergePdf.subtitle">
Combine whole files, or select specific pages to merge into a new
document.
</p>
<!-- Drop Zone for Main PDF Upload -->
<div
id="drop-zone"
class="relative flex flex-col items-center justify-center w-full h-48 md:h-64 border-2 border-dashed border-gray-600 rounded-xl cursor-pointer bg-gray-900 hover:bg-gray-700 transition-colors duration-300"
>
<div class="flex flex-col items-center justify-center pt-5 pb-6">
<i
data-lucide="upload-cloud"
class="w-10 h-10 mb-3 text-gray-400"
></i>
<p class="mb-2 text-sm text-gray-400">
<span class="font-semibold" data-i18n="upload.clickToSelect"
>Click to select a file</span
>
<span data-i18n="upload.orDragAndDrop">or drag and drop</span>
</p>
<p class="text-xs text-gray-500" data-i18n="upload.pdfOrImages">
PDFs or Images
</p>
<p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave">
Your files never leave your device.
</p>
</div>
<input
id="file-input"
type="file"
class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
multiple
accept="application/pdf"
/>
</div>
<!-- Control buttons for multi-file uploads -->
<div id="file-controls" class="hidden mt-4 flex gap-3">
<button
id="add-more-btn"
class="btn bg-indigo-600 hover:bg-indigo-700 text-white font-semibold px-4 py-2 rounded-lg flex items-center gap-2"
>
<i data-lucide="plus"></i>
<span data-i18n="upload.addMore">Add More Files</span>
</button>
<button
id="clear-files-btn"
class="btn bg-gray-700 hover:bg-gray-600 text-white font-semibold px-4 py-2 rounded-lg flex items-center gap-2"
>
<i data-lucide="trash-2"></i>
<span data-i18n="upload.clearAll">Clear All</span>
</button>
</div>
<div id="merge-options" class="hidden mt-6">
<div
class="flex gap-2 p-1 rounded-lg bg-gray-900 border border-gray-700 mb-4"
>
<button
id="file-mode-btn"
class="flex-1 btn bg-indigo-600 text-white font-semibold py-2 rounded-md"
>
File Mode
</button>
<button
id="page-mode-btn"
class="flex-1 btn text-gray-300 font-semibold py-2 rounded-md"
>
Page Mode
</button>
</div>
<div id="file-mode-panel">
<div class="p-3 bg-gray-900 rounded-lg border border-gray-700 mb-3">
<p class="text-sm text-gray-300">
<strong class="text-white">How it works:</strong>
</p>
<ul
class="list-disc list-inside text-xs text-gray-400 mt-1 space-y-1"
>
<li>
Click and drag the
<i
data-lucide="grip-vertical"
class="inline-block w-3 h-3"
></i>
icon to change the order of the files.
</li>
<li>
In the "Pages" box for each file, you can specify ranges
(e.g., "1-3, 5") to merge only those pages.
</li>
<li>
Leave the "Pages" box blank to include all pages from that
file.
</li>
</ul>
</div>
<ul id="file-list" class="space-y-2"></ul>
</div>
<div id="page-mode-panel" class="hidden">
<div class="p-3 bg-gray-900 rounded-lg border border-gray-700 mb-3">
<p class="text-sm text-gray-300">
<strong class="text-white">How it works:</strong>
</p>
<ul
class="list-disc list-inside text-xs text-gray-400 mt-1 space-y-1"
>
<li>All pages from your uploaded PDFs are shown below.</li>
<li>
Simply drag and drop the individual page thumbnails to create
the exact order you want for your new file.
</li>
</ul>
</div>
<div
id="page-merge-preview"
class="grid grid-cols-4 sm:grid-cols-6 md:grid-cols-8 gap-4 p-4 bg-gray-900 rounded-lg border border-gray-700 min-h-[200px]"
></div>
</div>
<button id="process-btn" class="btn-gradient w-full mt-6">
Merge PDFs
</button>
</div>
</div>
</div>
<!-- Loader Modal -->
<div
id="loader-modal"
class="hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50"
>
<div
class="bg-gray-800 p-8 rounded-lg flex flex-col items-center gap-4 border border-gray-700 shadow-xl"
>
<div class="solid-spinner"></div>
<p id="loader-text" class="text-white text-lg font-medium">
Processing...
</p>
</div>
</div>
<!-- Alert Modal -->
<div
id="alert-modal"
class="fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50 hidden"
>
<div
class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700"
>
<h3
id="alert-title"
class="text-xl font-bold text-white mb-2"
data-i18n="alert.title"
data-i18n="alert.title"
>
Alert
</h3>
<p id="alert-message" class="text-gray-300 mb-6"></p>
<button
id="alert-ok"
class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded-lg transition-colors duration-200"
>
OK
</button>
</div>
</div>
<!-- How It Works Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-8 text-center">
How It Works
</h2>
<div class="space-y-6">
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
1
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Upload PDFs</h3>
<p class="text-gray-400">
Select or drag and drop multiple PDF files you want to merge
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
2
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Arrange Order</h3>
<p class="text-gray-400">
Drag files up or down to reorder them in your preferred sequence
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
3
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Merge Files</h3>
<p class="text-gray-400">
Click the merge button to combine all PDFs into a single document
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
4
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Download</h3>
<p class="text-gray-400">
Save your merged PDF - all pages combined in the order you chose
</p>
</div>
</div>
</div>
</section>
<!-- Related Tools Section -->
<section class="max-w-6xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Related PDF Tools
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a
href="/split-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Split Pdf</h3>
<p class="text-gray-400 text-sm">Free online split pdf tool</p>
</a>
<a
href="/organize-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Organize Pdf</h3>
<p class="text-gray-400 text-sm">Free online organize pdf tool</p>
</a>
<a
href="/compress-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Compress Pdf</h3>
<p class="text-gray-400 text-sm">Free online compress pdf tool</p>
</a>
<a
href="/rotate-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Rotate Pdf</h3>
<p class="text-gray-400 text-sm">Free online rotate pdf tool</p>
</a>
<a
href="/delete-pages"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Delete Pages</h3>
<p class="text-gray-400 text-sm">Free online delete pages tool</p>
</a>
</div>
</section>
<!-- FAQ Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Frequently Asked Questions
</h2>
<div class="space-y-4">
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
How many PDFs can I merge at once?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Unlimited! Merge as many PDF files as you need in a single
operation. No restrictions on file count or total size.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Will merging reduce PDF quality?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
No! BentoPDF preserves the original quality of all PDFs when
merging. Your documents remain crisp and clear with no quality loss.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Can I reorder pages after selecting files?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Yes! Simply drag and drop files to arrange them in any order before
clicking the merge button.
</p>
</details>
</div>
</section>
<footer class="mt-16 border-t-2 border-gray-700 py-8">
<div class="container mx-auto px-4">
<div
class="grid grid-cols-1 md:grid-cols-4 gap-8 text-center md:text-left"
>
<div class="mb-8 md:mb-0">
<div class="flex items-center justify-center md:justify-start mb-4">
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-10 w-10 mr-3"
/>
<span class="text-xl font-bold text-white">BentoPDF</span>
</div>
<p class="text-gray-400 text-sm">
&copy; 2026 BentoPDF. All rights reserved.
</p>
<p class="text-gray-500 text-xs mt-2">
Version <span id="app-version"></span>
</p>
</div>
<div>
<h3 class="font-bold text-white mb-4">Company</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/about.html" class="hover:text-indigo-400">About Us</a>
</li>
<li>
<a href="/faq.html" class="hover:text-indigo-400">FAQ</a>
</li>
<li>
<a href="/contact.html" class="hover:text-indigo-400"
>Contact Us</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/licensing.html" class="hover:text-indigo-400"
>Licensing</a
>
</li>
<li>
<a href="/terms.html" class="hover:text-indigo-400"
>Terms and Conditions</a
>
</li>
<li>
<a href="/privacy.html" class="hover:text-indigo-400"
>Privacy Policy</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Follow Us</h3>
<div class="flex justify-center md:justify-start space-x-4">
<a
href="https://github.com/alam00000/bentopdf"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="GitHub"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"
/>
</svg>
</a>
<a
href="https://discord.gg/Bgq3Ay3f2w"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="Discord"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"
/>
</svg>
</a>
<a
href="https://www.instagram.com/thebentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="Instagram"
>
<i data-lucide="instagram"></i>
</a>
<a
href="https://www.linkedin.com/company/bentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="LinkedIn"
>
<i data-lucide="linkedin"></i>
</a>
<a
href="https://x.com/BentoPDF"
class="text-gray-400 hover:text-indigo-400"
title="X (Twitter)"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
/>
</svg>
</a>
</div>
</div>
</div>
</div>
</footer>
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/utils/full-width.ts"></script>
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
<script type="module" src="/src/version.ts"></script>
<script type="module" src="/src/js/logic/merge-pdf-page.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module" src="/src/js/main.ts"></script>
<!-- JSON-LD Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Merge PDF - BentoPDF",
"applicationCategory": "PDF Merger Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"ratingCount": "4156"
},
"featureList": [
"Merge multiple PDFs into one",
"Drag and drop to reorder files",
"Select specific pages to merge",
"Page-level merging",
"Batch PDF combining",
"No file limits"
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to Merge PDF Files Online",
"description": "Learn how to combine multiple PDF files into a single document",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Upload PDF Files",
"text": "Click or drag and drop multiple PDF files"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Arrange Files",
"text": "Drag files to reorder them or select specific pages to include"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Merge PDFs",
"text": "Click 'Merge PDFs' to combine all files into one document"
},
{
"@type": "HowToStep",
"position": 4,
"name": "Download",
"text": "Download your merged PDF file"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.bentopdf.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Merge PDF",
"item": "https://www.bentopdf.com/merge-pdf"
}
]
}
</script>
</body>
</html>

View File

@@ -1,576 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Primary Meta Tags -->
<title>Organize PDF Online Free - Organize PDF Tool | BentoPDF</title>
<meta
name="title"
content="Organize PDF Online Free - Organize PDF Tool | BentoPDF"
/>
<meta
name="description"
content="★ Organize PDF online free - Organize PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta name="keywords" content="organize pdf, reorder pages, arrange pdf" />
<meta name="author" content="BentoPDF" />
<meta
name="robots"
content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
/>
<!-- Canonical URL -->
<link rel="canonical" href="https://www.bentopdf.com/organize-pdf" />
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/organize-pdf" />
<meta
property="og:title"
content="Organize PDF Online Free - Organize PDF Tool | BentoPDF"
/>
<meta
property="og:description"
content="★ Organize PDF online free - Organize PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-organize-pdf.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:site_name" content="BentoPDF" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/organize-pdf" />
<meta name="twitter:title" content="Organize PDF Free" />
<meta
name="twitter:description"
content="★ Organize PDF online free - Organize PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fas"
/>
<meta
name="twitter:image"
content="https://www.bentopdf.com/images/twitter-organize-pdf.png"
/>
<meta name="twitter:site" content="@BentoPDF" />
<!-- Mobile Web App -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Organize PDF" />
<title>Duplicate and Organize PDF Pages - BentoPDF</title>
<meta
name="description"
content="Reorder, duplicate, and organize PDF pages. Free and secure."
/>
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/organize-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/organize-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/organize-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/organize-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />
</head>
<body class="antialiased bg-gray-900">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16">
<div
class="flex-shrink-0 flex items-center cursor-pointer"
id="home-logo"
>
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-8 w-8"
/>
<span class="text-white font-bold text-xl ml-2"
><a href="/">BentoPDF</a></span
>
</div>
<div class="hidden md:flex items-center space-x-8 text-white">
<a href="/" class="nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="nav-link">About</a>
<a href="/" class="nav-link" data-i18n="nav.allTools">All Tools</a>
</div>
</div>
</div>
</nav>
<div
id="uploader"
class="min-h-screen flex flex-col items-center justify-start py-12 p-4 bg-gray-900"
>
<div
id="tool-uploader"
class="bg-gray-800 rounded-xl shadow-xl px-4 py-8 md:p-8 max-w-2xl w-full text-gray-200 border border-gray-700"
>
<button
id="back-to-tools"
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 mb-6 font-semibold"
>
<i data-lucide="arrow-left" class="cursor-pointer"></i>
<span class="cursor-pointer">Back to Tools</span>
</button>
<h1
class="text-2xl font-bold text-white mb-2"
data-i18n="tools:duplicateOrganize.name"
>
Organize PDF Pages Free - Reorder PDFs Online
</h1>
<p
class="text-gray-400 mb-6"
data-i18n="tools:duplicateOrganize.subtitle"
>
Drag pages to reorder them. Use the
<i
data-lucide="copy-plus"
class="inline-block w-4 h-4 mx-1 align-text-bottom text-green-500"
></i>
icon to duplicate a page or the
<i
data-lucide="x-circle"
class="inline-block w-4 h-4 mx-1 align-text-bottom text-red-400"
></i>
icon to delete it.
</p>
<!-- Drop Zone -->
<div
id="drop-zone"
class="relative flex flex-col items-center justify-center w-full h-48 md:h-64 border-2 border-dashed border-gray-600 rounded-xl cursor-pointer bg-gray-900 hover:bg-gray-700 transition-colors duration-300"
>
<div class="flex flex-col items-center justify-center pt-5 pb-6">
<i
data-lucide="upload-cloud"
class="w-10 h-10 mb-3 text-gray-400"
></i>
<p class="mb-2 text-sm text-gray-400">
<span class="font-semibold" data-i18n="upload.clickToSelect"
>Click to select a file</span
>
<span data-i18n="upload.orDragAndDrop">or drag and drop</span>
</p>
<p class="text-xs text-gray-500">PDF Documents</p>
<p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave">
Your files never leave your device.
</p>
</div>
<input
id="file-input"
type="file"
class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
accept="application/pdf"
/>
</div>
<!-- File Display -->
<div id="file-display-area" class="mt-4 space-y-2"></div>
<!-- Page Grid (shown after file upload) -->
<div
id="page-grid"
class="hidden grid grid-cols-3 sm:grid-cols-4 md:grid-cols-6 gap-4 my-6"
></div>
<button id="process-btn" class="hidden btn-gradient w-full mt-6">
Save Changes
</button>
</div>
</div>
<div
id="loader-modal"
class="hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50"
>
<div
class="bg-gray-800 p-8 rounded-lg flex flex-col items-center gap-4 border border-gray-700 shadow-xl"
>
<div class="solid-spinner"></div>
<p
id="loader-text"
class="text-white text-lg font-medium"
data-i18n="loader.processing"
data-i18n="loader.processing"
>
Processing...
</p>
</div>
</div>
<div
id="alert-modal"
class="fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50 hidden"
>
<div
class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700"
>
<h3
id="alert-title"
class="text-xl font-bold text-white mb-2"
data-i18n="alert.title"
data-i18n="alert.title"
>
Alert
</h3>
<p id="alert-message" class="text-gray-300 mb-6"></p>
<button
id="alert-ok"
class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded-lg"
data-i18n="alert.ok"
data-i18n="alert.ok"
>
OK
</button>
</div>
</div>
<!-- How It Works Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-8 text-center">
How It Works
</h2>
<div class="space-y-6">
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
1
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Upload File</h3>
<p class="text-gray-400">
Click or drag and drop your file to begin
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
2
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Process</h3>
<p class="text-gray-400">Click the process button to start</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
3
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Download</h3>
<p class="text-gray-400">Save your processed file instantly</p>
</div>
</div>
</div>
</section>
<!-- Related Tools Section -->
<section class="max-w-6xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Related PDF Tools
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a
href="/merge-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Merge Pdf</h3>
<p class="text-gray-400 text-sm">Free online merge pdf tool</p>
</a>
<a
href="/split-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Split Pdf</h3>
<p class="text-gray-400 text-sm">Free online split pdf tool</p>
</a>
<a
href="/rotate-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Rotate Pdf</h3>
<p class="text-gray-400 text-sm">Free online rotate pdf tool</p>
</a>
<a
href="/delete-pages"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Delete Pages</h3>
<p class="text-gray-400 text-sm">Free online delete pages tool</p>
</a>
<a
href="/extract-pages"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Extract Pages</h3>
<p class="text-gray-400 text-sm">Free online extract pages tool</p>
</a>
</div>
</section>
<!-- FAQ Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Frequently Asked Questions
</h2>
<div class="space-y-4">
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Is organize pdf really free?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Are my files private and secure?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Is there a file size limit?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
No! Process files of any size, as many times as you want, completely
free.
</p>
</details>
</div>
</section>
<footer class="mt-16 border-t-2 border-gray-700 py-8">
<div class="container mx-auto px-4">
<div
class="grid grid-cols-1 md:grid-cols-4 gap-8 text-center md:text-left"
>
<div class="mb-8 md:mb-0">
<div class="flex items-center justify-center md:justify-start mb-4">
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-10 w-10 mr-3"
/>
<span class="text-xl font-bold text-white">BentoPDF</span>
</div>
<p class="text-gray-400 text-sm">
&copy; 2026 BentoPDF. All rights reserved.
</p>
<p class="text-gray-500 text-xs mt-2">
Version <span id="app-version"></span>
</p>
</div>
<div>
<h3 class="font-bold text-white mb-4">Company</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/about.html" class="hover:text-indigo-400">About Us</a>
</li>
<li><a href="/faq.html" class="hover:text-indigo-400">FAQ</a></li>
<li>
<a href="/contact.html" class="hover:text-indigo-400"
>Contact Us</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/licensing.html" class="hover:text-indigo-400"
>Licensing</a
>
</li>
<li>
<a href="/terms.html" class="hover:text-indigo-400"
>Terms and Conditions</a
>
</li>
<li>
<a href="/privacy.html" class="hover:text-indigo-400"
>Privacy Policy</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Follow Us</h3>
<div class="flex justify-center md:justify-start space-x-4">
<a
href="https://github.com/alam00000/bentopdf"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="GitHub"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"
/>
</svg>
</a>
<a
href="https://discord.gg/Bgq3Ay3f2w"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="Discord"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"
/>
</svg>
</a>
<a
href="https://www.instagram.com/thebentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="Instagram"
>
<i data-lucide="instagram"></i>
</a>
<a
href="https://www.linkedin.com/company/bentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="LinkedIn"
>
<i data-lucide="linkedin"></i>
</a>
<a
href="https://x.com/BentoPDF"
class="text-gray-400 hover:text-indigo-400"
title="X (Twitter)"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
/>
</svg>
</a>
</div>
</div>
</div>
</div>
</footer>
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/utils/full-width.ts"></script>
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
<script type="module" src="/src/version.ts"></script>
<script type="module" src="/src/js/logic/organize-pdf-page.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module" src="/src/js/main.ts"></script>
<!-- JSON-LD Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Organize PDF - BentoPDF",
"applicationCategory": "PDF Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"ratingCount": "3604"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to organize online",
"description": "Learn how to organize using BentoPDF",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Upload File",
"text": "Click or drag and drop your file"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Process",
"text": "Click the process button"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Download",
"text": "Download your processed file"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.bentopdf.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Organize PDF",
"item": "https://www.bentopdf.com/organize-pdf"
}
]
}
</script>
</body>
</html>

View File

@@ -1,638 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Primary Meta Tags -->
<title>PDF to Word Converter Free Online - Convert Files | BentoPDF</title>
<meta
name="title"
content="PDF to Word Converter Free Online - Convert Files | BentoPDF"
/>
<meta
name="description"
content="★ PDF to Word online free - Convert PDF to Word PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
name="keywords"
content="pdf to word, pdf to docx, convert pdf to word"
/>
<meta name="author" content="BentoPDF" />
<meta
name="robots"
content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
/>
<!-- Canonical URL -->
<link rel="canonical" href="https://www.bentopdf.com/pdf-to-docx" />
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/pdf-to-docx" />
<meta
property="og:title"
content="PDF to Word Converter Free Online - Convert Files | BentoPDF"
/>
<meta
property="og:description"
content="★ PDF to Word online free - Convert PDF to Word PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-pdf-to-docx.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:site_name" content="BentoPDF" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/pdf-to-docx" />
<meta name="twitter:title" content="PDF to Word Free" />
<meta
name="twitter:description"
content="★ PDF to Word online free - Convert PDF to Word PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in bro"
/>
<meta
name="twitter:image"
content="https://www.bentopdf.com/images/twitter-pdf-to-docx.png"
/>
<meta name="twitter:site" content="@BentoPDF" />
<!-- Mobile Web App -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="PDF to Word" />
<title>PDF to DOCX - BentoPDF</title>
<meta
name="description"
content="Convert PDF files to editable Word documents (DOCX). Free, secure, and runs entirely in your browser."
/>
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/pdf-to-docx.html" />
<link rel="alternate" hreflang="x-default" href="/en/pdf-to-docx.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />
</head>
<body class="antialiased bg-gray-900">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16">
<div
class="flex-shrink-0 flex items-center cursor-pointer"
id="home-logo"
>
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-8 w-8"
/>
<span class="text-white font-bold text-xl ml-2">
<a href="/">BentoPDF</a>
</span>
</div>
<div class="hidden md:flex items-center space-x-8 text-white">
<a href="/" class="nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="nav-link" data-i18n="nav.about"
>About</a
>
<a href="/contact.html" class="nav-link" data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="nav-link" data-i18n="nav.allTools">All Tools</a>
</div>
<div class="md:hidden flex items-center">
<button
id="mobile-menu-button"
type="button"
class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500 transition-colors"
aria-controls="mobile-menu"
aria-expanded="false"
>
<span class="sr-only">Open main menu</span>
<svg
id="menu-icon"
class="block h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4 6h16M4 12h16M4 18h16"
/>
</svg>
<svg
id="close-icon"
class="hidden h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
</div>
</div>
<div
id="mobile-menu"
class="hidden md:hidden bg-gray-800 border-t border-gray-700"
>
<div class="px-2 pt-2 pb-3 space-y-1 text-center">
<a href="/" class="mobile-nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="mobile-nav-link" data-i18n="nav.about"
>About</a
>
<a
href="/contact.html"
class="mobile-nav-link"
data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="mobile-nav-link" data-i18n="nav.allTools"
>All Tools</a
>
</div>
</div>
</nav>
<div
id="uploader"
class="min-h-screen flex flex-col items-center justify-start py-12 p-4 bg-gray-900"
>
<div
id="tool-uploader"
class="bg-gray-800 rounded-xl shadow-xl px-4 py-8 md:p-8 max-w-2xl w-full text-gray-200 border border-gray-700"
>
<button
id="back-to-tools"
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 mb-6 font-semibold"
>
<i data-lucide="arrow-left" class="cursor-pointer"></i>
<span class="cursor-pointer" data-i18n="tools.backToTools"
>Back to Tools</span
>
</button>
<h1 class="text-2xl font-bold text-white mb-2">
PDF to Word Converter Free - Convert PDF to DOCX
</h1>
<p class="text-gray-400 mb-6">
Convert PDF files to editable Word documents. Preserves text,
formatting, and layout.
</p>
<div
id="drop-zone"
class="relative flex flex-col items-center justify-center w-full h-48 md:h-64 border-2 border-dashed border-gray-600 rounded-xl cursor-pointer bg-gray-900 hover:bg-gray-700 transition-colors duration-300"
>
<div class="flex flex-col items-center justify-center pt-5 pb-6">
<i
data-lucide="upload-cloud"
class="w-10 h-10 mb-3 text-gray-400"
></i>
<p class="mb-2 text-sm text-gray-400">
<span class="font-semibold">Click to select files</span>
<span data-i18n="upload.orDragAndDrop">or drag and drop</span>
</p>
<p class="text-xs text-gray-500">One or more PDF files</p>
<p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave">
Your files never leave your device.
</p>
</div>
<input
id="file-input"
type="file"
class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
accept="application/pdf"
multiple
/>
</div>
<div id="file-controls" class="hidden mt-4 flex gap-3">
<button
id="add-more-btn"
class="btn bg-indigo-600 hover:bg-indigo-700 text-white font-semibold px-4 py-2 rounded-lg flex items-center gap-2"
>
<i data-lucide="plus"></i>
<span data-i18n="upload.addMore">Add More Files</span>
</button>
<button
id="clear-files-btn"
class="btn bg-gray-700 hover:bg-gray-600 text-white font-semibold px-4 py-2 rounded-lg flex items-center gap-2"
>
<i data-lucide="trash-2"></i>
<span data-i18n="upload.clearAll">Clear All</span>
</button>
</div>
<div id="file-display-area" class="mt-4 space-y-2"></div>
<div id="convert-options" class="hidden mt-6 space-y-6">
<button id="process-btn" class="btn-gradient w-full mt-4">
Convert to DOCX
</button>
</div>
</div>
</div>
<div
id="loader-modal"
class="hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50"
>
<div
class="bg-gray-800 p-8 rounded-lg flex flex-col items-center gap-4 border border-gray-700 shadow-xl"
>
<div class="solid-spinner"></div>
<p id="loader-text" class="text-white text-lg font-medium">
Processing...
</p>
</div>
</div>
<div
id="alert-modal"
class="fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50 hidden"
>
<div
class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700"
>
<h3 id="alert-title" class="text-xl font-bold text-white mb-2">
Alert
</h3>
<p id="alert-message" class="text-gray-300 mb-6"></p>
<button
id="alert-ok"
class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded-lg transition-colors duration-200"
>
OK
</button>
</div>
</div>
<!-- How It Works Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-8 text-center">
How It Works
</h2>
<div class="space-y-6">
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
1
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Upload File</h3>
<p class="text-gray-400">
Click or drag and drop your file to begin
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
2
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Process</h3>
<p class="text-gray-400">Click the process button to start</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
3
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Download</h3>
<p class="text-gray-400">Save your processed file instantly</p>
</div>
</div>
</div>
</section>
<!-- Related Tools Section -->
<section class="max-w-6xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Related PDF Tools
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a
href="/word-to-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Word To Pdf</h3>
<p class="text-gray-400 text-sm">Free online word to pdf tool</p>
</a>
<a
href="/pdf-to-text"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Pdf To Text</h3>
<p class="text-gray-400 text-sm">Free online pdf to text tool</p>
</a>
<a
href="/pdf-to-excel"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Pdf To Excel</h3>
<p class="text-gray-400 text-sm">Free online pdf to excel tool</p>
</a>
<a
href="/edit-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Edit Pdf</h3>
<p class="text-gray-400 text-sm">Free online edit pdf tool</p>
</a>
<a
href="/extract-pages"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Extract Pages</h3>
<p class="text-gray-400 text-sm">Free online extract pages tool</p>
</a>
</div>
</section>
<!-- FAQ Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Frequently Asked Questions
</h2>
<div class="space-y-4">
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Is pdf to docx really free?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Are my files private and secure?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Is there a file size limit?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
No! Process files of any size, as many times as you want, completely
free.
</p>
</details>
</div>
</section>
<footer class="mt-16 border-t-2 border-gray-700 py-8">
<div class="container mx-auto px-4">
<div
class="grid grid-cols-1 md:grid-cols-4 gap-8 text-center md:text-left"
>
<div class="mb-8 md:mb-0">
<div class="flex items-center justify-center md:justify-start mb-4">
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-10 w-10 mr-3"
/>
<span class="text-xl font-bold text-white">BentoPDF</span>
</div>
<p class="text-gray-400 text-sm">
&copy; 2026 BentoPDF. All rights reserved.
</p>
<p class="text-gray-500 text-xs mt-2">
Version <span id="app-version"></span>
</p>
</div>
<div>
<h3 class="font-bold text-white mb-4">Company</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/about.html" class="hover:text-indigo-400">About Us</a>
</li>
<li>
<a href="/faq.html" class="hover:text-indigo-400">FAQ</a>
</li>
<li>
<a href="/contact.html" class="hover:text-indigo-400"
>Contact Us</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/licensing.html" class="hover:text-indigo-400"
>Licensing</a
>
</li>
<li>
<a href="/terms.html" class="hover:text-indigo-400"
>Terms and Conditions</a
>
</li>
<li>
<a href="/privacy.html" class="hover:text-indigo-400"
>Privacy Policy</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Follow Us</h3>
<div class="flex justify-center md:justify-start space-x-4">
<a
href="https://github.com/alam00000/bentopdf"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="GitHub"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"
/>
</svg>
</a>
<a
href="https://discord.gg/Bgq3Ay3f2w"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="Discord"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"
/>
</svg>
</a>
<a
href="https://www.instagram.com/thebentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="Instagram"
>
<i data-lucide="instagram"></i>
</a>
<a
href="https://www.linkedin.com/company/bentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="LinkedIn"
>
<i data-lucide="linkedin"></i>
</a>
<a
href="https://x.com/BentoPDF"
class="text-gray-400 hover:text-indigo-400"
title="X (Twitter)"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
/>
</svg>
</a>
</div>
</div>
</div>
</div>
</footer>
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/utils/full-width.ts"></script>
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
<script type="module" src="/src/version.ts"></script>
<script type="module" src="/src/js/logic/pdf-to-docx-page.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module" src="/src/js/main.ts"></script>
<!-- JSON-LD Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "PDF to Word - BentoPDF",
"applicationCategory": "PDF Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"ratingCount": "4973"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to convert PDF to Word online",
"description": "Learn how to convert PDF to Word using BentoPDF",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Upload File",
"text": "Click or drag and drop your file"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Process",
"text": "Click the process button"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Download",
"text": "Download your processed file"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.bentopdf.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "PDF to Word",
"item": "https://www.bentopdf.com/pdf-to-docx"
}
]
}
</script>
</body>
</html>

View File

@@ -1,677 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Primary Meta Tags -->
<title>PDF to JPG Converter Free Online - Convert Files | BentoPDF</title>
<meta
name="title"
content="PDF to JPG Converter Free Online - Convert Files | BentoPDF"
/>
<meta
name="description"
content="★ PDF to JPG online free - Convert PDF to JPG PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
name="keywords"
content="pdf to jpg, pdf to image, pdf to jpeg, convert pdf to pictures"
/>
<meta name="author" content="BentoPDF" />
<meta
name="robots"
content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
/>
<!-- Canonical URL -->
<link rel="canonical" href="https://www.bentopdf.com/pdf-to-jpg" />
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/pdf-to-jpg" />
<meta
property="og:title"
content="PDF to JPG Converter Free Online - Convert Files | BentoPDF"
/>
<meta
property="og:description"
content="★ PDF to JPG online free - Convert PDF to JPG PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-pdf-to-jpg.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:site_name" content="BentoPDF" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/pdf-to-jpg" />
<meta name="twitter:title" content="PDF to JPG Free" />
<meta
name="twitter:description"
content="★ PDF to JPG online free - Convert PDF to JPG PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in brows"
/>
<meta
name="twitter:image"
content="https://www.bentopdf.com/images/twitter-pdf-to-jpg.png"
/>
<meta name="twitter:site" content="@BentoPDF" />
<!-- Mobile Web App -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="PDF to JPG" />
<title>PDF to JPG - BentoPDF</title>
<meta
name="description"
content="Convert PDF pages to JPG images. Free, secure, and runs entirely in your browser."
/>
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/pdf-to-jpg.html" />
<link rel="alternate" hreflang="de" href="/de/pdf-to-jpg.html" />
<link rel="alternate" hreflang="vi" href="/vi/pdf-to-jpg.html" />
<link rel="alternate" hreflang="x-default" href="/en/pdf-to-jpg.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />
</head>
<body class="antialiased bg-gray-900">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16">
<div
class="flex-shrink-0 flex items-center cursor-pointer"
id="home-logo"
>
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-8 w-8"
/>
<span class="text-white font-bold text-xl ml-2">
<a href="/">BentoPDF</a>
</span>
</div>
<div class="hidden md:flex items-center space-x-8 text-white">
<a href="/" class="nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="nav-link" data-i18n="nav.about"
>About</a
>
<a href="/contact.html" class="nav-link" data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="nav-link" data-i18n="nav.allTools">All Tools</a>
</div>
<div class="md:hidden flex items-center">
<button
id="mobile-menu-button"
type="button"
class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500 transition-colors"
aria-controls="mobile-menu"
aria-expanded="false"
>
<span class="sr-only">Open main menu</span>
<svg
id="menu-icon"
class="block h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4 6h16M4 12h16M4 18h16"
/>
</svg>
<svg
id="close-icon"
class="hidden h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
</div>
</div>
<div
id="mobile-menu"
class="hidden md:hidden bg-gray-800 border-t border-gray-700"
>
<div class="px-2 pt-2 pb-3 space-y-1 text-center">
<a href="/" class="mobile-nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="mobile-nav-link" data-i18n="nav.about"
>About</a
>
<a
href="/contact.html"
class="mobile-nav-link"
data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="mobile-nav-link" data-i18n="nav.allTools"
>All Tools</a
>
</div>
</div>
</nav>
<div
id="uploader"
class="min-h-screen flex flex-col items-center justify-start py-12 p-4 bg-gray-900"
>
<div
id="tool-uploader"
class="bg-gray-800 rounded-xl shadow-xl px-4 py-8 md:p-8 max-w-2xl w-full text-gray-200 border border-gray-700"
>
<button
id="back-to-tools"
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 mb-6 font-semibold"
>
<i data-lucide="arrow-left" class="cursor-pointer"></i>
<span class="cursor-pointer" data-i18n="tools.backToTools">
Back to Tools
</span>
</button>
<h1
class="text-2xl font-bold text-white mb-2"
data-i18n="tools:pdfToJpg.name"
>
PDF to JPG Converter Free - Convert PDF to Images
</h1>
<p class="text-gray-400 mb-6" data-i18n="tools:pdfToJpg.subtitle">
Convert each page of a PDF file into a high-quality JPG image.
</p>
<div
id="drop-zone"
class="relative flex flex-col items-center justify-center w-full h-48 md:h-64 border-2 border-dashed border-gray-600 rounded-xl cursor-pointer bg-gray-900 hover:bg-gray-700 transition-colors duration-300"
>
<div class="flex flex-col items-center justify-center pt-5 pb-6">
<i
data-lucide="upload-cloud"
class="w-10 h-10 mb-3 text-gray-400"
></i>
<p class="mb-2 text-sm text-gray-400">
<span class="font-semibold" data-i18n="upload.clickToSelect"
>Click to select a file</span
>
<span data-i18n="upload.orDragAndDrop">or drag and drop</span>
</p>
<p class="text-xs text-gray-500">A single PDF file</p>
<p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave">
Your files never leave your device.
</p>
</div>
<input
id="file-input"
type="file"
class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
accept="application/pdf"
/>
</div>
<div id="file-display-area" class="mt-4 space-y-2"></div>
<div id="options-panel" class="hidden mt-6">
<div class="mb-4">
<label
for="jpg-quality"
class="block mb-2 text-sm font-medium text-gray-300"
>Image Quality</label
>
<div class="flex items-center gap-4">
<input
type="range"
id="jpg-quality"
min="0.1"
max="1.0"
step="0.01"
value="0.9"
class="flex-1"
/>
<span
id="jpg-quality-value"
class="text-white font-medium w-16 text-right"
>90%</span
>
</div>
<p class="mt-1 text-xs text-gray-400">
Higher quality = larger file size
</p>
</div>
<button id="process-btn" class="btn-gradient w-full">
Download All as ZIP
</button>
</div>
</div>
</div>
<div
id="loader-modal"
class="hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50"
>
<div
class="bg-gray-800 p-8 rounded-lg flex flex-col items-center gap-4 border border-gray-700 shadow-xl"
>
<div class="solid-spinner"></div>
<p id="loader-text" class="text-white text-lg font-medium">
Processing...
</p>
</div>
</div>
<div
id="alert-modal"
class="fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50 hidden"
>
<div
class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700"
>
<h3
id="alert-title"
class="text-xl font-bold text-white mb-2"
data-i18n="alert.title"
data-i18n="alert.title"
>
Alert
</h3>
<p id="alert-message" class="text-gray-300 mb-6"></p>
<button
id="alert-ok"
class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded-lg transition-colors duration-200"
>
OK
</button>
</div>
</div>
<!-- How It Works Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-8 text-center">
How It Works
</h2>
<div class="space-y-6">
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
1
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Upload PDF</h3>
<p class="text-gray-400">
Select the PDF file you want to convert to images
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
2
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">
Choose Quality
</h3>
<p class="text-gray-400">
Select image quality (Low, Medium, High, Maximum)
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
3
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Select Pages</h3>
<p class="text-gray-400">
Convert all pages or choose specific pages to extract
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
4
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">
Download Images
</h3>
<p class="text-gray-400">
Save JPG images individually or as a ZIP archive
</p>
</div>
</div>
</div>
</section>
<!-- Related Tools Section -->
<section class="max-w-6xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Related PDF Tools
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a
href="/pdf-to-png"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Pdf To Png</h3>
<p class="text-gray-400 text-sm">Free online pdf to png tool</p>
</a>
<a
href="/compress-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Compress Pdf</h3>
<p class="text-gray-400 text-sm">Free online compress pdf tool</p>
</a>
<a
href="/split-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Split Pdf</h3>
<p class="text-gray-400 text-sm">Free online split pdf tool</p>
</a>
<a
href="/pdf-to-webp"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Pdf To Webp</h3>
<p class="text-gray-400 text-sm">Free online pdf to webp tool</p>
</a>
<a
href="/extract-images"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Extract Images</h3>
<p class="text-gray-400 text-sm">Free online extract images tool</p>
</a>
</div>
</section>
<!-- FAQ Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Frequently Asked Questions
</h2>
<div class="space-y-4">
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
What quality should I choose?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Use High or Maximum for print-quality images, Medium for web use, or
Low to save disk space. Higher quality produces larger file sizes.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Can I convert specific pages only?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Yes! You can choose to convert all pages or select specific pages
you want as JPG images.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Are the JPG files compressed?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Yes, JPG is a compressed format. You control the quality level -
higher quality means less compression and larger files.
</p>
</details>
</div>
</section>
<footer class="mt-16 border-t-2 border-gray-700 py-8">
<div class="container mx-auto px-4">
<div
class="grid grid-cols-1 md:grid-cols-4 gap-8 text-center md:text-left"
>
<div class="mb-8 md:mb-0">
<div class="flex items-center justify-center md:justify-start mb-4">
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-10 w-10 mr-3"
/>
<span class="text-xl font-bold text-white">BentoPDF</span>
</div>
<p class="text-gray-400 text-sm">
&copy; 2026 BentoPDF. All rights reserved.
</p>
<p class="text-gray-500 text-xs mt-2">
Version <span id="app-version"></span>
</p>
</div>
<div>
<h3 class="font-bold text-white mb-4">Company</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/about.html" class="hover:text-indigo-400">About Us</a>
</li>
<li><a href="/faq.html" class="hover:text-indigo-400">FAQ</a></li>
<li>
<a href="/contact.html" class="hover:text-indigo-400"
>Contact Us</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/licensing.html" class="hover:text-indigo-400"
>Licensing</a
>
</li>
<li>
<a href="/terms.html" class="hover:text-indigo-400"
>Terms and Conditions</a
>
</li>
<li>
<a href="/privacy.html" class="hover:text-indigo-400"
>Privacy Policy</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Follow Us</h3>
<div class="flex justify-center md:justify-start space-x-4">
<a
href="https://github.com/alam00000/bentopdf"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="GitHub"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"
/>
</svg>
</a>
<a
href="https://discord.gg/Bgq3Ay3f2w"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="Discord"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"
/>
</svg>
</a>
<a
href="https://www.instagram.com/thebentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="Instagram"
>
<i data-lucide="instagram"></i>
</a>
<a
href="https://www.linkedin.com/company/bentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="LinkedIn"
>
<i data-lucide="linkedin"></i>
</a>
<a
href="https://x.com/BentoPDF"
class="text-gray-400 hover:text-indigo-400"
title="X (Twitter)"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
/>
</svg>
</a>
</div>
</div>
</div>
</div>
</footer>
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/utils/full-width.ts"></script>
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
<script type="module" src="/src/version.ts"></script>
<script type="module" src="/src/js/logic/pdf-to-jpg-page.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module" src="/src/js/main.ts"></script>
<!-- JSON-LD Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "PDF to JPG - BentoPDF",
"applicationCategory": "PDF Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"ratingCount": "3191"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to convert PDF to JPG online",
"description": "Learn how to convert PDF to JPG using BentoPDF",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Upload File",
"text": "Click or drag and drop your file"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Process",
"text": "Click the process button"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Download",
"text": "Download your processed file"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.bentopdf.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "PDF to JPG",
"item": "https://www.bentopdf.com/pdf-to-jpg"
}
]
}
</script>
</body>
</html>

View File

@@ -1,660 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Primary Meta Tags -->
<title>Rotate PDF Online Free - Rotate PDF Tool | BentoPDF</title>
<meta
name="title"
content="Rotate PDF Online Free - Rotate PDF Tool | BentoPDF"
/>
<meta
name="description"
content="★ Rotate PDF online free - Rotate PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta name="keywords" content="rotate pdf, turn pdf, flip pdf pages" />
<meta name="author" content="BentoPDF" />
<meta
name="robots"
content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
/>
<!-- Canonical URL -->
<link rel="canonical" href="https://www.bentopdf.com/rotate-pdf" />
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/rotate-pdf" />
<meta
property="og:title"
content="Rotate PDF Online Free - Rotate PDF Tool | BentoPDF"
/>
<meta
property="og:description"
content="★ Rotate PDF online free - Rotate PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-rotate-pdf.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:site_name" content="BentoPDF" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/rotate-pdf" />
<meta name="twitter:title" content="Rotate PDF Free" />
<meta
name="twitter:description"
content="★ Rotate PDF online free - Rotate PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & "
/>
<meta
name="twitter:image"
content="https://www.bentopdf.com/images/twitter-rotate-pdf.png"
/>
<meta name="twitter:site" content="@BentoPDF" />
<!-- Mobile Web App -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Rotate PDF" />
<title>Rotate PDF - BentoPDF</title>
<meta
name="description"
content="Rotate PDF pages by 90, 180, or 270 degrees. Rotate individual pages or all pages at once. Free, secure, and runs entirely in your browser."
/>
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" />
<link rel="icon" type="image/png" href="/images/favicon.png" />
<link rel="apple-touch-icon" href="/images/favicon.png" />
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/rotate-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/rotate-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/rotate-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/rotate-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>
<body class="antialiased bg-gray-900">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16">
<div
class="flex-shrink-0 flex items-center cursor-pointer"
id="home-logo"
>
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-8 w-8"
/>
<span class="text-white font-bold text-xl ml-2">
<a href="/">BentoPDF</a>
</span>
</div>
<div class="hidden md:flex items-center space-x-8 text-white">
<a href="/" class="nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="nav-link" data-i18n="nav.about"
>About</a
>
<a href="/contact.html" class="nav-link" data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="nav-link" data-i18n="nav.allTools">All Tools</a>
</div>
<div class="md:hidden flex items-center">
<button
id="mobile-menu-button"
type="button"
class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500 transition-colors"
aria-controls="mobile-menu"
aria-expanded="false"
>
<span class="sr-only">Open main menu</span>
<svg
id="menu-icon"
class="block h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4 6h16M4 12h16M4 18h16"
/>
</svg>
<svg
id="close-icon"
class="hidden h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
</div>
</div>
<div
id="mobile-menu"
class="hidden md:hidden bg-gray-800 border-t border-gray-700"
>
<div class="px-2 pt-2 pb-3 space-y-1 text-center">
<a href="/" class="mobile-nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="mobile-nav-link" data-i18n="nav.about"
>About</a
>
<a
href="/contact.html"
class="mobile-nav-link"
data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="mobile-nav-link" data-i18n="nav.allTools"
>All Tools</a
>
</div>
</div>
</nav>
<div
id="uploader"
class="min-h-screen flex flex-col items-center justify-start py-12 p-4 bg-gray-900"
>
<div
id="tool-uploader"
class="bg-gray-800 rounded-xl shadow-xl px-4 py-8 md:p-8 max-w-4xl w-full text-gray-200 border border-gray-700"
>
<button
id="back-to-tools"
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 mb-6 font-semibold"
>
<i data-lucide="arrow-left" class="cursor-pointer"></i>
<span class="cursor-pointer" data-i18n="tools.backToTools">
Back to Tools
</span>
</button>
<h1
class="text-2xl font-bold text-white mb-2"
data-i18n="tools:rotatePdf.name"
>
Rotate PDF Pages Free - Turn PDFs Online
</h1>
<p class="text-gray-400 mb-6" data-i18n="tools:rotatePdf.subtitle">
Rotate individual pages or all pages at once. Click on page thumbnails
to rotate them.
</p>
<div
id="drop-zone"
class="relative flex flex-col items-center justify-center w-full h-48 md:h-64 border-2 border-dashed border-gray-600 rounded-xl cursor-pointer bg-gray-900 hover:bg-gray-700 transition-colors duration-300"
>
<div class="flex flex-col items-center justify-center pt-5 pb-6">
<i
data-lucide="upload-cloud"
class="w-10 h-10 mb-3 text-gray-400"
></i>
<p class="mb-2 text-sm text-gray-400">
<span class="font-semibold" data-i18n="upload.clickToSelect"
>Click to select a file</span
>
<span data-i18n="upload.orDragAndDrop">or drag and drop</span>
</p>
<p class="text-xs text-gray-500">A single PDF file</p>
<p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave">
Your files never leave your device.
</p>
</div>
<input
id="file-input"
type="file"
class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
accept="application/pdf"
/>
</div>
<div id="file-display-area" class="mt-4 space-y-2"></div>
<div id="tool-options" class="hidden mt-6">
<!-- Batch Actions -->
<div class="bg-gray-900 rounded-lg border border-gray-700 p-4 mb-4">
<h3
class="text-center text-sm font-semibold text-white mb-4 uppercase tracking-wider"
>
Batch Actions
</h3>
<div class="flex justify-center items-center">
<!-- Rotate by 90 Degrees -->
<div class="flex gap-2">
<button
id="rotate-all-left"
class="flex items-center gap-2 px-4 py-2 bg-gray-700 hover:bg-gray-600 text-white rounded-lg text-sm border border-gray-600"
>
<i data-lucide="rotate-ccw" class="w-4 h-4"></i> Left
</button>
<button
id="rotate-all-right"
class="flex items-center gap-2 px-4 py-2 bg-gray-700 hover:bg-gray-600 text-white rounded-lg text-sm border border-gray-600"
>
<i data-lucide="rotate-cw" class="w-4 h-4"></i> Right
</button>
</div>
</div>
</div>
<!-- Page Thumbnails -->
<div
id="page-thumbnails"
class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4 mb-4"
></div>
<button id="process-btn" class="btn-gradient w-full mt-4">
Apply Rotations
</button>
</div>
</div>
</div>
<!-- Loader Modal -->
<div
id="loader-modal"
class="hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50"
>
<div
class="bg-gray-800 p-8 rounded-lg flex flex-col items-center gap-4 border border-gray-700 shadow-xl"
>
<div class="solid-spinner"></div>
<p
id="loader-text"
class="text-white text-lg font-medium"
data-i18n="loader.processing"
data-i18n="loader.processing"
>
Processing...
</p>
</div>
</div>
<!-- Alert Modal -->
<div
id="alert-modal"
class="fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50 hidden"
>
<div
class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700"
>
<h3
id="alert-title"
class="text-xl font-bold text-white mb-2"
data-i18n="alert.title"
data-i18n="alert.title"
>
Alert
</h3>
<p id="alert-message" class="text-gray-300 mb-6"></p>
<button
id="alert-ok"
class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded-lg transition-colors duration-200"
>
OK
</button>
</div>
</div>
<!-- How It Works Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-8 text-center">
How It Works
</h2>
<div class="space-y-6">
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
1
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Upload File</h3>
<p class="text-gray-400">
Click or drag and drop your file to begin
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
2
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Process</h3>
<p class="text-gray-400">Click the process button to start</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
3
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Download</h3>
<p class="text-gray-400">Save your processed file instantly</p>
</div>
</div>
</div>
</section>
<!-- Related Tools Section -->
<section class="max-w-6xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Related PDF Tools
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a
href="/merge-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Merge Pdf</h3>
<p class="text-gray-400 text-sm">Free online merge pdf tool</p>
</a>
<a
href="/split-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Split Pdf</h3>
<p class="text-gray-400 text-sm">Free online split pdf tool</p>
</a>
<a
href="/organize-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Organize Pdf</h3>
<p class="text-gray-400 text-sm">Free online organize pdf tool</p>
</a>
<a
href="/compress-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Compress Pdf</h3>
<p class="text-gray-400 text-sm">Free online compress pdf tool</p>
</a>
<a
href="/delete-pages"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Delete Pages</h3>
<p class="text-gray-400 text-sm">Free online delete pages tool</p>
</a>
</div>
</section>
<!-- FAQ Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Frequently Asked Questions
</h2>
<div class="space-y-4">
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Is rotate pdf really free?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Are my files private and secure?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Is there a file size limit?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
No! Process files of any size, as many times as you want, completely
free.
</p>
</details>
</div>
</section>
<footer class="mt-16 border-t-2 border-gray-700 py-8">
<div class="container mx-auto px-4">
<div
class="grid grid-cols-1 md:grid-cols-4 gap-8 text-center md:text-left"
>
<div class="mb-8 md:mb-0">
<div class="flex items-center justify-center md:justify-start mb-4">
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-10 w-10 mr-3"
/>
<span class="text-xl font-bold text-white">BentoPDF</span>
</div>
<p class="text-gray-400 text-sm">
&copy; 2026 BentoPDF. All rights reserved.
</p>
<p class="text-gray-500 text-xs mt-2">
Version <span id="app-version"></span>
</p>
</div>
<div>
<h3 class="font-bold text-white mb-4">Company</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/about.html" class="hover:text-indigo-400">About Us</a>
</li>
<li><a href="/faq.html" class="hover:text-indigo-400">FAQ</a></li>
<li>
<a href="/contact.html" class="hover:text-indigo-400"
>Contact Us</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/licensing.html" class="hover:text-indigo-400"
>Licensing</a
>
</li>
<li>
<a href="/terms.html" class="hover:text-indigo-400"
>Terms and Conditions</a
>
</li>
<li>
<a href="/privacy.html" class="hover:text-indigo-400"
>Privacy Policy</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Follow Us</h3>
<div class="flex justify-center md:justify-start space-x-4">
<a
href="https://github.com/nicholaschen09/BentoPDF"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="GitHub"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"
/>
</svg>
</a>
<a
href="https://discord.gg/Bgq3Ay3f2w"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="Discord"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"
/>
</svg>
</a>
<a
href="https://www.instagram.com/thebentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="Instagram"
><i data-lucide="instagram"></i
></a>
<a
href="https://www.linkedin.com/company/bentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="LinkedIn"
><i data-lucide="linkedin"></i
></a>
<a
href="https://x.com/BentoPDF"
class="text-gray-400 hover:text-indigo-400"
title="X (Twitter)"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
/>
</svg>
</a>
</div>
</div>
</div>
</div>
</footer>
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/utils/full-width.ts"></script>
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
<script type="module" src="/src/version.ts"></script>
<script type="module" src="/src/js/logic/rotate-pdf-page.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module" src="/src/js/main.ts"></script>
<!-- JSON-LD Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Rotate PDF - BentoPDF",
"applicationCategory": "PDF Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"ratingCount": "4745"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to rotate online",
"description": "Learn how to rotate using BentoPDF",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Upload File",
"text": "Click or drag and drop your file"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Process",
"text": "Click the process button"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Download",
"text": "Download your processed file"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.bentopdf.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Rotate PDF",
"item": "https://www.bentopdf.com/rotate-pdf"
}
]
}
</script>
</body>
</html>

View File

@@ -1,873 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Primary Meta Tags -->
<title>Split PDF Online Free - Split PDF Tool | BentoPDF</title>
<meta
name="title"
content="Split PDF Online Free - Split PDF Tool | BentoPDF"
/>
<meta
name="description"
content="★ Split PDF online free - Split PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
name="keywords"
content="split pdf, divide pdf, extract pages, separate pdf"
/>
<meta name="author" content="BentoPDF" />
<meta
name="robots"
content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
/>
<!-- Canonical URL -->
<link rel="canonical" href="https://www.bentopdf.com/split-pdf" />
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/split-pdf" />
<meta
property="og:title"
content="Split PDF Online Free - Split PDF Tool | BentoPDF"
/>
<meta
property="og:description"
content="★ Split PDF online free - Split PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-split-pdf.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:site_name" content="BentoPDF" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/split-pdf" />
<meta name="twitter:title" content="Split PDF Free" />
<meta
name="twitter:description"
content="★ Split PDF online free - Split PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & se"
/>
<meta
name="twitter:image"
content="https://www.bentopdf.com/images/twitter-split-pdf.png"
/>
<meta name="twitter:site" content="@BentoPDF" />
<!-- Mobile Web App -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Split PDF" />
<title>Split PDF - BentoPDF</title>
<meta
name="description"
content="Extract pages from a PDF using various methods. Free, secure, and runs entirely in your browser."
/>
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/split-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/split-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/split-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/split-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />
</head>
<body class="antialiased bg-gray-900">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16">
<div
class="flex-shrink-0 flex items-center cursor-pointer"
id="home-logo"
>
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-8 w-8"
/>
<span class="text-white font-bold text-xl ml-2">
<a href="/">BentoPDF</a>
</span>
</div>
<!-- Desktop Navigation -->
<div class="hidden md:flex items-center space-x-8 text-white">
<a href="/" class="nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="nav-link" data-i18n="nav.about"
>About</a
>
<a href="/contact.html" class="nav-link" data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="nav-link" data-i18n="nav.allTools">All Tools</a>
</div>
<!-- Mobile Hamburger Button -->
<div class="md:hidden flex items-center">
<button
id="mobile-menu-button"
type="button"
class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500 transition-colors"
aria-controls="mobile-menu"
aria-expanded="false"
>
<span class="sr-only">Open main menu</span>
<!-- Hamburger Icon -->
<svg
id="menu-icon"
class="block h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4 6h16M4 12h16M4 18h16"
/>
</svg>
<!-- Close Icon -->
<svg
id="close-icon"
class="hidden h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
</div>
</div>
<!-- Mobile Menu Dropdown -->
<div
id="mobile-menu"
class="hidden md:hidden bg-gray-800 border-t border-gray-700"
>
<div class="px-2 pt-2 pb-3 space-y-1 text-center">
<a href="/" class="mobile-nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="mobile-nav-link" data-i18n="nav.about"
>About</a
>
<a
href="/contact.html"
class="mobile-nav-link"
data-i18n="nav.contact"
>Contact</a
>
<a href="/" class="mobile-nav-link" data-i18n="nav.allTools"
>All Tools</a
>
</div>
</div>
</nav>
<div
id="uploader"
class="min-h-screen flex flex-col items-center justify-start py-12 p-4 bg-gray-900"
>
<div
id="tool-uploader"
class="bg-gray-800 rounded-xl shadow-xl px-4 py-8 md:p-8 max-w-2xl w-full text-gray-200 border border-gray-700"
>
<button
id="back-to-tools"
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 mb-6 font-semibold"
>
<i data-lucide="arrow-left" class="cursor-pointer"></i>
<span class="cursor-pointer" data-i18n="tools.backToTools">
Back to Tools
</span>
</button>
<h1
class="text-2xl font-bold text-white mb-2"
data-i18n="tools:splitPdf.name"
>
Split PDF Online Free - Extract Pages Easily
</h1>
<p class="text-gray-400 mb-6" data-i18n="tools:splitPdf.subtitle">
Extract pages from a PDF using various methods.
</p>
<!-- Drop Zone for Main PDF Upload -->
<div
id="drop-zone"
class="relative flex flex-col items-center justify-center w-full h-48 md:h-64 border-2 border-dashed border-gray-600 rounded-xl cursor-pointer bg-gray-900 hover:bg-gray-700 transition-colors duration-300"
>
<div class="flex flex-col items-center justify-center pt-5 pb-6">
<i
data-lucide="upload-cloud"
class="w-10 h-10 mb-3 text-gray-400"
></i>
<p class="mb-2 text-sm text-gray-400">
<span class="font-semibold" data-i18n="upload.clickToSelect"
>Click to select a file</span
>
<span data-i18n="upload.orDragAndDrop">or drag and drop</span>
</p>
<p class="text-xs text-gray-500">A single PDF file</p>
<p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave">
Your files never leave your device.
</p>
</div>
<input
id="file-input"
type="file"
class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
accept="application/pdf"
/>
</div>
<div id="file-display-area" class="mt-4 space-y-2"></div>
<div id="split-options" class="hidden mt-6">
<label
for="split-mode"
class="block mb-2 text-sm font-medium text-gray-300"
>Split Mode</label
>
<select
id="split-mode"
class="w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2.5 mb-4"
>
<option value="range">Extract by Page Range (Default)</option>
<option value="even-odd">Split by Even/Odd Pages</option>
<option value="all">Split All Pages into Separate Files</option>
<option value="visual">Select Pages Visually</option>
<option value="bookmarks">Split by Bookmarks</option>
<option value="n-times">Split N Times</option>
</select>
<div id="range-panel">
<div class="p-3 bg-gray-900 rounded-lg border border-gray-700 mb-3">
<p class="text-sm text-gray-300">
<strong class="text-white">How it works:</strong>
</p>
<ul
class="list-disc list-inside text-xs text-gray-400 mt-1 space-y-1"
>
<li>
Enter page numbers separated by commas (e.g., 2, 8, 14).
</li>
<li>Enter page ranges using a hyphen (e.g., 5-10).</li>
<li>
Combine them for complex selections (e.g., 1-3, 7, 12-15).
</li>
</ul>
</div>
<label
for="page-range"
class="block mb-2 text-sm font-medium text-gray-300"
>Page Range</label
>
<input
type="text"
id="page-range"
class="bg-gray-700 border border-gray-600 text-white text-sm rounded-lg focus:ring-indigo-500 focus:border-indigo-500 block w-full p-2.5"
placeholder="e.g. 1-5, 8, 11-13"
/>
</div>
<div id="even-odd-panel" class="hidden">
<div class="p-3 bg-gray-900 rounded-lg border border-gray-700 mb-3">
<p class="text-sm text-gray-300">
<strong class="text-white">How it works:</strong>
</p>
<ul
class="list-disc list-inside text-xs text-gray-400 mt-1 space-y-1"
>
<li>
Extract all even pages (2, 4, 6...) or all odd pages (1, 3,
5...) into a new PDF.
</li>
</ul>
</div>
<div class="flex items-center mb-4">
<input
id="split-even"
type="radio"
value="even"
name="even-odd-choice"
class="w-4 h-4 text-indigo-600 bg-gray-700 border-gray-600 focus:ring-indigo-600 ring-offset-gray-800 focus:ring-2"
/>
<label
for="split-even"
class="ml-2 text-sm font-medium text-gray-300"
>Even Pages</label
>
</div>
<div class="flex items-center">
<input
id="split-odd"
type="radio"
value="odd"
name="even-odd-choice"
class="w-4 h-4 text-indigo-600 bg-gray-700 border-gray-600 focus:ring-indigo-600 ring-offset-gray-800 focus:ring-2"
/>
<label
for="split-odd"
class="ml-2 text-sm font-medium text-gray-300"
>Odd Pages</label
>
</div>
</div>
<div id="all-pages-panel" class="hidden">
<div class="p-3 bg-gray-900 rounded-lg border border-gray-700 mb-3">
<p class="text-sm text-gray-300">
<strong class="text-white">How it works:</strong>
</p>
<ul
class="list-disc list-inside text-xs text-gray-400 mt-1 space-y-1"
>
<li>
Every single page of the PDF will be saved as a separate PDF
file.
</li>
<li>
The result will be downloaded as a ZIP file containing all the
pages.
</li>
</ul>
</div>
</div>
<div id="visual-select-panel" class="hidden">
<div class="p-3 bg-gray-900 rounded-lg border border-gray-700 mb-3">
<p class="text-sm text-gray-300">
<strong class="text-white">How it works:</strong>
</p>
<ul
class="list-disc list-inside text-xs text-gray-400 mt-1 space-y-1"
>
<li>
Click on the page thumbnails below to select the pages you
want to extract.
</li>
<li>Selected pages will be highlighted.</li>
</ul>
</div>
<div
id="page-selector-grid"
class="grid grid-cols-3 sm:grid-cols-4 md:grid-cols-6 gap-4 max-h-96 overflow-y-auto p-2 border border-gray-700 rounded-lg"
>
<!-- Thumbnails will be rendered here -->
</div>
</div>
<div id="bookmarks-panel" class="hidden">
<div class="p-3 bg-gray-900 rounded-lg border border-gray-700 mb-3">
<p class="text-sm text-gray-300">
<strong class="text-white">How it works:</strong>
</p>
<ul
class="list-disc list-inside text-xs text-gray-400 mt-1 space-y-1"
>
<li>Split the PDF based on its bookmarks (outline).</li>
<li>Select the bookmark level to split at.</li>
</ul>
</div>
<label
for="bookmark-level"
class="block mb-2 text-sm font-medium text-gray-300"
>Bookmark Level</label
>
<select
id="bookmark-level"
class="w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2.5 mb-4"
>
<option value="all" selected>All Levels</option>
<option value="0">Level 0 (Top Level Only)</option>
<option value="1">Level 1</option>
<option value="2">Level 2</option>
<option value="3">Level 3</option>
</select>
</div>
<div id="n-times-panel" class="hidden">
<div class="p-3 bg-gray-900 rounded-lg border border-gray-700 mb-3">
<p class="text-sm text-gray-300">
<strong class="text-white">How it works:</strong>
</p>
<ul
class="list-disc list-inside text-xs text-gray-400 mt-1 space-y-1"
>
<li>
Split the PDF into multiple files, each containing N pages.
</li>
</ul>
</div>
<label
for="split-n-value"
class="block mb-2 text-sm font-medium text-gray-300"
>Pages per file (N)</label
>
<input
type="number"
id="split-n-value"
min="1"
value="5"
class="bg-gray-700 border border-gray-600 text-white text-sm rounded-lg focus:ring-indigo-500 focus:border-indigo-500 block w-full p-2.5"
/>
<p id="n-times-warning" class="mt-2 text-sm text-yellow-400 hidden">
<i
data-lucide="alert-triangle"
class="inline-block w-4 h-4 mr-1"
></i>
<span id="n-times-warning-text"></span>
</p>
</div>
<div id="zip-option-wrapper" class="mt-4 flex items-center">
<input
id="download-as-zip"
type="checkbox"
class="w-4 h-4 text-indigo-600 bg-gray-700 border-gray-600 rounded focus:ring-indigo-600 ring-offset-gray-800 focus:ring-2"
/>
<label
for="download-as-zip"
class="ml-2 text-sm font-medium text-gray-300"
>Download as ZIP (for multiple files)</label
>
</div>
<button id="process-btn" class="btn-gradient w-full mt-6">
Split PDF
</button>
</div>
</div>
</div>
<!-- Loader Modal -->
<div
id="loader-modal"
class="hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50"
>
<div
class="bg-gray-800 p-8 rounded-lg flex flex-col items-center gap-4 border border-gray-700 shadow-xl"
>
<div class="solid-spinner"></div>
<p id="loader-text" class="text-white text-lg font-medium">
Processing...
</p>
</div>
</div>
<!-- Alert Modal -->
<div
id="alert-modal"
class="fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50 hidden"
>
<div
class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700"
>
<h3
id="alert-title"
class="text-xl font-bold text-white mb-2"
data-i18n="alert.title"
data-i18n="alert.title"
>
Alert
</h3>
<p id="alert-message" class="text-gray-300 mb-6"></p>
<button
id="alert-ok"
class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded-lg transition-colors duration-200"
>
OK
</button>
</div>
</div>
<!-- How It Works Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-8 text-center">
How It Works
</h2>
<div class="space-y-6">
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
1
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Upload PDF</h3>
<p class="text-gray-400">
Select the PDF file you want to split or extract pages from
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
2
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">
Choose Split Method
</h3>
<p class="text-gray-400">
Select specific pages, page ranges, or split into individual pages
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
3
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">
Preview & Select
</h3>
<p class="text-gray-400">
View page thumbnails and select exactly which pages you want
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
4
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">
Split & Download
</h3>
<p class="text-gray-400">
Download extracted pages as separate PDFs or as a ZIP file
</p>
</div>
</div>
</div>
</section>
<!-- Related Tools Section -->
<section class="max-w-6xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Related PDF Tools
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a
href="/merge-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Merge Pdf</h3>
<p class="text-gray-400 text-sm">Free online merge pdf tool</p>
</a>
<a
href="/extract-pages"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Extract Pages</h3>
<p class="text-gray-400 text-sm">Free online extract pages tool</p>
</a>
<a
href="/organize-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Organize Pdf</h3>
<p class="text-gray-400 text-sm">Free online organize pdf tool</p>
</a>
<a
href="/compress-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Compress Pdf</h3>
<p class="text-gray-400 text-sm">Free online compress pdf tool</p>
</a>
<a
href="/delete-pages"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Delete Pages</h3>
<p class="text-gray-400 text-sm">Free online delete pages tool</p>
</a>
</div>
</section>
<!-- FAQ Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Frequently Asked Questions
</h2>
<div class="space-y-4">
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Can I extract specific page ranges?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Yes! You can extract any specific pages or page ranges from your
PDF. Select exactly which pages you need or split into individual
files.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Will split PDFs lose quality?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
No! Split PDFs maintain the exact same quality as the original
document. No compression or quality loss occurs.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Can I split multiple PDFs at once?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Yes, process multiple PDFs in batches for efficient document
management.
</p>
</details>
</div>
</section>
<footer class="mt-16 border-t-2 border-gray-700 py-8">
<div class="container mx-auto px-4">
<div
class="grid grid-cols-1 md:grid-cols-4 gap-8 text-center md:text-left"
>
<div class="mb-8 md:mb-0">
<div class="flex items-center justify-center md:justify-start mb-4">
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-10 w-10 mr-3"
/>
<span class="text-xl font-bold text-white">BentoPDF</span>
</div>
<p class="text-gray-400 text-sm">
&copy; 2026 BentoPDF. All rights reserved.
</p>
<p class="text-gray-500 text-xs mt-2">
Version <span id="app-version"></span>
</p>
</div>
<div>
<h3 class="font-bold text-white mb-4">Company</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/about.html" class="hover:text-indigo-400">About Us</a>
</li>
<li>
<a href="/faq.html" class="hover:text-indigo-400">FAQ</a>
</li>
<li>
<a href="/contact.html" class="hover:text-indigo-400"
>Contact Us</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/licensing.html" class="hover:text-indigo-400"
>Licensing</a
>
</li>
<li>
<a href="/terms.html" class="hover:text-indigo-400"
>Terms and Conditions</a
>
</li>
<li>
<a href="/privacy.html" class="hover:text-indigo-400"
>Privacy Policy</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Follow Us</h3>
<div class="flex justify-center md:justify-start space-x-4">
<a
href="https://github.com/alam00000/bentopdf"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="GitHub"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"
/>
</svg>
</a>
<a
href="https://discord.gg/Bgq3Ay3f2w"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="Discord"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"
/>
</svg>
</a>
<a
href="https://www.instagram.com/thebentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="Instagram"
>
<i data-lucide="instagram"></i>
</a>
<a
href="https://www.linkedin.com/company/bentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="LinkedIn"
>
<i data-lucide="linkedin"></i>
</a>
<a
href="https://x.com/BentoPDF"
class="text-gray-400 hover:text-indigo-400"
title="X (Twitter)"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
/>
</svg>
</a>
</div>
</div>
</div>
</div>
</footer>
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/utils/full-width.ts"></script>
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
<script type="module" src="/src/version.ts"></script>
<script type="module" src="/src/js/logic/split-pdf-page.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module" src="/src/js/main.ts"></script>
<!-- JSON-LD Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Split PDF - BentoPDF",
"applicationCategory": "PDF Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"ratingCount": "3584"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to split online",
"description": "Learn how to split using BentoPDF",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Upload File",
"text": "Click or drag and drop your file"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Process",
"text": "Click the process button"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Download",
"text": "Download your processed file"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.bentopdf.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Split PDF",
"item": "https://www.bentopdf.com/split-pdf"
}
]
}
</script>
</body>
</html>

View File

@@ -1,678 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Primary Meta Tags -->
<title>Word to PDF Converter Free Online - Convert Files | BentoPDF</title>
<meta
name="title"
content="Word to PDF Converter Free Online - Convert Files | BentoPDF"
/>
<meta
name="description"
content="★ Word to PDF online free - Convert Word to PDF PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
name="keywords"
content="word to pdf, docx to pdf, convert word, doc to pdf"
/>
<meta name="author" content="BentoPDF" />
<meta
name="robots"
content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
/>
<!-- Canonical URL -->
<link rel="canonical" href="https://www.bentopdf.com/word-to-pdf" />
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/word-to-pdf" />
<meta
property="og:title"
content="Word to PDF Converter Free Online - Convert Files | BentoPDF"
/>
<meta
property="og:description"
content="★ Word to PDF online free - Convert Word to PDF PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-word-to-pdf.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:site_name" content="BentoPDF" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/word-to-pdf" />
<meta name="twitter:title" content="Word to PDF Free" />
<meta
name="twitter:description"
content="★ Word to PDF online free - Convert Word to PDF PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in bro"
/>
<meta
name="twitter:image"
content="https://www.bentopdf.com/images/twitter-word-to-pdf.png"
/>
<meta name="twitter:site" content="@BentoPDF" />
<!-- Mobile Web App -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Word to PDF" />
<title>Word to PDF - Convert DOCX, DOC to PDF - BentoPDF</title>
<meta
name="description"
content="Convert Word documents (DOCX, DOC, ODT, RTF) to PDF format. Free, secure, and runs entirely in your browser."
/>
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/word-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/word-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/word-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/word-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />
</head>
<body class="antialiased bg-gray-900">
<nav class="bg-gray-800 border-b border-gray-700 sticky top-0 z-30">
<div class="container mx-auto px-4">
<div class="flex justify-between items-center h-16">
<div
class="flex-shrink-0 flex items-center cursor-pointer"
id="home-logo"
>
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-8 w-8"
/>
<span class="text-white font-bold text-xl ml-2">
<a href="/">BentoPDF</a>
</span>
</div>
<div class="hidden md:flex items-center space-x-8 text-white">
<a href="/" class="nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="nav-link">About</a>
<a href="/contact.html" class="nav-link">Contact</a>
<a href="/" class="nav-link" data-i18n="nav.allTools">All Tools</a>
</div>
<div class="md:hidden flex items-center">
<button
id="mobile-menu-button"
type="button"
class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500 transition-colors"
aria-controls="mobile-menu"
aria-expanded="false"
>
<span class="sr-only">Open main menu</span>
<svg
id="menu-icon"
class="block h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4 6h16M4 12h16M4 18h16"
/>
</svg>
<svg
id="close-icon"
class="hidden h-6 w-6"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
</div>
</div>
<div
id="mobile-menu"
class="hidden md:hidden bg-gray-800 border-t border-gray-700"
>
<div class="px-2 pt-2 pb-3 space-y-1 text-center">
<a href="/" class="mobile-nav-link" data-i18n="nav.home">Home</a>
<a href="/about.html" class="mobile-nav-link">About</a>
<a href="/contact.html" class="mobile-nav-link">Contact</a>
<a href="/" class="mobile-nav-link" data-i18n="nav.allTools"
>All Tools</a
>
</div>
</div>
</nav>
<div
id="uploader"
class="min-h-screen flex flex-col items-center justify-start py-12 p-4 bg-gray-900"
>
<div
id="tool-uploader"
class="bg-gray-800 rounded-xl shadow-xl px-4 py-8 md:p-8 max-w-2xl w-full text-gray-200 border border-gray-700"
>
<button
id="back-to-tools"
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 mb-6 font-semibold"
>
<i data-lucide="arrow-left" class="cursor-pointer"></i>
<span class="cursor-pointer" data-i18n="tools.backToTools">
Back to Tools
</span>
</button>
<h1
class="text-2xl font-bold text-white mb-2"
data-i18n="tools:wordToPdf.name"
>
Word to PDF Converter Free Online - Convert DOCX Fast
</h1>
<p class="text-gray-400 mb-6" data-i18n="tools:wordToPdf.subtitle">
Convert Word documents (DOCX, DOC, ODT, RTF) to PDF format. Supports
multiple files.
</p>
<div
id="drop-zone"
class="relative flex flex-col items-center justify-center w-full h-48 md:h-64 border-2 border-dashed border-gray-600 rounded-xl cursor-pointer bg-gray-900 hover:bg-gray-700 transition-colors duration-300"
>
<div class="flex flex-col items-center justify-center pt-5 pb-6">
<i
data-lucide="upload-cloud"
class="w-10 h-10 mb-3 text-gray-400"
></i>
<p class="mb-2 text-sm text-gray-400">
<span class="font-semibold" data-i18n="upload.clickToSelect"
>Click to select files</span
>
<span data-i18n="upload.orDragAndDrop">or drag and drop</span>
</p>
<p
class="text-xs text-gray-500"
data-i18n="tools:wordToPdf.acceptedFormats"
>
DOCX, DOC, ODT, RTF files
</p>
<p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave">
Your files never leave your device.
</p>
</div>
<input
id="file-input"
type="file"
class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
accept=".doc,.docx,.odt,.rtf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.oasis.opendocument.text,text/rtf,application/rtf"
multiple
/>
</div>
<div class="flex items-center gap-2 text-gray-500 text-xs mt-4">
<i data-lucide="info" class="w-4 h-4 flex-shrink-0"></i>
<p data-i18n="tools.firstLoadNotice">
First load takes a moment as we download our conversion engine.
After that, all loads will be instant.
</p>
</div>
<div id="file-controls" class="hidden mt-4 flex gap-3">
<button
id="add-more-btn"
class="btn bg-indigo-600 hover:bg-indigo-700 text-white font-semibold px-4 py-2 rounded-lg flex items-center gap-2"
>
<i data-lucide="plus"></i>
<span data-i18n="upload.addMore">Add More Files</span>
</button>
<button
id="clear-files-btn"
class="btn bg-gray-700 hover:bg-gray-600 text-white font-semibold px-4 py-2 rounded-lg flex items-center gap-2"
>
<i data-lucide="trash-2"></i>
<span data-i18n="upload.clearAll">Clear All</span>
</button>
</div>
<div id="file-display-area" class="mt-4 space-y-2"></div>
<div id="convert-options" class="hidden mt-6">
<button
id="process-btn"
class="btn-gradient w-full"
data-i18n="tools:wordToPdf.convertButton"
>
Convert to PDF
</button>
</div>
</div>
</div>
<div
id="loader-modal"
class="hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50"
>
<div
class="bg-gray-800 p-8 rounded-lg flex flex-col items-center gap-4 border border-gray-700 shadow-xl"
>
<div class="solid-spinner"></div>
<p id="loader-text" class="text-white text-lg font-medium">
Processing...
</p>
</div>
</div>
<div
id="alert-modal"
class="fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50 hidden"
>
<div
class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700"
>
<h3
id="alert-title"
class="text-xl font-bold text-white mb-2"
data-i18n="alert.title"
>
Alert
</h3>
<p id="alert-message" class="text-gray-300 mb-6"></p>
<button
id="alert-ok"
class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded-lg transition-colors duration-200"
>
OK
</button>
</div>
</div>
<!-- How It Works Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-8 text-center">
How It Works
</h2>
<div class="space-y-6">
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
1
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">
Upload Word Files
</h3>
<p class="text-gray-400">
Select or drag DOCX or DOC files you want to convert
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
2
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Auto Convert</h3>
<p class="text-gray-400">
Conversion starts automatically, processing in your browser
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
3
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">
Preview Results
</h3>
<p class="text-gray-400">
See your converted PDF with preserved formatting
</p>
</div>
</div>
<div class="flex items-start gap-4">
<div
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
>
4
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Download PDFs</h3>
<p class="text-gray-400">
Save your PDF files - formatting perfectly preserved
</p>
</div>
</div>
</div>
</section>
<!-- Related Tools Section -->
<section class="max-w-6xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Related PDF Tools
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a
href="/pdf-to-docx"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Pdf To Docx</h3>
<p class="text-gray-400 text-sm">Free online pdf to docx tool</p>
</a>
<a
href="/excel-to-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Excel To Pdf</h3>
<p class="text-gray-400 text-sm">Free online excel to pdf tool</p>
</a>
<a
href="/powerpoint-to-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Powerpoint To Pdf</h3>
<p class="text-gray-400 text-sm">
Free online powerpoint to pdf tool
</p>
</a>
<a
href="/txt-to-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Txt To Pdf</h3>
<p class="text-gray-400 text-sm">Free online txt to pdf tool</p>
</a>
<a
href="/merge-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Merge Pdf</h3>
<p class="text-gray-400 text-sm">Free online merge pdf tool</p>
</a>
</div>
</section>
<!-- FAQ Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2 class="text-2xl md:text-3xl font-bold text-white mb-6 text-center">
Frequently Asked Questions
</h2>
<div class="space-y-4">
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Does it work with both .doc and .docx files?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Yes! BentoPDF supports both older .doc and newer .docx Microsoft
Word formats.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Will formatting be preserved?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
Yes! Fonts, images, tables, headers, footers, and all formatting are
preserved exactly as they appear in Word.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Can I convert password-protected Word files?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
You'll need to unlock password-protected files first before
converting them to PDF.
</p>
</details>
</div>
</section>
<footer class="mt-16 border-t-2 border-gray-700 py-8">
<div class="container mx-auto px-4">
<div
class="grid grid-cols-1 md:grid-cols-4 gap-8 text-center md:text-left"
>
<div class="mb-8 md:mb-0">
<div class="flex items-center justify-center md:justify-start mb-4">
<img
src="/images/favicon-no-bg.svg"
alt="Bento PDF Logo"
class="h-10 w-10 mr-3"
/>
<span class="text-xl font-bold text-white">BentoPDF</span>
</div>
<p class="text-gray-400 text-sm">
&copy; 2026 BentoPDF. All rights reserved.
</p>
<p class="text-gray-500 text-xs mt-2">
Version <span id="app-version"></span>
</p>
</div>
<div>
<h3 class="font-bold text-white mb-4">Company</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/about.html" class="hover:text-indigo-400">About Us</a>
</li>
<li>
<a href="/faq.html" class="hover:text-indigo-400">FAQ</a>
</li>
<li>
<a href="/contact.html" class="hover:text-indigo-400"
>Contact Us</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Legal</h3>
<ul class="space-y-2 text-gray-400">
<li>
<a href="/licensing.html" class="hover:text-indigo-400"
>Licensing</a
>
</li>
<li>
<a href="/terms.html" class="hover:text-indigo-400"
>Terms and Conditions</a
>
</li>
<li>
<a href="/privacy.html" class="hover:text-indigo-400"
>Privacy Policy</a
>
</li>
</ul>
</div>
<div>
<h3 class="font-bold text-white mb-4">Follow Us</h3>
<div class="flex justify-center md:justify-start space-x-4">
<a
href="https://github.com/alam00000/bentopdf"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="GitHub"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"
/>
</svg>
</a>
<a
href="https://discord.gg/Bgq3Ay3f2w"
target="_blank"
rel="noopener noreferrer"
class="text-gray-400 hover:text-indigo-400"
title="Discord"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"
/>
</svg>
</a>
<a
href="https://www.instagram.com/thebentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="Instagram"
>
<i data-lucide="instagram"></i>
</a>
<a
href="https://www.linkedin.com/company/bentopdf/"
class="text-gray-400 hover:text-indigo-400"
title="LinkedIn"
>
<i data-lucide="linkedin"></i>
</a>
<a
href="https://x.com/BentoPDF"
class="text-gray-400 hover:text-indigo-400"
title="X (Twitter)"
>
<svg
class="w-6 h-6"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"
/>
</svg>
</a>
</div>
</div>
</div>
</div>
</footer>
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/utils/full-width.ts"></script>
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
<script type="module" src="/src/version.ts"></script>
<script type="module" src="/src/js/logic/word-to-pdf-page.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module" src="/src/js/main.ts"></script>
<!-- JSON-LD Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Word to PDF - BentoPDF",
"applicationCategory": "PDF Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"ratingCount": "4950"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to convert Word to PDF online",
"description": "Learn how to convert Word to PDF using BentoPDF",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Upload File",
"text": "Click or drag and drop your file"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Process",
"text": "Click the process button"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Download",
"text": "Download your processed file"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.bentopdf.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Word to PDF",
"item": "https://www.bentopdf.com/word-to-pdf"
}
]
}
</script>
</body>
</html>

View File

@@ -5,18 +5,20 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Primary Meta Tags --> <!-- Primary Meta Tags -->
<title>Excel to PDF Converter Free Online - Convert Files | BentoPDF</title> <title>
Email to PDF Converter Free Online - EML MSG to PDF | BentoPDF
</title>
<meta <meta
name="title" name="title"
content="Excel to PDF Converter Free Online - Convert Files | BentoPDF" content="Email to PDF Converter Free Online - EML MSG to PDF | BentoPDF"
/> />
<meta <meta
name="description" name="description"
content="★ Excel to PDF online free - Convert Excel to PDF PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure" content="★ Convert Email to PDF online free - EML to PDF, MSG to PDF ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/> />
<meta <meta
name="keywords" name="keywords"
content="excel to pdf, xlsx to pdf, spreadsheet to pdf" content="email to pdf, eml to pdf, msg to pdf, outlook email to pdf, convert email, email converter"
/> />
<meta name="author" content="BentoPDF" /> <meta name="author" content="BentoPDF" />
<meta <meta
@@ -25,22 +27,22 @@
/> />
<!-- Canonical URL --> <!-- Canonical URL -->
<link rel="canonical" href="https://www.bentopdf.com/excel-to-pdf" /> <link rel="canonical" href="https://www.bentopdf.com/email-to-pdf.html" />
<!-- Open Graph / Facebook / LinkedIn --> <!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/excel-to-pdf" /> <meta property="og:url" content="https://www.bentopdf.com/email-to-pdf" />
<meta <meta
property="og:title" property="og:title"
content="Excel to PDF Converter Free Online - Convert Files | BentoPDF" content="Email to PDF Converter Free Online - EML MSG to PDF | BentoPDF"
/> />
<meta <meta
property="og:description" property="og:description"
content="★ Excel to PDF online free - Convert Excel to PDF PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure" content="★ Convert Email to PDF online free - EML to PDF, MSG to PDF ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
/> />
<meta <meta
property="og:image" property="og:image"
content="https://www.bentopdf.com/images/og-excel-to-pdf.png" content="https://www.bentopdf.com/images/og-email-to-pdf.png"
/> />
<meta property="og:image:width" content="1200" /> <meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" /> <meta property="og:image:height" content="630" />
@@ -48,35 +50,54 @@
<!-- Twitter Card --> <!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/excel-to-pdf" /> <meta name="twitter:url" content="https://www.bentopdf.com/email-to-pdf" />
<meta name="twitter:title" content="Excel to PDF Free" /> <meta name="twitter:title" content="Email to PDF Free" />
<meta <meta
name="twitter:description" name="twitter:description"
content="★ Excel to PDF online free - Convert Excel to PDF PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in b" content="★ Convert Email to PDF online free - EML to PDF, MSG to PDF ★ No signup ★ Privacy-first ★ Works in browser"
/> />
<meta <meta
name="twitter:image" name="twitter:image"
content="https://www.bentopdf.com/images/twitter-excel-to-pdf.png" content="https://www.bentopdf.com/images/twitter-email-to-pdf.png"
/> />
<meta name="twitter:site" content="@BentoPDF" /> <meta name="twitter:site" content="@BentoPDF" />
<!-- Mobile Web App --> <!-- Mobile Web App -->
<meta name="mobile-web-app-capable" content="yes" /> <meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Excel to PDF" /> <meta name="apple-mobile-web-app-title" content="Email to PDF" />
<title>Excel to PDF - Convert XLSX, XLS to PDF - BentoPDF</title> <title>Email to PDF - Convert EML/MSG to PDF - BentoPDF</title>
<meta <meta
name="description" name="description"
content="Convert Excel spreadsheets (XLSX, XLS, ODS, CSV) to PDF format. Free, secure, and runs entirely in your browser." content="Convert email files (EML, MSG) to PDF format. Free, secure, and runs entirely in your browser."
/> />
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/excel-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/excel-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/excel-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/excel-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" /> <link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />
<!-- Web App Manifest -->
<link rel="manifest" href="/site.webmanifest" />
<!-- Favicons -->
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" />
<link
rel="icon"
type="image/png"
sizes="192x192"
href="/images/favicon-192x192.png"
/>
<link
rel="icon"
type="image/png"
sizes="512x512"
href="/images/favicon-512x512.png"
/>
<link
rel="apple-touch-icon"
sizes="180x180"
href="/images/apple-touch-icon.png"
/>
<link rel="icon" href="/favicon.ico" sizes="32x32" />
</head> </head>
<body class="antialiased bg-gray-900"> <body class="antialiased bg-gray-900">
@@ -185,13 +206,13 @@
<h1 <h1
class="text-2xl font-bold text-white mb-2" class="text-2xl font-bold text-white mb-2"
data-i18n="tools:excelToPdf.name" data-i18n="tools:emailToPdf.name"
> >
Excel to PDF Converter Free - Convert XLSX Online Email to PDF Converter Free Online - Convert EML MSG Files
</h1> </h1>
<p class="text-gray-400 mb-6" data-i18n="tools:excelToPdf.subtitle"> <p class="text-gray-400 mb-6" data-i18n="tools:emailToPdf.subtitle">
Convert Excel spreadsheets (XLSX, XLS, ODS, CSV) to PDF format. Convert email files (EML, MSG) to PDF format. Supports Outlook exports
Supports multiple files. and standard email formats.
</p> </p>
<div <div
@@ -211,9 +232,9 @@
</p> </p>
<p <p
class="text-xs text-gray-500" class="text-xs text-gray-500"
data-i18n="tools:excelToPdf.acceptedFormats" data-i18n="tools:emailToPdf.acceptedFormats"
> >
XLSX, XLS, ODS, CSV files EML, MSG files
</p> </p>
<p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave"> <p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave">
Your files never leave your device. Your files never leave your device.
@@ -223,7 +244,7 @@
id="file-input" id="file-input"
type="file" type="file"
class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer" class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
accept=".xls,.xlsx,.ods,.csv,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.oasis.opendocument.spreadsheet,text/csv" accept=".eml,.msg,message/rfc822,application/vnd.ms-outlook"
multiple multiple
/> />
</div> </div>
@@ -247,11 +268,63 @@
<div id="file-display-area" class="mt-4 space-y-2"></div> <div id="file-display-area" class="mt-4 space-y-2"></div>
<div id="convert-options" class="hidden mt-6"> <div id="convert-options" class="hidden mt-6 space-y-4">
<!-- Options Panel -->
<div class="bg-gray-700/50 rounded-lg p-4 space-y-4">
<h3
class="text-sm font-semibold text-gray-300 uppercase tracking-wide"
>
Conversion Options
</h3>
<!-- Page Size -->
<div class="flex items-center justify-between">
<label for="page-size" class="text-gray-300 text-sm"
>Page Size</label
>
<select
id="page-size"
class="bg-gray-700 border border-gray-600 rounded-lg px-3 py-2 text-gray-200 text-sm focus:ring-indigo-500 focus:border-indigo-500"
>
<option value="a4" selected>A4</option>
<option value="letter">Letter</option>
<option value="legal">Legal</option>
</select>
</div>
<!-- Include CC/BCC -->
<div class="flex items-center">
<input
type="checkbox"
id="include-cc-bcc"
checked
class="w-4 h-4 text-indigo-600 bg-gray-700 border-gray-600 rounded focus:ring-indigo-500"
/>
<label for="include-cc-bcc" class="ml-3 text-gray-300 text-sm"
>Include CC and BCC recipients in header</label
>
</div>
<!-- Include Attachments List -->
<div class="flex items-center">
<input
type="checkbox"
id="include-attachments"
checked
class="w-4 h-4 text-indigo-600 bg-gray-700 border-gray-600 rounded focus:ring-indigo-500"
/>
<label
for="include-attachments"
class="ml-3 text-gray-300 text-sm"
>Include email attachments list</label
>
</div>
</div>
<button <button
id="process-btn" id="process-btn"
class="btn-gradient w-full" class="btn-gradient w-full"
data-i18n="tools:excelToPdf.convertButton" data-i18n="tools:emailToPdf.convertButton"
> >
Convert to PDF Convert to PDF
</button> </button>
@@ -310,9 +383,11 @@
1 1
</div> </div>
<div class="flex-1"> <div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Upload File</h3> <h3 class="text-lg font-semibold text-white mb-1">
Upload Email File
</h3>
<p class="text-gray-400"> <p class="text-gray-400">
Click or drag and drop your file to begin Click or drag and drop your .eml or .msg file to begin
</p> </p>
</div> </div>
</div> </div>
@@ -324,7 +399,9 @@
</div> </div>
<div class="flex-1"> <div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Process</h3> <h3 class="text-lg font-semibold text-white mb-1">Process</h3>
<p class="text-gray-400">Click the process button to start</p> <p class="text-gray-400">
Click the convert button to generate your PDF
</p>
</div> </div>
</div> </div>
<div class="flex items-start gap-4"> <div class="flex items-start gap-4">
@@ -335,7 +412,7 @@
</div> </div>
<div class="flex-1"> <div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Download</h3> <h3 class="text-lg font-semibold text-white mb-1">Download</h3>
<p class="text-gray-400">Save your processed file instantly</p> <p class="text-gray-400">Save your converted PDF file instantly</p>
</div> </div>
</div> </div>
</div> </div>
@@ -348,40 +425,40 @@
</h2> </h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4"> <div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a <a
href="/pdf-to-excel" href="/merge-pdf.html"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700" class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
> >
<h3 class="text-white font-semibold mb-1">Pdf To Excel</h3> <h3 class="text-white font-semibold mb-1">Merge PDF</h3>
<p class="text-gray-400 text-sm">Free online pdf to excel tool</p>
</a>
<a
href="/word-to-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Word To Pdf</h3>
<p class="text-gray-400 text-sm">Free online word to pdf tool</p>
</a>
<a
href="/csv-to-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Csv To Pdf</h3>
<p class="text-gray-400 text-sm">Free online csv to pdf tool</p>
</a>
<a
href="/merge-pdf"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Merge Pdf</h3>
<p class="text-gray-400 text-sm">Free online merge pdf tool</p> <p class="text-gray-400 text-sm">Free online merge pdf tool</p>
</a> </a>
<a <a
href="/compress-pdf" href="/word-to-pdf.html"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700" class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
> >
<h3 class="text-white font-semibold mb-1">Compress Pdf</h3> <h3 class="text-white font-semibold mb-1">Word to PDF</h3>
<p class="text-gray-400 text-sm">Convert Word documents to PDF</p>
</a>
<a
href="/compress-pdf.html"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Compress PDF</h3>
<p class="text-gray-400 text-sm">Free online compress pdf tool</p> <p class="text-gray-400 text-sm">Free online compress pdf tool</p>
</a> </a>
<a
href="/txt-to-pdf.html"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Text to PDF</h3>
<p class="text-gray-400 text-sm">Convert text files to PDF</p>
</a>
<a
href="/edit-pdf.html"
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
>
<h3 class="text-white font-semibold mb-1">Edit PDF</h3>
<p class="text-gray-400 text-sm">Free online edit pdf tool</p>
</a>
</div> </div>
</section> </section>
@@ -395,7 +472,20 @@
<summary <summary
class="cursor-pointer font-semibold text-white flex items-center justify-between" class="cursor-pointer font-semibold text-white flex items-center justify-between"
> >
Is excel to pdf really free? What email formats are supported?
<i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary>
<p class="mt-3 text-gray-400">
BentoPDF supports both .eml (standard email format) and .msg
(Microsoft Outlook) files. These are the most common formats for
exported or saved emails.
</p>
</details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary
class="cursor-pointer font-semibold text-white flex items-center justify-between"
>
Is email to PDF conversion really free?
<i data-lucide="chevron-down" class="w-5 h-5"></i> <i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary> </summary>
<p class="mt-3 text-gray-400"> <p class="mt-3 text-gray-400">
@@ -407,24 +497,26 @@
<summary <summary
class="cursor-pointer font-semibold text-white flex items-center justify-between" class="cursor-pointer font-semibold text-white flex items-center justify-between"
> >
Are my files private and secure? Are my emails kept private?
<i data-lucide="chevron-down" class="w-5 h-5"></i> <i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary> </summary>
<p class="mt-3 text-gray-400"> <p class="mt-3 text-gray-400">
Absolutely! All processing happens in your browser. Your files never Absolutely! All processing happens in your browser. Your email files
leave your device, ensuring complete privacy. never leave your device, ensuring complete privacy for sensitive
communications.
</p> </p>
</details> </details>
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700"> <details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
<summary <summary
class="cursor-pointer font-semibold text-white flex items-center justify-between" class="cursor-pointer font-semibold text-white flex items-center justify-between"
> >
Is there a file size limit? What about email attachments?
<i data-lucide="chevron-down" class="w-5 h-5"></i> <i data-lucide="chevron-down" class="w-5 h-5"></i>
</summary> </summary>
<p class="mt-3 text-gray-400"> <p class="mt-3 text-gray-400">
No! Process files of any size, as many times as you want, completely The PDF displays a list of attachments at the bottom and also embeds
free. the actual files into the PDF. You can access them via the
Attachments panel in PDF readers like Adobe Reader or Foxit.
</p> </p>
</details> </details>
</div> </div>
@@ -569,7 +661,7 @@
<script type="module" src="/src/js/utils/full-width.ts"></script> <script type="module" src="/src/js/utils/full-width.ts"></script>
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script> <script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
<script type="module" src="/src/version.ts"></script> <script type="module" src="/src/version.ts"></script>
<script type="module" src="/src/js/logic/excel-to-pdf-page.ts"></script> <script type="module" src="/src/js/logic/email-to-pdf-page.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script> <script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module" src="/src/js/main.ts"></script> <script type="module" src="/src/js/main.ts"></script>
@@ -578,7 +670,7 @@
{ {
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "SoftwareApplication", "@type": "SoftwareApplication",
"name": "Excel to PDF - BentoPDF", "name": "Email to PDF - BentoPDF",
"applicationCategory": "PDF Tool", "applicationCategory": "PDF Tool",
"operatingSystem": "Any - Web Browser", "operatingSystem": "Any - Web Browser",
"offers": { "offers": {
@@ -588,8 +680,8 @@
}, },
"aggregateRating": { "aggregateRating": {
"@type": "AggregateRating", "@type": "AggregateRating",
"ratingValue": "4.9", "ratingValue": "4.7",
"ratingCount": "1436" "ratingCount": "2156"
} }
} }
</script> </script>
@@ -598,26 +690,26 @@
{ {
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "HowTo", "@type": "HowTo",
"name": "How to convert Excel to PDF online", "name": "How to convert email to PDF online",
"description": "Learn how to convert Excel to PDF using BentoPDF", "description": "Learn how to convert email files to PDF using BentoPDF",
"step": [ "step": [
{ {
"@type": "HowToStep", "@type": "HowToStep",
"position": 1, "position": 1,
"name": "Upload File", "name": "Upload Email File",
"text": "Click or drag and drop your file" "text": "Click or drag and drop your .eml or .msg file"
}, },
{ {
"@type": "HowToStep", "@type": "HowToStep",
"position": 2, "position": 2,
"name": "Process", "name": "Process",
"text": "Click the process button" "text": "Click the convert button"
}, },
{ {
"@type": "HowToStep", "@type": "HowToStep",
"position": 3, "position": 3,
"name": "Download", "name": "Download",
"text": "Download your processed file" "text": "Download your converted PDF file"
} }
] ]
} }
@@ -637,8 +729,8 @@
{ {
"@type": "ListItem", "@type": "ListItem",
"position": 2, "position": 2,
"name": "Excel to PDF", "name": "Email to PDF",
"item": "https://www.bentopdf.com/excel-to-pdf" "item": "https://www.bentopdf.com/email-to-pdf"
} }
] ]
} }

View File

@@ -418,6 +418,11 @@ export default defineConfig(({ mode }) => {
__dirname, __dirname,
'src/pages/digital-sign-pdf.html' 'src/pages/digital-sign-pdf.html'
), ),
'validate-signature-pdf': resolve(
__dirname,
'src/pages/validate-signature-pdf.html'
),
'email-to-pdf': resolve(__dirname, 'src/pages/email-to-pdf.html'),
}, },
}, },
}, },