Files
bentopdf/src/pages/deskew-pdf.html
T
2026-09-04 16:26:08 +05:30

539 lines
20 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Deskew PDF Online Free - Straighten Scanned PDFs | BentoPDF</title>
<meta
name="title"
content="Deskew PDF Online Free - Straighten Scanned PDFs | BentoPDF"
/>
<meta
name="description"
content="Automatically straighten tilted scanned pages using OpenCV. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="keywords"
content="deskew pdf, straighten pdf, fix tilted scan, online pdf"
/>
<meta name="author" content="BentoPDF" />
<meta
name="robots"
content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
/>
<link rel="canonical" href="https://www.bentopdf.com/deskew-pdf" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/deskew-pdf" />
<meta
property="og:title"
content="Deskew PDF Online Free - Straighten Scanned PDFs | BentoPDF"
/>
<meta
property="og:description"
content="Automatically straighten tilted scanned pages using OpenCV. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-deskew-pdf.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:site_name" content="BentoPDF" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/deskew-pdf" />
<meta name="twitter:title" content="Deskew PDF Free" />
<meta
name="twitter:description"
content="Automatically straighten tilted scanned pages using OpenCV. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
content="https://www.bentopdf.com/images/twitter-deskew-pdf.png"
/>
<meta name="twitter:site" content="@BentoPDF" />
<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="Deskew PDF" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="manifest" href="/site.webmanifest" />
<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>
<body class="antialiased bg-gray-900">
{{> navbar }}
<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-300 hover:text-indigo-400 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:deskewPdf.name"
>
Deskew PDF
</h1>
<p class="text-gray-400 mb-6" data-i18n="tools:deskewPdf.subtitle">
Automatically straighten tilted scanned pages using OpenCV.
</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 class="ph ph-upload-simple text-4xl 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="upload.hints.oneOrMorePdfs"
>
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>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>Clear All</span>
</button>
</div>
<div id="file-display-area" class="mt-4 space-y-2"></div>
<div id="deskew-options" class="hidden mt-6 space-y-6">
<div>
<label
for="deskew-threshold"
class="block mb-2 text-sm font-medium text-gray-300"
>Skew Threshold (degrees)</label
>
<select
id="deskew-threshold"
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="0.1">0.1° (Very Sensitive)</option>
<option value="0.5" selected>0.5° (Default)</option>
<option value="1.0">1.0° (Normal)</option>
<option value="2.0">2.0° (Less Sensitive)</option>
</select>
<p class="text-xs text-gray-500 mt-1">
Pages with skew below this threshold won't be corrected.
</p>
</div>
<div>
<label
for="deskew-dpi"
class="block mb-2 text-sm font-medium text-gray-300"
>Processing Quality (DPI)</label
>
<select
id="deskew-dpi"
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="100">100 (Fast)</option>
<option value="150" selected>150 (Default)</option>
<option value="200">200 (Better)</option>
<option value="300">300 (Best Quality)</option>
</select>
</div>
<button id="process-btn" class="btn-gradient w-full mt-4">
Deskew PDF
</button>
</div>
<div id="results-area" class="hidden mt-6 p-4 bg-gray-700 rounded-lg">
<h3 class="text-lg font-semibold text-white mb-3">Deskew Results</h3>
<div class="grid grid-cols-2 gap-4 text-sm">
<div>
<span class="text-gray-400">Total Pages:</span>
<span id="result-total" class="text-white ml-2">-</span>
</div>
<div>
<span class="text-gray-400">Pages Corrected:</span>
<span id="result-corrected" class="text-white ml-2">-</span>
</div>
</div>
<div id="angles-list" class="mt-3 max-h-32 overflow-y-auto"></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">
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>
<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"
data-i18n="howItWorks.title"
>
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 your scanned PDF with tilted 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"
>
2
</div>
<div class="flex-1">
<h3 class="text-lg font-semibold text-white mb-1">Auto-Detect</h3>
<p class="text-gray-400">OpenCV analyzes and detects skew angles</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">Get your straightened PDF instantly</p>
</div>
</div>
</div>
</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"
data-i18n="relatedTools.title"
>
Related PDF Tools
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a
href="rasterize-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">Rasterize PDF</h3>
<p class="text-gray-400 text-sm">Convert to image-based 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">Reduce PDF file size</p>
</a>
<a
href="repair-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">Repair PDF</h3>
<p class="text-gray-400 text-sm">Fix corrupted PDF files</p>
</a>
<a
href="rotate-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">Rotate PDF</h3>
<p class="text-gray-400 text-sm">Rotate PDF pages</p>
</a>
<a
href="ocr-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">OCR PDF</h3>
<p class="text-gray-400 text-sm">Make PDF searchable</p>
</a>
</div>
</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"
data-i18n="faq.sectionTitle"
>
Frequently Asked Questions
</h2>
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
How does the tool detect that a page is tilted?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Each page is rendered to an image at the DPI you choose, then OpenCV
analyzes it: it fits a minimum-area rectangle around the dark pixels
and, as a fallback, measures the angle of dominant text lines with a
Hough transform. The resulting angle is what the results panel
reports for that page.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What does the Skew Threshold setting do?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Pages whose detected tilt is below the threshold are left alone. The
default of 0.5 degrees catches visible tilt without touching pages
that are already straight; drop it to 0.1 degrees when you want the
tightest alignment before OCR, or raise it to 1 or 2 degrees to
correct only clearly crooked pages.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does deskewing keep the text selectable?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Every page in the output, including pages that didn't need
correction, is written as an image at the processing DPI, so any
existing text layer is lost. Run the result through
<a href="/ocr-pdf" class="text-indigo-300 hover:text-indigo-400"
>OCR PDF</a
>
afterward if you need searchable text; OCR works better on
straightened pages anyway.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Which DPI should I use when deskewing a scan?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
150 DPI is fast and accurate for ordinary letter-sized scans. Use
200 or 300 DPI for small print or fine detail, and 100 DPI when
speed matters more than precision. The setting also controls the
resolution of the output pages, so higher values produce larger
files.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Will the page size change after rotation?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Output pages keep the original page dimensions. The rotated image is
padded with white in the corners exposed by the rotation and then
fitted onto the page, so content may shrink by a hair but nothing is
pushed off the sheet.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does it work on every kind of scan?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
It works best on pages with clear horizontal lines of text. Pages
that are mostly photos, drawings, or diagonal design elements give
the detector little to measure, so the angle can be off; check the
results panel and keep your original for those.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How do I know which pages were corrected?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
After processing, a results panel lists every page with its detected
angle and marks the ones that were rotated; pages under the
threshold show their angle but are labeled as untouched. If you
queued several PDFs, each downloads under its original name and the
panel shows the last file processed.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my scans uploaded for processing?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The PDF rendering and the OpenCV analysis both run in your
browser through WebAssembly. The engine is downloaded the first time
you use it, but your documents never leave your computer.
</p>
</details>
</div>
</section>
{{> 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/js/logic/deskew-pdf-page.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module" src="/src/js/main.ts"></script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Deskew PDF - BentoPDF",
"applicationCategory": "PDF Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to deskew PDF online",
"description": "Learn how to straighten tilted pages in scanned PDFs",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Upload PDF",
"text": "Select your scanned PDF with tilted pages"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Auto-Detect",
"text": "OpenCV analyzes and detects skew angles"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Download",
"text": "Get your straightened PDF instantly"
}
]
}
</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": "Deskew PDF",
"item": "https://www.bentopdf.com/deskew-pdf"
}
]
}
</script>
</body>
</html>