< class="breadcumb-title text-anim" data-cue="slideInUp" data-delay="300">PDF Converters
All-in-One PDF Tool — Merge, Split, Compress, Convert, Edit, Sign | ASLI FORM

Merge PDF

Combine multiple PDF files into a single document. Drag and drop to reorder pages.

Drop PDF files here
or click to browse from your device
Processing...
Processing Complete!

Why Professionals Choose Our PDF Tool

Built with enterprise-grade security and premium design, our PDF toolkit meets the demands of lawyers, accountants, engineers, and businesses worldwide.

  • 100% Private & Secure Files never leave your device. All processing happens locally in your browser.
  • Works Offline No internet required after page load. Perfect for sensitive documents.
  • 50+ Operations Merge, split, compress, convert, edit, sign, protect — everything in one place.
  • Universal Compatibility Works on Windows, Mac, Linux, Android, iOS — any modern browser.
  • Free Forever No subscriptions, no limits, no ads, no hidden fees. Ever.
  • Instant Processing Real-time results with progress indicators. No waiting in queues.

Complete List of PDF Operations

Our all-in-one PDF tool supports 50+ operations organized into 8 categories. Click any operation in the sidebar to get started.

CategoryOperations

How to Use the PDF Tool

Our PDF toolkit is designed for simplicity and speed. Follow these steps to process your documents.

  • Select Operation Choose from 50+ PDF operations in the sidebar (Merge, Split, Compress, Convert, etc.)
  • Upload Files Drag and drop or browse to upload your PDF files from any device
  • Configure Options Set parameters like page range, quality, password, orientation, etc.
  • Process Click the action button — files are processed locally in your browser
  • Download Download your processed PDF instantly. Done!

Frequently Asked Questions

Yes, the ASLI FORM All-in-One PDF Tool is 100% free forever. There are no registration requirements, no usage limits, no subscription fees, and no hidden charges. We do not display advertisements and we do not collect any personal data. Our mission is to provide a premium PDF toolkit that everyone can use without barriers.
No. Absolutely not. All PDF processing happens entirely in your browser using JavaScript libraries (pdf-lib, PDF.js). Your files never leave your device, never touch our servers, and are never stored anywhere. This ensures complete privacy and security, making our tool ideal for sensitive documents like legal contracts, financial records, and medical files.
Yes. Once the page loads, all PDF operations work without internet connection. There is no server-side processing, no API calls, and no internet dependency. This makes the tool perfect for secure environments, remote locations, airplanes, and anywhere connectivity is limited.
We support 50+ PDF operations organized into 8 categories:
  • Organize: Merge, Split, Reorder, Delete, Extract pages
  • Optimize: Compress, Repair, Grayscale, Crop, Resize
  • Convert to PDF: Word, Excel, PowerPoint, JPG, PNG, HTML, Text, Markdown
  • Convert from PDF: Word, Excel, PowerPoint, JPG, PNG, HTML, Text, Markdown, ePub
  • Edit: Add text, images, annotations, watermarks, page numbers
  • Security: Password protect, Unlock, Remove password, Sign PDF
  • Advanced: Rotate, Flatten forms, PDF to PDF/A, Metadata editor, Bookmarks
  • Extract: Text, Images, Tables, Links
Since all processing happens in your browser, the limit depends on your device's available memory. Typically, the tool handles files up to 100-200MB smoothly. For very large files, we recommend using the compress tool first to reduce file size before performing other operations.
Our PDF tool works on all devices and operating systems:
  • Desktop: Windows, macOS, Linux
  • Mobile: Android, iOS, iPadOS
  • Browsers: Chrome, Firefox, Safari, Edge, Opera (any modern browser)
The interface is fully responsive and adapts to screen size automatically.
Several key features set us apart:
  • 100% client-side processing — your files never leave your device
  • No registration required — start using immediately
  • 50+ operations in one comprehensive toolkit
  • Works offline — no internet dependency
  • Zero tracking — complete privacy
  • Free forever — no subscriptions or limits
  • Premium design — professional, intuitive interface
Yes! You can upload multiple PDF files simultaneously for operations like merge, compress batch, and convert batch. For merge, you can also drag and drop to reorder files before processing. There's no limit on the number of files you can process in a single session.
Yes. Our tool uses industry-standard libraries (pdf-lib, PDF.js) that preserve original PDF quality including text, images, fonts, annotations, and metadata. For compression, you can choose quality levels to balance file size and quality according to your needs.
We welcome feedback from our users. You can reach our support team through:
  • Phone: +91-7011993433 (Mon-Sat, 9 AM to 7 PM IST)
  • WhatsApp: Same number with pre-filled message
  • Email: support@asliform.in
Our team reviews every piece of feedback and incorporates improvements regularly.
Yes! Our tool supports PDF password protection with both user passwords (required to open the PDF) and owner passwords (required to modify permissions). You can also set permissions like printing, copying, and editing restrictions. All encryption is done locally using industry-standard algorithms.
Yes. Our tool supports PDF signing in multiple ways:
  • Draw signature — draw your signature with mouse or touch
  • Type signature — type your name in a signature font
  • Upload signature — upload an image of your signature
Signatures are embedded directly into the PDF and can be placed on any page.

Need More Professional Tools?

Explore our complete suite of 150+ free tools including unit converters, calculators, code editors, and AI-powered utilities.

\n'; resultBlob = new Blob([html], { type: 'text/html' }); resultFilename = 'pdf-to-html.html'; }async function handleImgToPdf(op) { const orientation = document.getElementById('opt-orientation').value; const margin = parseInt(document.getElementById('opt-margin').value) || 10;updateProgress(20, 'Loading images...'); const { PDFDocument } = PDFLib; const pdf = await PDFDocument.create();for (let i = 0; i < uploadedFiles.length; i++) { const file = uploadedFiles[i]; const imgBytes = await file.arrayBuffer(); let img; if (file.type === 'image/png') { img = await pdf.embedPng(imgBytes); } else { img = await pdf.embedJpg(imgBytes); }const imgWidth = img.width; const imgHeight = img.height; let pageWidth, pageHeight; if (orientation === 'landscape') { pageWidth = Math.max(imgWidth, imgHeight) + margin * 2; pageHeight = Math.min(imgWidth, imgHeight) + margin * 2; } else if (orientation === 'portrait') { pageWidth = Math.min(imgWidth, imgHeight) + margin * 2; pageHeight = Math.max(imgWidth, imgHeight) + margin * 2; } else { pageWidth = imgWidth + margin * 2; pageHeight = imgHeight + margin * 2; }const page = pdf.addPage([pageWidth, pageHeight]); page.drawImage(img, { x: margin, y: margin, width: pageWidth - margin * 2, height: pageHeight - margin * 2 });updateProgress(20 + (70 * (i + 1) / uploadedFiles.length), `Processing image ${i + 1}...`); }updateProgress(90, 'Saving...'); const pdfBytes = await pdf.save(); resultBlob = new Blob([pdfBytes], { type: 'application/pdf' }); resultFilename = 'images-to-pdf.pdf'; }async function handleTxtToPdf(op) { const fontSize = parseInt(document.getElementById('opt-fontsize').value) || 12; const fontName = document.getElementById('opt-font').value;updateProgress(20, 'Loading text...'); const text = await uploadedFiles[0].text(); const { PDFDocument, StandardFonts, rgb } = PDFLib; const pdf = await PDFDocument.create(); const font = await pdf.embedFont( fontName === 'Courier' ? StandardFonts.Courier : fontName === 'Times-Roman' ? StandardFonts.TimesRoman : StandardFonts.Helvetica );updateProgress(50, 'Creating PDF...'); const lines = text.split('\n'); const pageHeight = 800; const pageWidth = 600; const margin = 50; const lineHeight = fontSize * 1.5; const maxCharsPerLine = Math.floor((pageWidth - margin * 2) / (fontSize * 0.6));let page = pdf.addPage([pageWidth, pageHeight]); let y = pageHeight - margin;lines.forEach(line => { while (line.length > maxCharsPerLine) { const chunk = line.substring(0, maxCharsPerLine); page.drawText(chunk, { x: margin, y, size: fontSize, font, color: rgb(0, 0, 0) }); y -= lineHeight; line = line.substring(maxCharsPerLine); if (y < margin) { page = pdf.addPage([pageWidth, pageHeight]); y = pageHeight - margin; } } page.drawText(line, { x: margin, y, size: fontSize, font, color: rgb(0, 0, 0) }); y -= lineHeight; if (y < margin) { page = pdf.addPage([pageWidth, pageHeight]); y = pageHeight - margin; } });updateProgress(90, 'Saving...'); const pdfBytes = await pdf.save(); resultBlob = new Blob([pdfBytes], { type: 'application/pdf' }); resultFilename = 'text-to-pdf.pdf'; }async function handleReorder(op) { const orderStr = document.getElementById('opt-order').value; if (!orderStr) throw new Error('Please specify page order');updateProgress(20, 'Loading PDF...'); const { PDFDocument } = PDFLib; const bytes = await uploadedFiles[0].arrayBuffer(); const pdf = await PDFDocument.load(bytes); const totalPages = pdf.getPageCount();const newOrder = orderStr.split(',').map(s => parseInt(s.trim()) - 1).filter(n => n >= 0 && n < totalPages); if (newOrder.length === 0) throw new Error('Invalid page order');updateProgress(50, 'Reordering...'); const newPdf = await PDFDocument.create(); const pages = await newPdf.copyPages(pdf, newOrder); pages.forEach(page => newPdf.addPage(page));updateProgress(90, 'Saving...'); const pdfBytes = await newPdf.save(); resultBlob = new Blob([pdfBytes], { type: 'application/pdf' }); resultFilename = 'reordered.pdf'; }async function handleDeletePages(op) { const pagesStr = document.getElementById('opt-pages').value; if (!pagesStr) throw new Error('Please specify pages to delete');updateProgress(20, 'Loading PDF...'); const { PDFDocument } = PDFLib; const bytes = await uploadedFiles[0].arrayBuffer(); const pdf = await PDFDocument.load(bytes); const totalPages = pdf.getPageCount();const toDelete = parsePageRange(pagesStr, totalPages); const toKeep = Array.from({length: totalPages}, (_, i) => i).filter(i => !toDelete.includes(i));if (toKeep.length === 0) throw new Error('Cannot delete all pages');updateProgress(50, 'Deleting pages...'); const newPdf = await PDFDocument.create(); const pages = await newPdf.copyPages(pdf, toKeep); pages.forEach(page => newPdf.addPage(page));updateProgress(90, 'Saving...'); const pdfBytes = await newPdf.save(); resultBlob = new Blob([pdfBytes], { type: 'application/pdf' }); resultFilename = 'pages-deleted.pdf'; }async function handleExtractPages(op) { const pagesStr = document.getElementById('opt-pages').value; if (!pagesStr) throw new Error('Please specify pages to extract');updateProgress(20, 'Loading PDF...'); const { PDFDocument } = PDFLib; const bytes = await uploadedFiles[0].arrayBuffer(); const pdf = await PDFDocument.load(bytes); const totalPages = pdf.getPageCount();const pageIndices = parsePageRange(pagesStr, totalPages); if (pageIndices.length === 0) throw new Error('No valid pages specified');updateProgress(50, 'Extracting pages...'); const newPdf = await PDFDocument.create(); const pages = await newPdf.copyPages(pdf, pageIndices); pages.forEach(page => newPdf.addPage(page));updateProgress(90, 'Saving...'); const pdfBytes = await newPdf.save(); resultBlob = new Blob([pdfBytes], { type: 'application/pdf' }); resultFilename = 'extracted-pages.pdf'; }async function handleCrop(op) { const top = parseFloat(document.getElementById('opt-top').value) || 0; const right = parseFloat(document.getElementById('opt-right').value) || 0; const bottom = parseFloat(document.getElementById('opt-bottom').value) || 0; const left = parseFloat(document.getElementById('opt-left').value) || 0;updateProgress(20, 'Loading PDF...'); const { PDFDocument } = PDFLib; const bytes = await uploadedFiles[0].arrayBuffer(); const pdf = await PDFDocument.load(bytes);updateProgress(50, 'Cropping...'); const pages = pdf.getPages(); pages.forEach(page => { const { width, height } = page.getSize(); const mmToPt = 2.83465; page.setCropBox( left * mmToPt, bottom * mmToPt, width - (left + right) * mmToPt, height - (top + bottom) * mmToPt ); });updateProgress(90, 'Saving...'); const pdfBytes = await pdf.save(); resultBlob = new Blob([pdfBytes], { type: 'application/pdf' }); resultFilename = 'cropped.pdf'; }async function handleResize(op) { const size = document.getElementById('opt-size').value; const sizes = { 'A4': [595.28, 841.89], 'A3': [841.89, 1190.55], 'A5': [419.53, 595.28], 'Letter': [612, 792], 'Legal': [612, 1008], 'Tabloid': [792, 1224] };updateProgress(20, 'Loading PDF...'); const { PDFDocument } = PDFLib; const bytes = await uploadedFiles[0].arrayBuffer(); const pdf = await PDFDocument.load(bytes);const [targetWidth, targetHeight] = sizes[size] || sizes['A4'];updateProgress(50, 'Resizing...'); const newPdf = await PDFDocument.create(); const pages = pdf.getPages();for (const page of pages) { const { width, height } = page.getSize(); const newPage = newPdf.addPage([targetWidth, targetHeight]); const embeddedPage = await newPdf.embedPage(page); const scale = Math.min(targetWidth / width, targetHeight / height); const scaledWidth = width * scale; const scaledHeight = height * scale; const x = (targetWidth - scaledWidth) / 2; const y = (targetHeight - scaledHeight) / 2; newPage.drawPage(embeddedPage, { x, y, width: scaledWidth, height: scaledHeight }); }updateProgress(90, 'Saving...'); const pdfBytes = await newPdf.save(); resultBlob = new Blob([pdfBytes], { type: 'application/pdf' }); resultFilename = `resized-${size.toLowerCase()}.pdf`; }// Helper: parse page range function parsePageRange(rangeStr, totalPages) { const indices = []; const parts = rangeStr.split(',').map(s => s.trim()); parts.forEach(part => { if (part.includes('-')) { const [start, end] = part.split('-').map(n => parseInt(n)); for (let i = start; i <= end && i <= totalPages; i++) { if (i > 0) indices.push(i - 1); } } else { const n = parseInt(part); if (n > 0 && n <= totalPages) indices.push(n - 1); } }); return [...new Set(indices)].sort((a, b) => a - b); }// Initialize switchOp('merge');console.log(`ASLI FORM PDF Tool loaded: ${OPERATIONS.length} operations ready`); })();