seo fixes

This commit is contained in:
alam00000
2026-09-04 16:26:08 +05:30
parent 83ff47db9b
commit 9e980cdea2
189 changed files with 17781 additions and 2238 deletions
+142
View File
@@ -0,0 +1,142 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Alam, Creator of BentoPDF</title>
<meta
name="description"
content="Alam builds BentoPDF, the open-source, privacy-first PDF toolkit that runs entirely in your browser. Every post on this blog is written by him."
/>
<meta name="robots" content="index, follow" />
<link rel="canonical" href="https://www.bentopdf.com/blog/author-alam" />
<meta property="og:type" content="profile" />
<meta
property="og:url"
content="https://www.bentopdf.com/blog/author-alam"
/>
<meta property="og:title" content="Alam, Creator of BentoPDF" />
<meta
property="og:description"
content="The maintainer behind BentoPDF and the author of every post on this blog."
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/author-alam.jpg"
/>
<meta property="og:site_name" content="BentoPDF" />
<meta name="twitter:card" content="summary" />
<link rel="manifest" href="/site.webmanifest" />
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" />
<link rel="icon" href="/favicon.ico" sizes="32x32" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>
<body class="antialiased bg-gray-900">
{{> navbar }}
<section class="max-w-3xl mx-auto px-4 py-12">
<div class="flex items-center gap-5 mb-8">
<img
src="/images/author-alam.jpg"
alt="Alam"
width="80"
height="80"
class="rounded-full"
/>
<div>
<h1 class="text-3xl font-bold text-white">Alam</h1>
<p class="text-gray-400">Creator and maintainer of BentoPDF</p>
</div>
</div>
<p class="text-gray-300 leading-relaxed mb-5">
I’m Alam, and I build
<a href="/" class="text-indigo-300 hover:text-indigo-400">BentoPDF</a>,
a free, open-source PDF toolkit with 100+ tools that run entirely in
your browser.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
There’s no uploading your files to a server, no account to create, and
no tracking. Your documents stay on your device. The
<a
href="https://github.com/alam00000/bentopdf"
rel="noopener"
class="text-indigo-300 hover:text-indigo-400"
>source code</a
>
is public, so you can see how it works yourself. BentoPDF is
AGPL-licensed and self-hostable.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
I write every post on this blog myself. I’ll write about PDFs, how they
work, things I learn while building BentoPDF, and occasionally things
that go wrong.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
When I compare BentoPDF with another PDF tool, I’ll link to its
documentation so you can check what I’m saying. If there’s something
BentoPDF doesn’t do well, I’ll say that too.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
And if I get something wrong, please
<a
href="https://github.com/alam00000/bentopdf/issues"
rel="noopener"
class="text-indigo-300 hover:text-indigo-400"
>open an issue</a
>. I’ll fix it and add a note to the post.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
You can find me on
<a
href="https://github.com/alam00000"
rel="me noopener"
class="text-indigo-300 hover:text-indigo-400"
>GitHub</a
>
and
<a
href="https://www.linkedin.com/in/abdullah-alam01/"
rel="me noopener"
class="text-indigo-300 hover:text-indigo-400"
>LinkedIn</a
>.
</p>
<p class="text-gray-300 leading-relaxed">
<a
href="/blog"
class="inline-flex items-center gap-2 text-indigo-300 hover:text-indigo-400 font-semibold"
>Read the blog <i class="ph ph-arrow-right" aria-hidden="true"></i
></a>
</p>
</section>
{{> footer }}
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module">
import '@phosphor-icons/web/regular';
</script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "ProfilePage",
"mainEntity": {
"@type": "Person",
"name": "Alam",
"url": "https://www.bentopdf.com/blog/author-alam",
"image": "https://www.bentopdf.com/images/author-alam.jpg",
"jobTitle": "Creator and maintainer of BentoPDF",
"sameAs": [
"https://github.com/alam00000",
"https://www.linkedin.com/in/abdullah-alam01/"
]
}
}
</script>
</body>
</html>
+472
View File
@@ -0,0 +1,472 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>
How to Edit a PDF Without Uploading It Anywhere | BentoPDF Blog
</title>
<meta
name="description"
content="Edit PDF text, fill forms, redact, and sign in your browser while the file stays on your device. Step by step, with the right tool for each job."
/>
<meta name="robots" content="index, follow, max-image-preview:large" />
<link
rel="canonical"
href="https://www.bentopdf.com/blog/edit-pdf-without-uploading"
/>
<meta property="og:type" content="article" />
<meta
property="og:url"
content="https://www.bentopdf.com/blog/edit-pdf-without-uploading"
/>
<meta
property="og:title"
content="How to Edit a PDF Without Uploading It Anywhere"
/>
<meta
property="og:description"
content="Edit PDF text, fill forms, redact, and sign in your browser while the file stays on your device. Step by step, with the right tool for each job."
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-tools.png"
/>
<meta property="og:site_name" content="BentoPDF" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="manifest" href="/site.webmanifest" />
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" />
<link rel="icon" href="/favicon.ico" sizes="32x32" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>
<body class="antialiased bg-gray-900">
{{> navbar }}
<article class="max-w-3xl mx-auto px-4 py-12">
<nav
class="flex items-center gap-2 text-sm text-gray-400 mb-6"
aria-label="Breadcrumb"
>
<a href="/blog" class="hover:text-indigo-300">Blog</a>
<i class="ph ph-caret-right text-xs" aria-hidden="true"></i>
<span class="text-gray-300">Edit a PDF without uploading</span>
</nav>
<h1 class="text-3xl md:text-4xl font-bold text-white mb-4 leading-tight">
How to edit a PDF without uploading it anywhere
</h1>
<div class="flex items-center gap-3 mb-10 text-sm text-gray-400">
<img
src="/images/author-alam.jpg"
alt="Alam"
width="40"
height="40"
class="rounded-full"
/>
<div>
<a
href="/blog/author-alam"
class="text-gray-200 font-semibold hover:text-indigo-300"
>Alam</a
>, builds BentoPDF ·
<time datetime="2026-09-03">September 3, 2026</time>
</div>
</div>
<p class="text-gray-300 leading-relaxed mb-5">
You can edit a PDF in your browser without uploading the file to a
server.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
Open
<a class="text-indigo-300 hover:text-indigo-400" href="/edit-pdf"
>BentoPDF&#39;s PDF editor</a
>, pick your file, make your changes, and download the result. The PDF
stays on your device. There&#39;s no account and no watermark.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
But “edit a PDF” can mean a few different things. You might want to
change existing text, fill out a form, add a signature, redact
something, or just highlight a paragraph. The right tool depends on what
you&#39;re trying to do.
</p>
<h2 class="text-2xl font-bold text-white mt-10 mb-4">
Why edit a PDF without uploading it?
</h2>
<p class="text-gray-300 leading-relaxed mb-5">
Think about the PDFs you normally edit.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
Contracts. Bank statements. Tax documents. Forms with your address or ID
number.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
Those aren&#39;t necessarily files you want to upload to a random “free
PDF editor.”
</p>
<p class="text-gray-300 leading-relaxed mb-5">
With an on-device PDF editor, the file stays on your computer while
you&#39;re working on it.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
You can even check this yourself. Open your browser&#39;s developer
tools, go to the Network tab, and watch what happens while you edit. The
PDF itself doesn&#39;t need to be sent to a server.
</p>
<h2 class="text-2xl font-bold text-white mt-10 mb-4">
How to edit the actual text in a PDF
</h2>
<p class="text-gray-300 leading-relaxed mb-5">
If you want to change words that are already in the PDF, use
<a class="text-indigo-300 hover:text-indigo-400" href="/edit-pdf-text"
>Edit PDF Text</a
>.
</p>
<ol
class="list-decimal list-inside text-gray-300 leading-relaxed mb-5 space-y-2"
>
<li>Open the tool.</li>
<li>Drop in your PDF.</li>
<li>Click on the text you want to change.</li>
<li>Type your changes.</li>
<li>Download the edited PDF.</li>
</ol>
<p class="text-gray-300 leading-relaxed mb-5">
BentoPDF loads the PDF in your browser and does the editing on your
device.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
This is one of the harder things to do with PDFs because PDF text
doesn&#39;t work quite like text in a Word document. The PDF is mostly
concerned with putting things at particular positions on a page, so
changing a sentence can mean figuring out how the surrounding text
should move.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
It works well for ordinary documents, but PDFs with unusual embedded
fonts or very complicated layouts can be trickier. I&#39;d always open
the downloaded PDF and check it.
</p>
<h2 class="text-2xl font-bold text-white mt-10 mb-4">
How to annotate a PDF
</h2>
<p class="text-gray-300 leading-relaxed mb-5">
If you don&#39;t need to change the existing text, annotating a PDF is
much simpler.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
The
<a class="text-indigo-300 hover:text-indigo-400" href="/edit-pdf"
>PDF editor</a
>
lets you add highlights, comments, shapes, stamps, text boxes, and
images.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
Open the PDF, add your annotations, and download the result.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
Again, the editing happens in your browser rather than on a remote
server.
</p>
<h2 class="text-2xl font-bold text-white mt-10 mb-4">
How to fill out a PDF form
</h2>
<p class="text-gray-300 leading-relaxed mb-5">
There are two common kinds of PDF forms.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
If the PDF has actual form fields, open it in
<a class="text-indigo-300 hover:text-indigo-400" href="/form-filler"
>PDF Form Filler</a
>
and type into the fields. It handles standard AcroForm fields, and also
XFA forms, which are the legacy XML-based format. XFA is worth calling
out because Chrome and most other viewers show those files as blank
pages, which is why some government forms tell you to open them in Adobe
Reader. Firefox and BentoPDF&#39;s form filler render them properly.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
If it&#39;s a scanned or flattened form, there aren&#39;t any fields to
click. In that case, you can put text boxes over the blank spaces in the
<a class="text-indigo-300 hover:text-indigo-400" href="/edit-pdf"
>PDF editor</a
>
and type into them. If you&#39;d rather have real fields,
<a class="text-indigo-300 hover:text-indigo-400" href="/form-creator"
>Create PDF Form</a
>
can add them to the document first.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
This is especially useful for government and HR forms, which often
contain personal information I&#39;d rather not upload somewhere just to
fill in a few boxes.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
If the PDF is a scan and you actually need to edit the scanned text
itself, you&#39;ll need OCR first.
<a class="text-indigo-300 hover:text-indigo-400" href="/ocr-pdf"
>BentoPDF&#39;s OCR tool</a
>
can recognize the text in the document while keeping the processing on
your device.
</p>
<h2 class="text-2xl font-bold text-white mt-10 mb-4">
How to redact a PDF properly
</h2>
<p class="text-gray-300 leading-relaxed mb-5">
This one is important because putting a black box over text isn&#39;t
necessarily redaction.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
If you draw a rectangle over a name, the original name may still exist
underneath it. It might still be selectable, searchable, or extractable.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
Proper redaction removes the underlying content.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
The
<a class="text-indigo-300 hover:text-indigo-400" href="/edit-pdf"
>PDF editor</a
>
has redaction tools that permanently remove the underlying content
rather than drawing over it. For documents where you also want to strip
metadata or other hidden content,
<a class="text-indigo-300 hover:text-indigo-400" href="/sanitize-pdf"
>Sanitize PDF</a
>
can help with that.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
There&#39;s also a privacy reason to do redaction locally: if you upload
the original, unredacted PDF to a redaction service, that service has
already received the information you&#39;re trying to hide.
</p>
<h2 class="text-2xl font-bold text-white mt-10 mb-4">
How to sign a PDF without uploading it
</h2>
<p class="text-gray-300 leading-relaxed mb-5">
<a class="text-indigo-300 hover:text-indigo-400" href="/sign-pdf"
>Sign PDF</a
>
lets you add a drawn, typed, or image signature to a PDF. Place it on
the page, resize it, and optionally flatten it so it becomes part of the
page instead of an annotation someone can drag away later.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
The signature is added on your device, so you don&#39;t need to upload
the document to a signing service just to place a signature on it.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
One thing to keep in mind: adding a signature image to a PDF is not the
same thing as applying a cryptographic digital signature. If the
recipient needs a signature that can actually be verified, use
<a
class="text-indigo-300 hover:text-indigo-400"
href="/digital-sign-pdf"
>Digital Signature</a
>
instead. It signs the document with an X.509 certificate (PKCS#12 .pfx
and .p12, or PEM), which proves who signed it and shows whether anything
changed afterwards. You can also add a visible signature block on top of
that. The certificate password and private key stay in your browser,
same as the PDF.
</p>
<h2 class="text-2xl font-bold text-white mt-10 mb-4">
Can you edit a PDF offline?
</h2>
<p class="text-gray-300 leading-relaxed mb-5">Yes.</p>
<p class="text-gray-300 leading-relaxed mb-5">
There&#39;s an easy way to test it: load the editor, turn off Wi-Fi, and
edit a PDF.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
The PDF processing code runs in your browser using WebAssembly. Once the
application has loaded, the actual PDF processing doesn&#39;t need a
server.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
This is also something you can inspect yourself in your browser&#39;s
developer tools. The website is how you get the software; it doesn&#39;t
have to be where your PDF gets processed.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
If you want to run the whole thing yourself, BentoPDF is
<a
rel="noopener"
class="text-indigo-300 hover:text-indigo-400"
href="https://github.com/alam00000/bentopdf"
>open source and self-hostable</a
>. You can run your own instance instead of relying on ours.
</p>
<h2 class="text-2xl font-bold text-white mt-10 mb-4">
What about scanned PDFs?
</h2>
<p class="text-gray-300 leading-relaxed mb-5">
A scanned PDF is basically a collection of images.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
If you want to change the words in it, an ordinary PDF text editor
can&#39;t simply edit them because there isn&#39;t any text there yet.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
You&#39;ll need OCR (optical character recognition) to turn the pixels
into text.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
You can either OCR the PDF first and then edit the resulting text, or,
if you&#39;re just filling out a scanned form, put text boxes on top of
the existing page.
</p>
<h2 class="text-2xl font-bold text-white mt-10 mb-4">
Is there a file size limit?
</h2>
<p class="text-gray-300 leading-relaxed mb-5">
There isn&#39;t an imposed file-size limit.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
The practical limit is your device&#39;s available memory. Normal PDFs
are usually fine, but a thousand-page scanned archive is a very
different workload from a five-page contract.
</p>
<p class="text-gray-300 leading-relaxed mb-5">
For very large PDFs, a desktop application may be a better choice.
</p>
<h2 class="text-2xl font-bold text-white mt-10 mb-4">
Will editing a digitally signed PDF break the signature?
</h2>
<p class="text-gray-300 leading-relaxed mb-5">Yes.</p>
<p class="text-gray-300 leading-relaxed mb-5">
Changing a digitally signed PDF will invalidate its existing signature.
This isn&#39;t specific to BentoPDF; it&#39;s a consequence of changing
a document that has already been signed.
</p>
<p class="text-gray-300 leading-relaxed mb-5">So the usual order is:</p>
<p class="text-gray-300 leading-relaxed mb-5">
<strong>Edit first. Sign last.</strong>
</p>
<p class="text-gray-300 leading-relaxed mb-5">
If you need to make changes to a signed document, make sure you
understand the signature requirements before doing so.
</p>
<div class="bg-gray-800 border border-gray-700 rounded-xl p-6 my-10">
<p class="text-white font-semibold mb-2">Edit your PDF now</p>
<p class="text-gray-400 mb-4">
Free, no signup. Your file stays on your device.
</p>
<a
href="/edit-pdf"
class="inline-block bg-indigo-600 hover:bg-indigo-700 text-white font-semibold px-5 py-2.5 rounded-lg"
>Open the PDF editor</a
>
</div>
</article>
{{> footer }}
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module">
import '@phosphor-icons/web/regular';
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "How to edit a PDF without uploading it anywhere",
"description": "Edit PDF text, fill forms, redact, and sign in your browser while the file stays on your device. Step by step, with the right tool for each job.",
"url": "https://www.bentopdf.com/blog/edit-pdf-without-uploading",
"datePublished": "2026-09-03",
"dateModified": "2026-09-03",
"image": "https://www.bentopdf.com/images/og-tools.png",
"author": {
"@type": "Person",
"name": "Alam",
"url": "https://www.bentopdf.com/blog/author-alam",
"sameAs": [
"https://github.com/alam00000",
"https://www.linkedin.com/in/abdullah-alam01/"
]
},
"publisher": {
"@type": "Organization",
"name": "BentoPDF",
"url": "https://www.bentopdf.com"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Blog",
"item": "https://www.bentopdf.com/blog/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Edit a PDF without uploading",
"item": "https://www.bentopdf.com/blog/edit-pdf-without-uploading"
}
]
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Why edit a PDF without uploading it?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Think about the PDFs you normally edit. Contracts. Bank statements. Tax documents. Forms with your address or ID number. Those aren't necessarily files you want to upload to a random “free PDF editor.” With an on-device PDF editor, the file stays on your computer while you're working on it. You can even check this yourself. Open your browser's developer tools, go to the Network tab, and watch what happens while you edit. The PDF itself doesn't need to be sent to a server."
}
},
{
"@type": "Question",
"name": "Can you edit a PDF offline?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. There's an easy way to test it: load the editor, turn off Wi-Fi, and edit a PDF. The PDF processing code runs in your browser using WebAssembly. Once the application has loaded, the actual PDF processing doesn't need a server. This is also something you can inspect yourself in your browser's developer tools. The website is how you get the software; it doesn't have to be where your PDF gets processed. If you want to run the whole thing yourself, BentoPDF is open source and self-hostable. You can run your own instance instead of relying on ours."
}
},
{
"@type": "Question",
"name": "What about scanned PDFs?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A scanned PDF is basically a collection of images. If you want to change the words in it, an ordinary PDF text editor can't simply edit them because there isn't any text there yet. You'll need OCR (optical character recognition) to turn the pixels into text. You can either OCR the PDF first and then edit the resulting text, or, if you're just filling out a scanned form, put text boxes on top of the existing page."
}
},
{
"@type": "Question",
"name": "Is there a file size limit?",
"acceptedAnswer": {
"@type": "Answer",
"text": "There isn't an imposed file-size limit. The practical limit is your device's available memory. Normal PDFs are usually fine, but a thousand-page scanned archive is a very different workload from a five-page contract. For very large PDFs, a desktop application may be a better choice."
}
},
{
"@type": "Question",
"name": "Will editing a digitally signed PDF break the signature?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Changing a digitally signed PDF will invalidate its existing signature. This isn't specific to BentoPDF; it's a consequence of changing a document that has already been signed. So the usual order is: Edit first. Sign last. If you need to make changes to a signed document, make sure you understand the signature requirements before doing so."
}
}
]
}
</script>
</body>
</html>
+87
View File
@@ -0,0 +1,87 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>The BentoPDF Blog | Privacy-First PDF Guides</title>
<meta
name="description"
content="Guides and honest comparisons from the maintainer of BentoPDF: how PDF tools handle your files, and how to get things done without uploading them."
/>
<meta name="robots" content="index, follow, max-image-preview:large" />
<link rel="canonical" href="https://www.bentopdf.com/blog/" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.bentopdf.com/blog/" />
<meta property="og:title" content="The BentoPDF Blog" />
<meta
property="og:description"
content="Guides and honest comparisons from the maintainer of BentoPDF."
/>
<meta
property="og:image"
content="https://www.bentopdf.com/images/og-tools.png"
/>
<meta property="og:site_name" content="BentoPDF" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="manifest" href="/site.webmanifest" />
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" />
<link rel="icon" href="/favicon.ico" sizes="32x32" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>
<body class="antialiased bg-gray-900">
{{> navbar }}
<section class="max-w-3xl mx-auto px-4 py-12">
<h1 class="text-3xl md:text-4xl font-bold text-white mb-4">
The BentoPDF Blog
</h1>
<p class="text-gray-300 leading-relaxed mb-2">
I'm
<a
href="/blog/author-alam"
class="text-indigo-300 hover:text-indigo-400"
>Alam</a
>. I build BentoPDF and write about PDFs, how they work, and the weird
things I run into along the way.
</p>
</section>
<section class="max-w-3xl mx-auto px-4 pb-16">
<div class="space-y-6">
<a
href="/blog/edit-pdf-without-uploading"
class="block bg-gray-800 border border-gray-700 rounded-xl p-6 hover:border-indigo-500 transition-colors"
>
<h2 class="text-xl font-bold text-white mb-2">
How to edit a PDF without uploading it anywhere
</h2>
<p class="text-gray-400 mb-3">
Rewrite text, fill forms, redact properly, and sign, locally on your
device.
</p>
<span class="text-sm text-gray-500">September 3, 2026</span>
</a>
</div>
</section>
{{> footer }}
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Blog",
"name": "The BentoPDF Blog",
"url": "https://www.bentopdf.com/blog/",
"description": "Guides and honest comparisons from the maintainer of BentoPDF.",
"publisher": {
"@type": "Organization",
"name": "BentoPDF",
"url": "https://www.bentopdf.com"
}
}
</script>
</body>
</html>
+136
View File
@@ -0,0 +1,136 @@
---
{
'title': 'How to Edit a PDF Without Uploading It Anywhere | BentoPDF Blog',
'h1': 'How to edit a PDF without uploading it anywhere',
'ogTitle': 'How to Edit a PDF Without Uploading It Anywhere',
'breadcrumb': 'Edit a PDF without uploading',
'description': 'Edit PDF text, fill forms, redact, and sign in your browser while the file stays on your device. Step by step, with the right tool for each job.',
'card': 'Rewrite text, fill forms, redact properly, and sign, locally on your device.',
'date': '2026-09-03',
'cta':
{
'heading': 'Edit your PDF now',
'text': 'Free, no signup. Your file stays on your device.',
'href': '/edit-pdf',
'label': 'Open the PDF editor',
},
}
---
You can edit a PDF in your browser without uploading the file to a server.
Open [BentoPDF's PDF editor](/edit-pdf), pick your file, make your changes, and download the result. The PDF stays on your device. There's no account and no watermark.
But “edit a PDF” can mean a few different things. You might want to change existing text, fill out a form, add a signature, redact something, or just highlight a paragraph. The right tool depends on what you're trying to do.
## Why edit a PDF without uploading it?
Think about the PDFs you normally edit.
Contracts. Bank statements. Tax documents. Forms with your address or ID number.
Those aren't necessarily files you want to upload to a random “free PDF editor.”
With an on-device PDF editor, the file stays on your computer while you're working on it.
You can even check this yourself. Open your browser's developer tools, go to the Network tab, and watch what happens while you edit. The PDF itself doesn't need to be sent to a server.
## How to edit the actual text in a PDF
If you want to change words that are already in the PDF, use [Edit PDF Text](/edit-pdf-text).
1. Open the tool.
2. Drop in your PDF.
3. Click on the text you want to change.
4. Type your changes.
5. Download the edited PDF.
BentoPDF loads the PDF in your browser and does the editing on your device.
This is one of the harder things to do with PDFs because PDF text doesn't work quite like text in a Word document. The PDF is mostly concerned with putting things at particular positions on a page, so changing a sentence can mean figuring out how the surrounding text should move.
It works well for ordinary documents, but PDFs with unusual embedded fonts or very complicated layouts can be trickier. I'd always open the downloaded PDF and check it.
## How to annotate a PDF
If you don't need to change the existing text, annotating a PDF is much simpler.
The [PDF editor](/edit-pdf) lets you add highlights, comments, shapes, stamps, text boxes, and images.
Open the PDF, add your annotations, and download the result.
Again, the editing happens in your browser rather than on a remote server.
## How to fill out a PDF form
There are two common kinds of PDF forms.
If the PDF has actual form fields, open it in [PDF Form Filler](/form-filler) and type into the fields. It handles standard AcroForm fields, and also XFA forms, which are the legacy XML-based format. XFA is worth calling out because Chrome and most other viewers show those files as blank pages, which is why some government forms tell you to open them in Adobe Reader. Firefox and BentoPDF's form filler render them properly.
If it's a scanned or flattened form, there aren't any fields to click. In that case, you can put text boxes over the blank spaces in the [PDF editor](/edit-pdf) and type into them. If you'd rather have real fields, [Create PDF Form](/form-creator) can add them to the document first.
This is especially useful for government and HR forms, which often contain personal information I'd rather not upload somewhere just to fill in a few boxes.
If the PDF is a scan and you actually need to edit the scanned text itself, you'll need OCR first. [BentoPDF's OCR tool](/ocr-pdf) can recognize the text in the document while keeping the processing on your device.
## How to redact a PDF properly
This one is important because putting a black box over text isn't necessarily redaction.
If you draw a rectangle over a name, the original name may still exist underneath it. It might still be selectable, searchable, or extractable.
Proper redaction removes the underlying content.
The [PDF editor](/edit-pdf) has redaction tools that permanently remove the underlying content rather than drawing over it. For documents where you also want to strip metadata or other hidden content, [Sanitize PDF](/sanitize-pdf) can help with that.
There's also a privacy reason to do redaction locally: if you upload the original, unredacted PDF to a redaction service, that service has already received the information you're trying to hide.
## How to sign a PDF without uploading it
[Sign PDF](/sign-pdf) lets you add a drawn, typed, or image signature to a PDF. Place it on the page, resize it, and optionally flatten it so it becomes part of the page instead of an annotation someone can drag away later.
The signature is added on your device, so you don't need to upload the document to a signing service just to place a signature on it.
One thing to keep in mind: adding a signature image to a PDF is not the same thing as applying a cryptographic digital signature. If the recipient needs a signature that can actually be verified, use [Digital Signature](/digital-sign-pdf) instead. It signs the document with an X.509 certificate (PKCS#12 .pfx and .p12, or PEM), which proves who signed it and shows whether anything changed afterwards. You can also add a visible signature block on top of that. The certificate password and private key stay in your browser, same as the PDF.
## Can you edit a PDF offline?
Yes.
There's an easy way to test it: load the editor, turn off Wi-Fi, and edit a PDF.
The PDF processing code runs in your browser using WebAssembly. Once the application has loaded, the actual PDF processing doesn't need a server.
This is also something you can inspect yourself in your browser's developer tools. The website is how you get the software; it doesn't have to be where your PDF gets processed.
If you want to run the whole thing yourself, BentoPDF is [open source and self-hostable](https://github.com/alam00000/bentopdf). You can run your own instance instead of relying on ours.
## What about scanned PDFs?
A scanned PDF is basically a collection of images.
If you want to change the words in it, an ordinary PDF text editor can't simply edit them because there isn't any text there yet.
You'll need OCR (optical character recognition) to turn the pixels into text.
You can either OCR the PDF first and then edit the resulting text, or, if you're just filling out a scanned form, put text boxes on top of the existing page.
## Is there a file size limit?
There isn't an imposed file-size limit.
The practical limit is your device's available memory. Normal PDFs are usually fine, but a thousand-page scanned archive is a very different workload from a five-page contract.
For very large PDFs, a desktop application may be a better choice.
## Will editing a digitally signed PDF break the signature?
Yes.
Changing a digitally signed PDF will invalidate its existing signature. This isn't specific to BentoPDF; it's a consequence of changing a document that has already been signed.
So the usual order is:
**Edit first. Sign last.**
If you need to make changes to a signed document, make sure you understand the signature requirements before doing so.
+3 -3
View File
@@ -115,7 +115,7 @@ export default defineConfig({
{ text: 'PDF to Excel', link: '/tools/pdf-to-excel' },
{ text: 'PDF to Greyscale', link: '/tools/pdf-to-greyscale' },
{ text: 'PDF to JSON', link: '/tools/pdf-to-json' },
{ text: 'PDF to Word', link: '/tools/pdf-to-docx' },
{ text: 'PDF to Word', link: '/tools/pdf-to-word' },
{ text: 'Extract Images', link: '/tools/extract-images' },
{ text: 'PDF to Markdown', link: '/tools/pdf-to-markdown' },
{ text: 'Prepare PDF for AI', link: '/tools/prepare-pdf-for-ai' },
@@ -176,9 +176,9 @@ export default defineConfig({
text: 'Secure PDF',
collapsed: true,
items: [
{ text: 'Encrypt PDF', link: '/tools/encrypt-pdf' },
{ text: 'Protect PDF', link: '/tools/protect-pdf' },
{ text: 'Sanitize PDF', link: '/tools/sanitize-pdf' },
{ text: 'Decrypt PDF', link: '/tools/decrypt-pdf' },
{ text: 'Unlock PDF', link: '/tools/unlock-pdf' },
{ text: 'Flatten PDF', link: '/tools/flatten-pdf' },
{ text: 'Remove Metadata', link: '/tools/remove-metadata' },
{ text: 'Change Permissions', link: '/tools/change-permissions' },
+2 -2
View File
@@ -56,6 +56,6 @@ If you set only an owner password (no user password), anyone can open the file b
## Related Tools
- [Encrypt PDF](./encrypt-pdf) -- simple password protection without granular permissions
- [Decrypt PDF](./decrypt-pdf) -- remove encryption entirely
- [Encrypt PDF](./protect-pdf) -- simple password protection without granular permissions
- [Decrypt PDF](./unlock-pdf) -- remove encryption entirely
- [Remove Restrictions](./remove-restrictions) -- strip all restrictions when you have the owner password
+1 -1
View File
@@ -61,5 +61,5 @@ Signing may require an internet connection. The signing library fetches the cert
- [Validate Signature](./validate-signature-pdf) -- verify digital signatures in signed PDFs
- [Flatten PDF](./flatten-pdf) -- flatten forms before signing to prevent modifications
- [Encrypt PDF](./encrypt-pdf) -- add password protection on top of the digital signature
- [Encrypt PDF](./protect-pdf) -- add password protection on top of the digital signature
- [Remove Metadata](./remove-metadata) -- strip metadata before signing
+1 -1
View File
@@ -48,4 +48,4 @@ The tool uses pdf-lib to flatten form fields (via `form.flatten()`) and a dedica
- [Sanitize PDF](./sanitize-pdf) -- flatten forms plus remove metadata, scripts, and more
- [Rasterize PDF](./rasterize-pdf) -- convert to image-based PDF for maximum flattening
- [Font to Outline](./font-to-outline) -- flatten fonts to vector paths
- [Encrypt PDF](./encrypt-pdf) -- lock the flattened PDF with a password
- [Encrypt PDF](./protect-pdf) -- lock the flattened PDF with a password
+3 -3
View File
@@ -95,7 +95,7 @@ Extract content from PDFs into images, documents, and data formats.
- [**PDF to Excel**](./pdf-to-excel) — Extract tables from PDF and convert to Excel (XLSX).
- [**PDF to Greyscale**](./pdf-to-greyscale) — Convert all colors to black and white.
- [**PDF to JSON**](./pdf-to-json) — Convert PDF files to JSON format.
- [**PDF to Word**](./pdf-to-docx) — Convert PDF files to editable Word documents.
- [**PDF to Word**](./pdf-to-word) — Convert PDF files to editable Word documents.
- [**Extract Images**](./extract-images) — Extract all embedded images from your PDF files.
- [**PDF to Markdown**](./pdf-to-markdown) — Convert PDF text and tables to Markdown format.
- [**Prepare PDF for AI**](./prepare-pdf-for-ai) — Extract PDF content as LlamaIndex JSON for RAG/LLM pipelines.
@@ -171,9 +171,9 @@ Protect, encrypt, and control access to your PDF documents.
<div class="tool-grid">
- [**Encrypt PDF**](./encrypt-pdf) — Lock your PDF by adding a password.
- [**Encrypt PDF**](./protect-pdf) — Lock your PDF by adding a password.
- [**Sanitize PDF**](./sanitize-pdf) — Remove metadata, annotations, scripts, and more.
- [**Decrypt PDF**](./decrypt-pdf) — Unlock PDF by removing password protection.
- [**Decrypt PDF**](./unlock-pdf) — Unlock PDF by removing password protection.
- [**Flatten PDF**](./flatten-pdf) — Make form fields and annotations non-editable.
- [**Remove Metadata**](./remove-metadata) — Strip hidden data from your PDF.
- [**Change Permissions**](./change-permissions) — Set or change user permissions on a PDF.
+1 -1
View File
@@ -39,5 +39,5 @@ Converts PDF files to Markdown (`.md`) format, preserving headings, paragraphs,
## Related Tools
- [PDF to Text](./pdf-to-text)
- [PDF to Word](./pdf-to-docx)
- [PDF to Word](./pdf-to-word)
- [Prepare PDF for AI](./prepare-pdf-for-ai)
+1 -1
View File
@@ -40,4 +40,4 @@ This tool has no configurable options. All text content is extracted from every
- [PDF to Markdown](./pdf-to-markdown)
- [Prepare PDF for AI](./prepare-pdf-for-ai)
- [PDF to Word](./pdf-to-docx)
- [PDF to Word](./pdf-to-word)
@@ -58,7 +58,7 @@ AES-256 is computationally infeasible to brute-force with current technology. Th
## Related Tools
- [Decrypt PDF](./decrypt-pdf) -- remove encryption when you know the password
- [Decrypt PDF](./unlock-pdf) -- remove encryption when you know the password
- [Change Permissions](./change-permissions) -- modify specific usage restrictions
- [Remove Restrictions](./remove-restrictions) -- strip all security from a PDF
- [Sanitize PDF](./sanitize-pdf) -- remove hidden content before encrypting
+1 -1
View File
@@ -46,5 +46,5 @@ No options to configure. The tool is thorough by design: it clears everything.
## Related Tools
- [Sanitize PDF](./sanitize-pdf) -- remove metadata plus scripts, attachments, and more
- [Encrypt PDF](./encrypt-pdf) -- protect the cleaned PDF with a password
- [Encrypt PDF](./protect-pdf) -- protect the cleaned PDF with a password
- [Compress PDF](./compress-pdf) -- removing metadata can slightly reduce file size; compress for more savings
+2 -2
View File
@@ -40,6 +40,6 @@ The tool uses QPDF's `--decrypt` and `--remove-restrictions` flags to produce a
## Related Tools
- [Decrypt PDF](./decrypt-pdf) -- unlock a PDF when you know the user password
- [Encrypt PDF](./encrypt-pdf) -- re-apply encryption with new settings
- [Decrypt PDF](./unlock-pdf) -- unlock a PDF when you know the user password
- [Encrypt PDF](./protect-pdf) -- re-apply encryption with new settings
- [Change Permissions](./change-permissions) -- selectively modify which actions are allowed
+1 -1
View File
@@ -49,5 +49,5 @@ All options are enabled by default. Uncheck any you want to preserve.
- [Remove Metadata](./remove-metadata) -- strip only metadata without touching other content
- [Flatten PDF](./flatten-pdf) -- flatten forms and annotations specifically
- [Encrypt PDF](./encrypt-pdf) -- add password protection after sanitizing
- [Encrypt PDF](./protect-pdf) -- add password protection after sanitizing
- [Rasterize PDF](./rasterize-pdf) -- the nuclear option: convert to images to eliminate all hidden content
@@ -41,6 +41,6 @@ If you have the password to an encrypted PDF, this tool removes the encryption e
## Related Tools
- [Encrypt PDF](./encrypt-pdf) -- re-apply encryption with a new password
- [Encrypt PDF](./protect-pdf) -- re-apply encryption with a new password
- [Remove Restrictions](./remove-restrictions) -- remove usage restrictions without full decryption
- [Change Permissions](./change-permissions) -- modify specific permissions on an encrypted PDF
+4 -2
View File
@@ -12,7 +12,7 @@
/>
<meta
name="description"
content="★ Free online PDF tools - Merge, split, compress, convert PDFs ★ 100% browser-based ★ No signup required ★ Unlimited files ★ Privacy-first & secure ★ Works offline ★ 100+ PDF tools"
content="Free online PDF tools that run entirely in your browser. Merge, split, compress, convert, and edit PDFs. No uploads, no signup, no file limits."
/>
<meta
name="keywords"
@@ -395,7 +395,9 @@
<div
id="tool-grid"
class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4 md:gap-6"
></div>
>
{{> tool-links-static }}
</div>
</div>
<div
+34 -3
View File
@@ -68,18 +68,45 @@ http {
return 301 /docs/$1$2;
}
if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pt|ru|sv|tr|vi|zh|zh-TW|uk|ja))?/index\.html(\?.*)?$) {
if ($request_uri ~ ^/docs/tools/pdf-to-docx/?(\?.*)?$) {
return 301 /docs/tools/pdf-to-word$1;
}
if ($request_uri ~ ^/docs/tools/decrypt-pdf/?(\?.*)?$) {
return 301 /docs/tools/unlock-pdf$1;
}
if ($request_uri ~ ^/docs/tools/encrypt-pdf/?(\?.*)?$) {
return 301 /docs/tools/protect-pdf$1;
}
if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja))?/index\.html(\?.*)?$) {
return 301 $1/$2;
}
if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pt|ru|sv|tr|vi|zh|zh-TW|uk|ja))?/([a-z0-9][a-z0-9-]*)\.html(\?.*)?$) {
if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja))?/pdf-to-docx(?:\.html)?/?(\?.*)?$) {
return 301 $1/pdf-to-word$2;
}
if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja))?/decrypt-pdf(?:\.html)?/?(\?.*)?$) {
return 301 $1/unlock-pdf$2;
}
if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja))?/encrypt-pdf(?:\.html)?/?(\?.*)?$) {
return 301 $1/protect-pdf$2;
}
if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja))?/([a-z0-9][a-z0-9-]*)\.html(\?.*)?$) {
return 301 $1/$2$3;
}
if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja))/([a-z0-9][a-z0-9-]*)/(\?.*)?$) {
return 301 $1/$2$3;
}
if ($request_uri ~ ^/((?!(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|docs|blog)/)[a-z0-9][a-z0-9-]*)/(\?.*)?$) {
return 301 /$1$2;
}
location ~ /src/pages/ {
return 404;
}
location ~ ^/(en|ar|be|da|de|es|fr|id|it|ko|nl|pt|ru|sv|tr|vi|zh|zh-TW|uk|ja)(/.*)?$ {
location ~ ^/(en|ar|be|da|de|es|fr|id|it|ko|nl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja)(/.*)?$ {
try_files $uri $uri/ $uri.html =404;
expires 5m;
}
@@ -106,6 +133,10 @@ http {
expires 1y;
}
location ~ ^/((sw\.js|coherentpdf\.browser\.min\.js|qpdf\.wasm)$|(workers|pdfjs-viewer|pdfjs-annotation-viewer)/) {
expires epoch;
}
location ~* \.(wasm|wasm\.gz|data|data\.gz)$ {
expires 1y;
}
+3 -2
View File
@@ -1,12 +1,12 @@
{
"name": "bento-pdf",
"version": "2.8.7",
"version": "2.8.8",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "bento-pdf",
"version": "2.8.7",
"version": "2.8.8",
"license": "AGPL-3.0-only",
"dependencies": {
"@fontsource/cedarville-cursive": "^5.2.7",
@@ -102,6 +102,7 @@
"husky": "^9.1.7",
"jsdom": "^28.1.0",
"lint-staged": "^16.3.1",
"marked": "^16.4.2",
"prettier": "^3.8.1",
"typescript": "~5.9.3",
"typescript-eslint": "^8.56.1",
+2 -1
View File
@@ -6,7 +6,7 @@
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build && NODE_OPTIONS='--max-old-space-size=3072' node scripts/generate-i18n-pages.mjs && node scripts/generate-sitemap.mjs && node scripts/generate-security-headers.mjs && node scripts/seo-audit.mjs",
"build": "node scripts/generate-blog.mjs && node scripts/generate-static-tool-links.mjs && tsc && vite build && node scripts/enhance-seo-pages.mjs && NODE_OPTIONS='--max-old-space-size=3072' node scripts/generate-i18n-pages.mjs && node scripts/generate-sitemap.mjs && node scripts/generate-security-headers.mjs && node scripts/seo-audit.mjs",
"seo-audit": "node scripts/seo-audit.mjs",
"build:with-docs": "npm run build && npm run docs:build && node scripts/include-docs-in-dist.js",
"build:gzip": "COMPRESSION_MODE=g npm run build",
@@ -60,6 +60,7 @@
"husky": "^9.1.7",
"jsdom": "^28.1.0",
"lint-staged": "^16.3.1",
"marked": "^16.4.2",
"prettier": "^3.8.1",
"typescript": "~5.9.3",
"typescript-eslint": "^8.56.1",
+122 -26
View File
@@ -193,7 +193,7 @@
<h3 class="font-semibold text-white">JSON to PDF</h3>
<p class="text-gray-400 text-sm">Data to PDF</p>
</a>
<a href="/pdf-to-docx" class="tool-card">
<a href="/pdf-to-word" class="tool-card">
<i
class="ph ph-microsoft-word-logo text-4xl text-indigo-400 mb-2"
></i>
@@ -425,48 +425,144 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Are these pdf converter tools really free?
<i class="ph ph-caret-down text-xl"></i>
</summary>
<p class="faq-d-a">
Yes! All BentoPDF pdf converter tools are 100% free with no hidden
fees, no premium tiers, and no subscription required. Use
unlimited tools, unlimited times.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Which file formats can I convert to PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens entirely in your browser. Your
files never leave your device, are never uploaded to servers.
Complete privacy guaranteed.
Word, Excel, and PowerPoint files (including the older DOC, XLS,
and PPT formats), OpenDocument text, spreadsheets, presentations,
and drawings, RTF, plain text, Markdown, CSV, XML, ebooks in EPUB,
MOBI, FB2, and CBZ, XPS, Publisher, Visio, WordPerfect, Microsoft
Works, Apple Pages, and images in JPG, PNG, HEIC, WebP, TIFF, BMP,
SVG, and PSD. If you have a folder of mixed image types,
<a
href="/image-to-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Images to PDF</a
>
accepts them all in one batch and puts each image on its own page.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
What can I convert a PDF into?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No file size limits! Process files of any size. Browser-based
processing means no artificial limitations.
Word (DOCX), Excel (XLSX), CSV, plain text, Markdown, SVG, and
page images in JPG, PNG, WebP, TIFF, or BMP, with multi-page PDFs
delivered as a ZIP holding one image per page. For long-term
archiving,
<a
href="/pdf-to-pdfa"
class="text-indigo-300 hover:text-indigo-400"
>PDF to PDF/A</a
>
outputs PDF/A-1b, 2b, or 3b, and a separate tool turns a color PDF
into a grayscale one.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Do I need to install software?
Does PDF to Word keep the layout?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No installation required! All tools are web-based and work
directly in your browser. Just open the page and start using -
works on any device.
<a
href="/pdf-to-word"
class="text-indigo-300 hover:text-indigo-400"
>PDF to Word</a
>
rebuilds the document with its text, basic formatting, and general
layout, and it can convert a batch of files in one run. Pages with
multiple columns, embedded forms, or heavy graphics may not come
across perfectly, so expect to tidy those up in your word
processor.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why is my converted Word or text file empty?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The PDF is almost certainly a scan, which stores each page as a
picture with no text layer, so PDF to Word, PDF to Text, and the
table converters have nothing to pull out. Run the file through
<a href="/ocr-pdf" class="text-indigo-300 hover:text-indigo-400"
>OCR PDF</a
>
first to add a searchable text layer, then convert the result.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I get tables out of a PDF into Excel?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
<a
href="/pdf-to-excel"
class="text-indigo-300 hover:text-indigo-400"
>PDF to Excel</a
>
scans every page for tables and writes each one to its own
worksheet, named after the page it came from. If it reports that
no tables were found, the PDF lays the data out as loose text
rather than a real table structure; PDF to CSV and Extract Tables
rely on the same detection, so try PDF to Text to grab the raw
content instead.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Do I need Microsoft Office installed to convert Word, Excel, or
PowerPoint files?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Those files, along with Publisher, Visio, RTF, and
WordPerfect, are converted by a LibreOffice engine that runs
inside your browser, so there's nothing to install;
<a
href="/word-to-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Word to PDF</a
>, for example, also takes DOC, ODT, and RTF directly. The engine
downloads once per session, which makes the first conversion take
a few seconds longer than the ones after it.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Will converting a PDF to JPG or PNG lose quality?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Pages are rendered at twice their native size, so a letter-size
page becomes an image of roughly 1,224 by 1,584 pixels.
<a
href="/pdf-to-jpg"
class="text-indigo-300 hover:text-indigo-400"
>PDF to JPG</a
>
is lossy with a quality slider that defaults to 90%, which keeps a
good balance between sharpness and file size; PDF to PNG and PDF
to TIFF are lossless, and PNG adds a scale control from 1x to 3x
for print-quality output.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files uploaded to a server during conversion?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Every converter on this page, including the Office, ebook, and
image converters, runs as WebAssembly inside your browser tab, so
the file is read from your device and the result is written
straight back to it. There's no upload queue, no server copy, and
nothing to delete afterward.
</p>
</details>
</div>
+124 -28
View File
@@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Primary Meta Tags -->
<title>PDF Editor - Free Online PDF Editor Tools | BentoPDF</title>
<title>PDF Editing Tools - All Free Online PDF Editors | BentoPDF</title>
<meta
name="description"
content="Edit, modify, and enhance your PDFs with 25+ free online tools. Compress, rotate, crop, add watermarks, page numbers, and more. Privacy-first PDF editing in your browser."
@@ -25,7 +25,7 @@
<meta property="og:url" content="https://www.bentopdf.com/pdf-editor" />
<meta
property="og:title"
content="PDF Editor - Free Online PDF Editor Tools | BentoPDF"
content="PDF Editing Tools - All Free Online PDF Editors | BentoPDF"
/>
<meta
property="og:description"
@@ -41,7 +41,10 @@
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="PDF Editor - Free Online Tools" />
<meta
name="twitter:title"
content="PDF Editing Tools - All Free Online PDF Editors | BentoPDF"
/>
<meta
name="twitter:description"
content="Edit, modify, and enhance your PDFs with 25+ free online tools. Compress, rotate, crop, add watermarks, page numbers, and more. Privacy-first PDF editing in your browser."
@@ -299,48 +302,141 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Are these pdf editor tools really free?
<i class="ph ph-caret-down text-xl"></i>
</summary>
<p class="faq-d-a">
Yes! All BentoPDF pdf editor tools are 100% free with no hidden
fees, no premium tiers, and no subscription required. Use
unlimited tools, unlimited times.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Can I change the existing text in a PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens entirely in your browser. Your
files never leave your device, are never uploaded to servers.
Complete privacy guaranteed.
<a
href="/edit-pdf-text"
class="text-indigo-300 hover:text-indigo-400"
>Edit PDF Text</a
>
lets you click any paragraph and rewrite it in place, with the
surrounding text reflowing as you type and controls for fonts and
styling. For adding new text boxes, comments, highlights, shapes,
or images on top of the page, use the general Edit PDF tool
instead.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
What can I do in the Edit PDF tool?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No file size limits! Process files of any size. Browser-based
processing means no artificial limitations.
The
<a href="/edit-pdf" class="text-indigo-300 hover:text-indigo-400"
>Edit PDF</a
>
toolbar covers highlighting, underlining, strikethrough, freehand
drawing, text and comments, shapes and images, permanent
redaction, and full-text search. It keeps the original PDF
structure, so fonts, layouts, and form fields stay intact, and you
can keep up to 10 documents open in tabs and switch between them.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Do I need to install software?
How do I make a PDF smaller?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No installation required! All tools are web-based and work
directly in your browser. Just open the page and start using -
works on any device.
<a
href="/compress-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Compress PDF</a
>
offers two methods. Condense strips unused structure, downsamples
images to a target DPI, and subsets fonts while keeping text
selectable and links working; Photon re-renders each page as a
JPEG, which saves more on scans and photo-heavy files but leaves
text unselectable. Start with the Balanced level and only step up
to Aggressive or Extreme if the file is still too large.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Which editing tools keep my text selectable?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Page-level tools such as Rotate, Organize, Delete Pages,
Background Color, and Remove Annotations work on the PDF structure
and leave text searchable. Invert Colors, Change Text Color, and
PDF to Greyscale re-render every page as an image, so text in
their output can no longer be selected or searched, and the Photon
compression mode does the same. If you need searchable text after
one of those, run the result through
<a href="/ocr-pdf" class="text-indigo-300 hover:text-indigo-400"
>OCR PDF</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I add page numbers or a header and footer?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
<a
href="/page-numbers"
class="text-indigo-300 hover:text-indigo-400"
>Page Numbers</a
>
puts a number in any of six positions on every page, in plain or
"page X of Y" style, with your choice of font size and color.
Header and Footer adds text to six slots per page (left, center,
and right at top and bottom), understands {page} and {total}
placeholders so a footer like "Page {page} of {total}" fills in
correctly on each page, and can be limited to a page range.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I put a watermark on every page?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
<a
href="/add-watermark"
class="text-indigo-300 hover:text-indigo-400"
>Add Watermark</a
>
stamps text or an image onto your pages, and you position it by
dragging on a live preview, then set opacity, rotation, and size.
A tiled mode repeats the mark across the whole page so it's much
harder to crop out, and you can apply one watermark to all pages,
restrict it to a page range, or set a different watermark on each
page.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I rotate a single page, or fix a slightly tilted scan?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
<a
href="/rotate-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Rotate PDF</a
>
shows a thumbnail of every page with its own left and right
buttons for 90-degree turns, plus a bulk control for the whole
document. For a scan that's off by a few degrees, Rotate by Custom
Degrees accepts any angle, per page or for all pages at once.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does editing a PDF here upload it anywhere?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The editor and every other tool on this page run as
WebAssembly inside your browser, so the file is opened, changed,
and saved on your own device without a server in between. Nothing
is stored, so there's no copy to delete when you're done.
</p>
</details>
</div>
+119 -25
View File
@@ -254,48 +254,142 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Are these pdf merge & split tools really free?
<i class="ph ph-caret-down text-xl"></i>
</summary>
<p class="faq-d-a">
Yes! All BentoPDF pdf merge & split tools are 100% free with no
hidden fees, no premium tiers, and no subscription required. Use
unlimited tools, unlimited times.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
How do I combine several PDFs into one file?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens entirely in your browser. Your
files never leave your device, are never uploaded to servers.
Complete privacy guaranteed.
Add two or more files to
<a href="/merge-pdf" class="text-indigo-300 hover:text-indigo-400"
>Merge PDF</a
>
and drag them into the order you want. File Mode joins whole
documents, with an optional page range per file such as 1-3, 5,
while Page Mode lays out every page as a thumbnail so you can
build the exact sequence. There's no cap on file count or total
pages, and pages are copied without re-encoding, so quality
doesn't change.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
What are the different ways to split a PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No file size limits! Process files of any size. Browser-based
processing means no artificial limitations.
<a href="/split-pdf" class="text-indigo-300 hover:text-indigo-400"
>Split PDF</a
>
has six modes: page ranges, visual selection from thumbnails, even
or odd pages only, one file per page, splitting at bookmark
boundaries with a choice of bookmark level, and fixed chunks of
every N pages. A single range downloads as one PDF, while multiple
ranges or per-page output arrive as a ZIP. Bookmark mode needs a
PDF that actually contains bookmarks.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Do I need to install software?
What's the difference between Split, Extract Pages, and Delete
Pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No installation required! All tools are web-based and work
directly in your browser. Just open the page and start using -
works on any device.
<a
href="/extract-pages"
class="text-indigo-300 hover:text-indigo-400"
>Extract Pages</a
>
keeps only the pages you list and saves them as a new file, Delete
Pages removes the pages you list and keeps everything else, and
Split breaks one document into several files. Extract and Delete
are inverses of each other, so pick whichever needs the shorter
list of page numbers.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I reorder pages or duplicate a page?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
<a
href="/organize-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Organize PDF</a
>
shows every page as a draggable thumbnail with a duplicate and a
delete button on each one. You can also type a complete page order
such as 3, 1, 2, 4 to rearrange everything in one step, and
Reverse Pages flips an entire document, or a batch of them, in one
click.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
My scanner put all the front pages first and all the backs after.
How do I fix the order?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
<a
href="/duplex-collate"
class="text-indigo-300 hover:text-indigo-400"
>Duplex Collate</a
>
handles exactly that: it interleaves the two blocks into front 1,
back 1, front 2, back 2 order, with an option to reverse the back
block for stacks that were flipped before the second pass. If the
fronts and backs are in two separate files, Alternate Merge
interleaves pages from multiple PDFs the same way.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How do I print a PDF as a folded booklet?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
<a
href="/pdf-booklet"
class="text-indigo-300 hover:text-indigo-400"
>PDF Booklet</a
>
reorders the pages into saddle-stitch imposition and shows a
preview of each sheet before you download. Print the result
double-sided with "flip on short edge", fold the stack in half,
and staple at the spine; if the page count isn't a multiple of
four, blank pages are added automatically to fill the last sheet.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I see what changed between two versions of a PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
<a
href="/compare-pdfs"
class="text-indigo-300 hover:text-indigo-400"
>Compare PDFs</a
>
pairs up the pages of two documents and highlights differences in
text, images, annotations, headers and footers, and formatting, in
either a side-by-side or an overlay view. Filters let you hide the
change types you don't care about, OCR can be switched on for
scanned documents, and the comparison can be exported as a PDF
report.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files uploaded when I merge or split them?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Merging, splitting, and reordering run as WebAssembly inside
your browser, so the files are read from your disk and the result
is written back to it without passing through a server. That holds
for large scans and multi-file batches too.
</p>
</details>
</div>
+127 -27
View File
@@ -111,12 +111,12 @@
<div
class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4"
>
<a href="/encrypt-pdf" class="tool-card">
<a href="/protect-pdf" class="tool-card">
<i class="ph ph-lock text-4xl text-indigo-400 mb-2"></i>
<h3 class="font-semibold text-white">Encrypt PDF</h3>
<p class="text-gray-400 text-sm">Add password</p>
</a>
<a href="/decrypt-pdf" class="tool-card">
<a href="/unlock-pdf" class="tool-card">
<i class="ph ph-lock-open text-4xl text-indigo-400 mb-2"></i>
<h3 class="font-semibold text-white">Decrypt PDF</h3>
<p class="text-gray-400 text-sm">Remove password</p>
@@ -229,48 +229,148 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Are these PDF security tools really free?
<i class="ph ph-caret-down text-xl"></i>
</summary>
<p class="faq-d-a">
Yes! All BentoPDF PDF security tools are 100% free with no hidden
fees, no premium tiers, and no subscription required. Use
unlimited tools, unlimited times.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
What's the difference between protecting a PDF with a password and
restricting its permissions?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens entirely in your browser. Your
files never leave your device and are never uploaded to servers.
Complete privacy is guaranteed.
A user password, set with
<a
href="/protect-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Protect PDF</a
>, is required to open the file at all. Permissions are flags
stored inside the encryption that control what a reader can do
after opening, such as printing, copying, editing, annotating, or
filling forms, and they only take effect when an owner password is
set. Change Permissions lets you allow or deny each action
individually, while Protect PDF applies the strictest set as soon
as you add an owner password.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
How strong is the password protection?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No file size limits! Process files of any size. Browser-based
processing means no artificial limitations.
Protect PDF and Change Permissions use 256-bit AES encryption, the
PDF 2.0 standard, applied by QPDF running in your browser. The
encryption itself isn't practical to brute-force, so the weak
point is the password: use a long passphrase and send it through a
different channel than the file. Permission flags are a separate
matter, since they rely on the reader honoring them and some
third-party tools ignore them.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Do I need to install software?
Can I remove a password from a PDF if I don't know it?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No installation required! All tools are web-based and work
directly in your browser. Just open the page and start using -
works on any device.
No.
<a
href="/unlock-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Unlock PDF</a
>
needs the password and then saves a copy with no encryption or
restrictions left, and none of the tools crack or brute-force
passwords. For a file that opens fine but blocks printing or
copying, use Remove Restrictions instead, which asks for the owner
password if the file has one.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What's the difference between Sign PDF and a digital signature?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Sign PDF places a drawn, typed, or uploaded signature image on the
page, with an option to flatten it so nobody can move or delete it
later.
<a
href="/digital-sign-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Digital Signature</a
>
applies a cryptographic signature with your own X.509 certificate
(.pfx, .p12, or .pem), which proves who signed and that the file
hasn't changed since, and Validate Signature checks signatures
already in a file. Certificate signing may need an internet
connection to fetch the certificate chain, and self-signed
certificates will show warnings in Adobe Reader.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How do I redact text so it's actually gone?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Use the redaction tool in the
<a href="/edit-pdf" class="text-indigo-300 hover:text-indigo-400"
>PDF Editor</a
>, which permanently removes the marked content from the page
instead of just covering it with a box. Redaction only deals with
what's on the page, so if the file's properties, comments, or
attachments could reveal the same information, run Remove Metadata
or Sanitize PDF on the result as well.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What's the difference between Remove Metadata and Sanitize PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
<a
href="/remove-metadata"
class="text-indigo-300 hover:text-indigo-400"
>Remove Metadata</a
>
strips only the document properties: title, author, dates,
producer, XMP data, document IDs, and application-specific data,
and it leaves pages, forms, links, and bookmarks untouched.
Sanitize PDF goes further and can also flatten forms and delete
annotations, embedded JavaScript, attachments, layers, links, and
structure tags, with each item selectable. Both are irreversible,
so keep your original file.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What does flattening a PDF do, and when should I use it?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
<a
href="/flatten-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Flatten PDF</a
>
burns form fields and annotations (comments, highlights, stamps,
sticky notes, signature fields) into the page content, so they
look the same but can no longer be edited, moved, or removed. Use
it after a form is filled in or a signature is placed and before
you send the file, because there's no way to unflatten. Text stays
selectable and searchable, and bookmarks are kept.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my passwords, certificates, or files sent to a server?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Encrypting, unlocking, sanitizing, and signing all run as
WebAssembly in your browser, so the document, the password you
type, and your certificate's private key stay on your device. The
one network exception is Digital Signature, which may contact your
certificate authority's servers to fetch the certificate chain;
the document itself is still never sent.
</p>
</details>
</div>
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "نعم! فعّل خيار \"التكرار\" وستتكرر صفحات التراكب على جميع صفحات الملف الأساسي. العلامة المائية ذات الصفحة الواحدة ستُطبق على كل صفحة.",
"faqPrivacyQuestion": "هل ملفاتي خاصة وآمنة؟",
"faqPrivacyAnswer": "بالتأكيد! تتم جميع المعالجة في متصفحك. لا تغادر ملفاتك جهازك أبداً، مما يضمن خصوصية كاملة."
},
"unlockPdf": {
"name": "فك تشفير PDF",
"subtitle": "فتح PDF بإزالة حماية كلمة المرور."
},
"protectPdf": {
"name": "تشفير PDF",
"subtitle": "قفل PDF بإضافة كلمة مرور."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Так! Уключыце опцыю \"Паўтараць\" і старонкі накладання будуць паўтарацца на ўсіх старонках базавага файла. Аднастаронкавы вадзяны знак будзе прымяняцца да кожнай старонкі.",
"faqPrivacyQuestion": "Ці з'яўляюцца мае файлы прыватнымі і бяспечнымі?",
"faqPrivacyAnswer": "Безумоўна! Уся апрацоўка адбываецца ў вашым браўзеры. Вашы файлы ніколі не пакідаюць вашу прыладу, забяспечваючы поўную прыватнасць."
},
"unlockPdf": {
"name": "Расшыфраваць PDF",
"subtitle": "Разблакіраваць PDF, выдаліўшы пароль."
},
"protectPdf": {
"name": "Зашыфраваць PDF",
"subtitle": "Заблакіраваць PDF, дадаўшы пароль."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Ja! Aktivér \"Gentag\"-indstillingen, og dine overlejringssider vil gentage sig på alle basis-sider. Et enkeltsidigt vandmærke vil blive anvendt på hver side.",
"faqPrivacyQuestion": "Er mine filer private og sikre?",
"faqPrivacyAnswer": "Absolut! Al behandling sker i din browser. Dine filer forlader aldrig din enhed, hvilket sikrer fuldstændig privatliv."
},
"unlockPdf": {
"name": "Dekryptér PDF",
"subtitle": "Fjern adgangskodebeskyttelse."
},
"protectPdf": {
"name": "Kryptér PDF",
"subtitle": "Lås din PDF med en adgangskode."
}
}
+8
View File
@@ -1311,5 +1311,13 @@
"faqSinglePageAnswer": "Ja! Aktivieren Sie die Option \"Wiederholen\" und Ihre Überlagerungsseiten werden auf allen Basisseiten wiederholt. Ein einseitiges Wasserzeichen wird auf jeder Seite angewendet.",
"faqPrivacyQuestion": "Sind meine Dateien privat und sicher?",
"faqPrivacyAnswer": "Absolut! Die gesamte Verarbeitung findet in Ihrem Browser statt. Ihre Dateien verlassen niemals Ihr Gerät, was vollständige Privatsphäre gewährleistet."
},
"unlockPdf": {
"name": "PDF entschlüsseln",
"subtitle": "PDF durch Entfernen des Passwortschutzes entsperren."
},
"protectPdf": {
"name": "PDF verschlüsseln",
"subtitle": "Ihre PDF durch Hinzufügen eines Passworts sperren."
}
}
+8
View File
@@ -1313,5 +1313,13 @@
"faqSinglePageAnswer": "Yes! Enable the \"Loop\" option and your overlay PDF pages will repeat across all base pages. A single-page watermark will apply to every page.",
"faqPrivacyQuestion": "Are my files private and secure?",
"faqPrivacyAnswer": "Absolutely! All processing happens in your browser. Your files never leave your device, ensuring complete privacy."
},
"unlockPdf": {
"name": "Unlock PDF",
"subtitle": "Remove the password from a PDF so it opens freely. Requires the current password."
},
"protectPdf": {
"name": "Protect PDF",
"subtitle": "Password protect a PDF with strong AES encryption."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "¡Sí! Active la opción \"Repetir\" y las páginas de superposición se repetirán en todas las páginas base. Una marca de agua de una página se aplicará a cada página.",
"faqPrivacyQuestion": "¿Mis archivos son privados y seguros?",
"faqPrivacyAnswer": "¡Por supuesto! Todo el procesamiento ocurre en su navegador. Sus archivos nunca abandonan su dispositivo, garantizando total privacidad."
},
"unlockPdf": {
"name": "Descifrar PDF",
"subtitle": "Desbloquea PDF eliminando la protección por contraseña."
},
"protectPdf": {
"name": "Cifrar PDF",
"subtitle": "Bloquea tu PDF agregando una contraseña."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Oui ! Activez l'option \"Répéter\" et vos pages de superposition se répéteront sur toutes les pages de base. Un filigrane d'une seule page s'appliquera à chaque page.",
"faqPrivacyQuestion": "Mes fichiers sont-ils privés et sécurisés ?",
"faqPrivacyAnswer": "Absolument ! Tout le traitement se fait dans votre navigateur. Vos fichiers ne quittent jamais votre appareil, garantissant une confidentialité totale."
},
"unlockPdf": {
"name": "Déverrouiller un PDF",
"subtitle": "Supprimer la protection par mot de passe."
},
"protectPdf": {
"name": "Chiffrer un PDF",
"subtitle": "Protéger le PDF en ajoutant un mot de passe."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Ya! Aktifkan opsi \"Ulangi\" dan halaman overlay Anda akan berulang di semua halaman dasar. Watermark satu halaman akan diterapkan ke setiap halaman.",
"faqPrivacyQuestion": "Apakah file saya pribadi dan aman?",
"faqPrivacyAnswer": "Tentu saja! Semua pemrosesan terjadi di browser Anda. File Anda tidak pernah meninggalkan perangkat Anda, memastikan privasi penuh."
},
"unlockPdf": {
"name": "Dekripsi PDF",
"subtitle": "Buka kunci PDF dengan menghapus perlindungan kata sandi."
},
"protectPdf": {
"name": "Enkripsi PDF",
"subtitle": "Kunci PDF Anda dengan menambahkan kata sandi."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Sì! Attiva l'opzione \"Ripeti\" e le pagine di sovrapposizione si ripeteranno su tutte le pagine base. Una filigrana di una pagina verrà applicata a ogni pagina.",
"faqPrivacyQuestion": "I miei file sono privati e sicuri?",
"faqPrivacyAnswer": "Assolutamente! Tutta l'elaborazione avviene nel tuo browser. I tuoi file non lasciano mai il tuo dispositivo, garantendo la massima privacy."
},
"unlockPdf": {
"name": "Decrittografa PDF",
"subtitle": "Sblocca il PDF rimuovendo la protezione tramite password."
},
"protectPdf": {
"name": "Cripta PDF",
"subtitle": "Proteggi il tuo PDF aggiungendo una password."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "はい! 「ループ」オプションを有効にすると、オーバーレイPDFページがすべてのベース ページにわたって繰り返されます。単一ページのウォーターマークはすべてのページに適用されます。",
"faqPrivacyQuestion": "私のファイルは非公開で安全ですか?",
"faqPrivacyAnswer": "絶対に!すべての処理はブラウザ内で行われます。ファイルがデバイスの外に出ることはなく、完全なプライバシーが確保されます。"
},
"unlockPdf": {
"name": "PDFの復号化",
"subtitle": "パスワード保護を解除してPDFのロックを解除します。"
},
"protectPdf": {
"name": "PDFの暗号化",
"subtitle": "パスワードを追加してPDFをロックします。"
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "네! \"반복\" 옵션을 활성화하면 오버레이 페이지가 모든 기본 페이지에 반복됩니다. 단일 페이지 워터마크가 모든 페이지에 적용됩니다.",
"faqPrivacyQuestion": "내 파일은 비공개이고 안전한가요?",
"faqPrivacyAnswer": "물론입니다! 모든 처리는 브라우저에서 이루어집니다. 파일이 기기를 떠나지 않아 완전한 개인정보 보호가 보장됩니다."
},
"unlockPdf": {
"name": "PDF 복호화",
"subtitle": "비밀번호를 제거하여 PDF 잠금을 해제합니다."
},
"protectPdf": {
"name": "PDF 암호화",
"subtitle": "비밀번호를 설정하여 PDF를 보호합니다."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Ja! Schakel de optie \"Herhalen\" in en de overlay-pagina's worden herhaald over alle basispagina's. Een watermerk van één pagina wordt op elke pagina toegepast.",
"faqPrivacyQuestion": "Zijn mijn bestanden privé en veilig?",
"faqPrivacyAnswer": "Absoluut! Alle verwerking vindt plaats in jouw browser. Jouw bestanden verlaten nooit jouw apparaat, wat volledige privacy garandeert."
},
"unlockPdf": {
"name": "PDF Ontgrendelen",
"subtitle": "Een PDF ontgrendelen door het verwijderen van de wachtwoordbeveiliging."
},
"protectPdf": {
"name": "PDF Versleutelen",
"subtitle": "Een PDF vergrendelen door toevoeging van een toegangswachtwoord."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Sim! Ative a opção \"Repetir\" e as páginas de sobreposição se repetirão em todas as páginas base. Uma marca d'água de uma página será aplicada a cada página.",
"faqPrivacyQuestion": "Os meus ficheiros são privados e seguros?",
"faqPrivacyAnswer": "Com certeza! Todo o processamento acontece no seu navegador. Os seus ficheiros nunca saem do seu dispositivo, garantindo total privacidade."
},
"unlockPdf": {
"name": "Descriptografar PDF",
"subtitle": "Desbloqueie o PDF removendo a proteção por senha."
},
"protectPdf": {
"name": "Criptografar PDF",
"subtitle": "Bloqueie seu PDF adicionando uma senha."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Да! Включите опцию \"Повтор\" и страницы наложения будут повторяться на всех страницах базового файла. Одностраничный водяной знак будет применён к каждой странице.",
"faqPrivacyQuestion": "Мои файлы конфиденциальны и защищены?",
"faqPrivacyAnswer": "Безусловно! Вся обработка происходит в вашем браузере. Ваши файлы никогда не покидают ваше устройство, обеспечивая полную конфиденциальность."
},
"unlockPdf": {
"name": "Расшифровка документа",
"subtitle": "Снять защиту документа, удалив пароль."
},
"protectPdf": {
"name": "Шифрование документа",
"subtitle": "Защитить документ с помощью пароля."
}
}
+8
View File
@@ -1311,5 +1311,13 @@
"faqSinglePageAnswer": "Áno! Zapnite možnosť \"Opakovať\" a vaše PDF na prekrytie sa bude opakovať na všetkých stranách základu. Jednostranový vodoznak sa aplikuje na každú stranu.",
"faqPrivacyQuestion": "Sú moje súbory v súkromí a v bezpečí?",
"faqPrivacyAnswer": "Absolútne! Všetko spracovanie prebieha vo vašom prehliadači. Vaše súbory nikdy neopustia vaše zariadenie, čo zabezpečuje úplné súkromie."
},
"unlockPdf": {
"name": "Dešifrovať PDF",
"subtitle": "Odomknúť PDF odstránením ochrany heslom."
},
"protectPdf": {
"name": "Zašifrovať PDF",
"subtitle": "Uzamknúť vaše PDF pridaním hesla."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Ja! Aktivera alternativet \"Upprepa\" och dina överläggsidor upprepas på alla bassidor. En ensidig vattenstämpel tillämpas på varje sida.",
"faqPrivacyQuestion": "Är mina filer privata och säkra?",
"faqPrivacyAnswer": "Absolut! All bearbetning sker i din webbläsare. Dina filer lämnar aldrig din enhet, vilket garanterar fullständig integritet."
},
"unlockPdf": {
"name": "Dekryptera PDF",
"subtitle": "Lås upp PDF genom att ta bort lösenordsskydd."
},
"protectPdf": {
"name": "Kryptera PDF",
"subtitle": "Lås din PDF genom att lägga till ett lösenord."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Evet! \"Tekrarla\" seçeneğini etkinleştirin ve üst katman sayfalarınız tüm temel sayfalarda tekrarlanır. Tek sayfalık bir filigran her sayfaya uygulanır.",
"faqPrivacyQuestion": "Dosyalarım gizli ve güvende mi?",
"faqPrivacyAnswer": "Kesinlikle! Tüm işleme tarayıcınızda gerçekleşir. Dosyalarınız cihazınızı asla terk etmez, tam gizlilik sağlanır."
},
"unlockPdf": {
"name": "PDF'nin Şifresini Çöz",
"subtitle": "Şifre korumasını kaldırarak PDF'nin kilidini açın."
},
"protectPdf": {
"name": "PDF'yi Şifrele",
"subtitle": "PDF'nizi şifre ekleyerek koruyun."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Так! Увімкніть опцію «Повторювати», і сторінки накладання будуть застосовані до всіх сторінок. Один водяний знак — на всі сторінки.",
"faqPrivacyQuestion": "Чи безпечні мої файли?",
"faqPrivacyAnswer": "Так! Уся обробка відбувається у вашому браузері. Файли не покидають ваш пристрій."
},
"unlockPdf": {
"name": "Розблокувати PDF",
"subtitle": "Видалити пароль і зняти захист PDF."
},
"protectPdf": {
"name": "Зашифрувати PDF",
"subtitle": "Захистити PDF паролем."
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "Có! Bật tùy chọn \"Lặp lại\" và các trang chồng sẽ lặp lại trên tất cả các trang gốc. Hình mờ một trang sẽ được áp dụng cho mọi trang.",
"faqPrivacyQuestion": "Tệp của tôi có được bảo mật không?",
"faqPrivacyAnswer": "Chắc chắn! Toàn bộ quá trình xử lý diễn ra trong trình duyệt của bạn. Tệp của bạn không bao giờ rời khỏi thiết bị, đảm bảo quyền riêng tư hoàn toàn."
},
"unlockPdf": {
"name": "Giải mã PDF",
"subtitle": "Mở khóa PDF bằng cách xóa bảo vệ mật khẩu."
},
"protectPdf": {
"name": "Mã hóa PDF",
"subtitle": "Khóa PDF của bạn bằng cách thêm mật khẩu."
}
}
+8
View File
@@ -1311,5 +1311,13 @@
"faqSinglePageAnswer": "可以!啟用重複使用功能後,疊加 PDF 的頁面會在所有基礎頁面上重複套用。單頁浮水印會套用至每一頁。",
"faqPrivacyQuestion": "我的檔案是否私密安全?",
"faqPrivacyAnswer": "當然!所有處理都在您的瀏覽器中進行。您的檔案永遠不會離開您的裝置,確保完全隱私。"
},
"unlockPdf": {
"name": "解密 PDF",
"subtitle": "透過移除密碼保護解鎖 PDF。"
},
"protectPdf": {
"name": "加密 PDF",
"subtitle": "透過新增密碼為您的 PDF 上鎖。"
}
}
+8
View File
@@ -1312,5 +1312,13 @@
"faqSinglePageAnswer": "可以!启用\"循环\"选项,叠加页面将在所有基础页面上重复。单页水印将应用到每一页。",
"faqPrivacyQuestion": "我的文件是否私密安全?",
"faqPrivacyAnswer": "当然!所有处理都在您的浏览器中进行。您的文件永远不会离开您的设备,确保完全隐私。"
},
"unlockPdf": {
"name": "解密 PDF",
"subtitle": "通过移除密码保护解锁 PDF。"
},
"protectPdf": {
"name": "加密 PDF",
"subtitle": "通过添加密码锁定您的 PDF。"
}
}
+174
View File
@@ -0,0 +1,174 @@
import fs from 'fs';
import path from 'path';
import { JSDOM } from 'jsdom';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const DIST_DIR = path.resolve(__dirname, '../dist');
const SITE_URL = (process.env.SITE_URL || 'https://www.bentopdf.com').replace(
/\/+$/,
''
);
const FALLBACK_SOCIAL_IMAGE = '/images/og-tools.png';
function listTopLevelHtml() {
return fs
.readdirSync(DIST_DIR)
.filter((f) => f.endsWith('.html'))
.map((f) => path.join(DIST_DIR, f));
}
function imageExists(url) {
if (!url) return true;
let pathname;
try {
pathname = url.startsWith('http') ? new URL(url).pathname : url;
} catch {
return true;
}
if (!pathname.startsWith('/images/')) return true;
return fs.existsSync(path.join(DIST_DIR, pathname.replace(/^\//, '')));
}
function fixSocialImages(document) {
const selectors = ['meta[property="og:image"]', 'meta[name="twitter:image"]'];
for (const selector of selectors) {
for (const meta of document.querySelectorAll(selector)) {
const value = meta.getAttribute('content');
if (!imageExists(value)) {
meta.setAttribute('content', `${SITE_URL}${FALLBACK_SOCIAL_IMAGE}`);
}
}
}
}
function fixApplicationCategory(document) {
for (const script of document.querySelectorAll(
'script[type="application/ld+json"]'
)) {
let data;
try {
data = JSON.parse(script.textContent || '');
} catch {
continue;
}
if (
data &&
(data['@type'] === 'SoftwareApplication' ||
data['@type'] === 'WebApplication') &&
data.applicationCategory !== 'UtilitiesApplication'
) {
data.applicationCategory = 'UtilitiesApplication';
script.textContent = JSON.stringify(data, null, 2);
}
}
}
function hasLdType(document, typeName) {
return [
...document.querySelectorAll('script[type="application/ld+json"]'),
].some((s) => (s.textContent || '').includes(`"${typeName}"`));
}
function injectFaqSchema(document) {
if (hasLdType(document, 'FAQPage')) return false;
const items = [];
for (const details of document.querySelectorAll('details.faq-d')) {
const summary = details.querySelector('summary');
const answer = details.querySelector('p');
if (!summary || !answer) continue;
const question = summary.textContent.replace(/\s+/g, ' ').trim();
const answerText = answer.textContent.replace(/\s+/g, ' ').trim();
if (!question || !answerText) continue;
items.push({
'@type': 'Question',
name: question,
acceptedAnswer: { '@type': 'Answer', text: answerText },
});
}
if (items.length === 0) return false;
const script = document.createElement('script');
script.setAttribute('type', 'application/ld+json');
script.textContent = JSON.stringify(
{
'@context': 'https://schema.org',
'@type': 'FAQPage',
mainEntity: items,
},
null,
2
);
document.body.appendChild(script);
return true;
}
function injectWebsiteSchema(document) {
if (hasLdType(document, 'WebSite')) return;
const script = document.createElement('script');
script.setAttribute('type', 'application/ld+json');
script.textContent = JSON.stringify(
{
'@context': 'https://schema.org',
'@type': 'WebSite',
name: 'BentoPDF',
alternateName: ['Bento PDF', 'BentoPDF.com'],
url: `${SITE_URL}/`,
},
null,
2
);
document.body.appendChild(script);
}
function rewriteInternalLinks(document, knownSlugs) {
for (const link of document.querySelectorAll('a[href]')) {
const href = link.getAttribute('href');
if (!href || /^(https?:|\/\/|#|mailto:|tel:|data:)/.test(href)) continue;
const match = href.match(
/^(?:\.\/|\/)?([a-z0-9][a-z0-9-]{0,64})\.html(#[^#]{0,128})?$/
);
if (!match) continue;
if (!knownSlugs.has(match[1])) continue;
const target = match[1] === 'index' ? '/' : `/${match[1]}`;
link.setAttribute('href', `${target}${match[2] || ''}`);
}
}
function enhance() {
if (!fs.existsSync(DIST_DIR)) {
console.error('enhance-seo-pages: dist not found, run vite build first');
process.exit(1);
}
const files = listTopLevelHtml();
const knownSlugs = new Set(files.map((f) => path.basename(f, '.html')));
let faqSchemaCount = 0;
for (const file of files) {
const slug = path.basename(file, '.html');
const dom = new JSDOM(fs.readFileSync(file, 'utf-8'));
const document = dom.window.document;
fixSocialImages(document);
fixApplicationCategory(document);
rewriteInternalLinks(document, knownSlugs);
if (slug === 'index') {
injectWebsiteSchema(document);
}
if (slug !== '404') {
if (injectFaqSchema(document)) faqSchemaCount++;
}
fs.writeFileSync(file, dom.serialize());
dom.window.close();
}
console.log(
`SEO enhance: ${files.length} pages processed, ${faqSchemaCount} FAQPage schemas added.`
);
}
enhance();
+429
View File
@@ -0,0 +1,429 @@
import fs from 'fs';
import path from 'path';
import { marked } from 'marked';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const POSTS_DIR = path.resolve(__dirname, '../blog/posts');
const BLOG_DIR = path.resolve(__dirname, '../blog');
const SITE_URL = 'https://www.bentopdf.com';
const AUTHOR = {
name: 'Alam',
url: `${SITE_URL}/blog/author-alam`,
image: `${SITE_URL}/images/author-alam.jpg`,
profiles: [
'https://github.com/alam00000',
'https://www.linkedin.com/in/abdullah-alam01/',
],
};
const LINK_CLASS = 'text-indigo-300 hover:text-indigo-400';
function escapeHtml(value) {
return value
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;');
}
function styleBody(html) {
return html
.replace(/<h2>/g, '<h2 class="text-2xl font-bold text-white mt-10 mb-4">')
.replace(/<h3>/g, '<h3 class="text-xl font-semibold text-white mt-6 mb-2">')
.replace(/<p>/g, '<p class="text-gray-300 leading-relaxed mb-5">')
.replace(
/<ol>/g,
'<ol class="list-decimal list-inside text-gray-300 leading-relaxed mb-5 space-y-2">'
)
.replace(
/<ul>/g,
'<ul class="list-disc list-inside text-gray-300 leading-relaxed mb-5 space-y-2">'
)
.replace(
/<a href="http/g,
`<a rel="noopener" class="${LINK_CLASS}" href="http`
)
.replace(/<a href="\//g, `<a class="${LINK_CLASS}" href="/`);
}
function renderInline(markdown) {
return styleBody(marked.parseInline(markdown));
}
function formatDate(iso) {
return new Date(`${iso}T12:00:00Z`).toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric',
timeZone: 'UTC',
});
}
function parsePost(file) {
const raw = fs.readFileSync(path.join(POSTS_DIR, file), 'utf-8');
if (/[—–]/.test(raw)) {
throw new Error(
`${file}: contains an em or en dash, which the house style forbids`
);
}
const match = raw.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
if (!match) {
throw new Error(`${file}: missing JSON frontmatter between --- markers`);
}
let meta;
try {
meta = JSON.parse(match[1]);
} catch (err) {
throw new Error(`${file}: frontmatter is not valid JSON: ${err.message}`, {
cause: err,
});
}
for (const key of [
'title',
'h1',
'description',
'date',
'breadcrumb',
'card',
]) {
if (!meta[key]) throw new Error(`${file}: frontmatter missing "${key}"`);
}
return { slug: file.replace(/\.md$/, ''), meta, body: match[2].trim() };
}
function plainText(markdown) {
return markdown
.replace(/\[([^\]]+)\]\([^)]*\)/g, '$1')
.replace(/[*_`>#]/g, '')
.replace(/^\s*\d+\.\s+/gm, '')
.replace(/^\s*[-+]\s+/gm, '')
.replace(/\s+/g, ' ')
.trim();
}
function questionSections(body) {
const sections = [];
const parts = body.split(/^##\s+/m).slice(1);
for (const part of parts) {
const newline = part.indexOf('\n');
const heading = (newline === -1 ? part : part.slice(0, newline)).trim();
if (!heading.endsWith('?')) continue;
const answer = plainText(newline === -1 ? '' : part.slice(newline + 1));
if (!answer) continue;
sections.push({ q: heading, a: answer.slice(0, 600) });
}
return sections;
}
function faqSchema(entries) {
if (entries.length === 0) return '';
return `
<script type="application/ld+json">
${JSON.stringify(
{
'@context': 'https://schema.org',
'@type': 'FAQPage',
mainEntity: entries.map((f) => ({
'@type': 'Question',
name: f.q,
acceptedAnswer: { '@type': 'Answer', text: plainText(f.a) },
})),
},
null,
2
)}
</script>`;
}
function renderFaqs(faqs) {
if (!faqs || faqs.length === 0) return '';
const items = faqs
.map(
(f) => ` <details class="faq-d">
<summary class="faq-d-q">${escapeHtml(f.q)}<i data-lucide="plus" class="faq-d-icon"></i></summary>
<p class="faq-d-a">
${renderInline(f.a)}
</p>
</details>`
)
.join('\n');
return `
<h2 class="text-2xl font-bold text-white mt-10 mb-4">FAQ</h2>
<div class="faq-list">
${items}
</div>`;
}
function renderCta(cta) {
if (!cta) return '';
return `
<div class="bg-gray-800 border border-gray-700 rounded-xl p-6 my-10">
<p class="text-white font-semibold mb-2">${escapeHtml(cta.heading)}</p>
<p class="text-gray-400 mb-4">${escapeHtml(cta.text)}</p>
<a
href="${cta.href}"
class="inline-block bg-indigo-600 hover:bg-indigo-700 text-white font-semibold px-5 py-2.5 rounded-lg"
>${escapeHtml(cta.label)}</a
>
</div>`;
}
function renderPost({ slug, meta, body }) {
const url = `${SITE_URL}/blog/${slug}`;
const updated = meta.updated || meta.date;
const bodyHtml = styleBody(marked.parse(body));
const faqEntries =
meta.faqs && meta.faqs.length > 0 ? meta.faqs : questionSections(body);
return `<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${escapeHtml(meta.title)}</title>
<meta name="description" content="${escapeHtml(meta.description)}" />
<meta name="robots" content="index, follow, max-image-preview:large" />
<link rel="canonical" href="${url}" />
<meta property="og:type" content="article" />
<meta property="og:url" content="${url}" />
<meta property="og:title" content="${escapeHtml(meta.ogTitle || meta.h1)}" />
<meta property="og:description" content="${escapeHtml(meta.description)}" />
<meta property="og:image" content="${SITE_URL}/images/og-tools.png" />
<meta property="og:site_name" content="BentoPDF" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="manifest" href="/site.webmanifest" />
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" />
<link rel="icon" href="/favicon.ico" sizes="32x32" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>
<body class="antialiased bg-gray-900">
{{> navbar }}
<article class="max-w-3xl mx-auto px-4 py-12">
<nav
class="flex items-center gap-2 text-sm text-gray-400 mb-6"
aria-label="Breadcrumb"
>
<a href="/blog" class="hover:text-indigo-300">Blog</a>
<i class="ph ph-caret-right text-xs" aria-hidden="true"></i>
<span class="text-gray-300">${escapeHtml(meta.breadcrumb)}</span>
</nav>
<h1 class="text-3xl md:text-4xl font-bold text-white mb-4 leading-tight">
${escapeHtml(meta.h1)}
</h1>
<div class="flex items-center gap-3 mb-10 text-sm text-gray-400">
<img
src="/images/author-alam.jpg"
alt="${AUTHOR.name}"
width="40"
height="40"
class="rounded-full"
/>
<div>
<a href="/blog/author-alam" class="text-gray-200 font-semibold hover:text-indigo-300">${AUTHOR.name}</a>,
builds BentoPDF ·
<time datetime="${meta.date}">${formatDate(meta.date)}</time>
</div>
</div>
${bodyHtml}
${renderCta(meta.cta)}
${renderFaqs(meta.faqs)}
</article>
{{> footer }}
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="module">
import '@phosphor-icons/web/regular';
</script>
<script type="application/ld+json">
${JSON.stringify(
{
'@context': 'https://schema.org',
'@type': 'BlogPosting',
headline: meta.h1,
description: meta.description,
url,
datePublished: meta.date,
dateModified: updated,
image: `${SITE_URL}/images/og-tools.png`,
author: {
'@type': 'Person',
name: AUTHOR.name,
url: AUTHOR.url,
sameAs: AUTHOR.profiles,
},
publisher: {
'@type': 'Organization',
name: 'BentoPDF',
url: SITE_URL,
},
},
null,
2
)}
</script>
<script type="application/ld+json">
${JSON.stringify(
{
'@context': 'https://schema.org',
'@type': 'BreadcrumbList',
itemListElement: [
{
'@type': 'ListItem',
position: 1,
name: 'Blog',
item: `${SITE_URL}/blog/`,
},
{
'@type': 'ListItem',
position: 2,
name: meta.breadcrumb,
item: url,
},
],
},
null,
2
)}
</script>${faqSchema(faqEntries)}
</body>
</html>
`;
}
function renderIndex(posts) {
const cards = posts
.map(
({ slug, meta }) => ` <a
href="/blog/${slug}"
class="block bg-gray-800 border border-gray-700 rounded-xl p-6 hover:border-indigo-500 transition-colors"
>
<h2 class="text-xl font-bold text-white mb-2">
${escapeHtml(meta.h1)}
</h2>
<p class="text-gray-400 mb-3">
${escapeHtml(meta.card)}
</p>
<span class="text-sm text-gray-500">${formatDate(meta.date)}</span>
</a>`
)
.join('\n\n');
return `<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>The BentoPDF Blog | Privacy-First PDF Guides</title>
<meta
name="description"
content="Guides and honest comparisons from the maintainer of BentoPDF: how PDF tools handle your files, and how to get things done without uploading them."
/>
<meta name="robots" content="index, follow, max-image-preview:large" />
<link rel="canonical" href="${SITE_URL}/blog/" />
<meta property="og:type" content="website" />
<meta property="og:url" content="${SITE_URL}/blog/" />
<meta property="og:title" content="The BentoPDF Blog" />
<meta
property="og:description"
content="Guides and honest comparisons from the maintainer of BentoPDF."
/>
<meta property="og:image" content="${SITE_URL}/images/og-tools.png" />
<meta property="og:site_name" content="BentoPDF" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="manifest" href="/site.webmanifest" />
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" />
<link rel="icon" href="/favicon.ico" sizes="32x32" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>
<body class="antialiased bg-gray-900">
{{> navbar }}
<section class="max-w-3xl mx-auto px-4 py-12">
<h1 class="text-3xl md:text-4xl font-bold text-white mb-4">The BentoPDF Blog</h1>
<p class="text-gray-300 leading-relaxed mb-2">
I'm <a href="/blog/author-alam" class="${LINK_CLASS}">Alam</a>. I build
BentoPDF and write about PDFs, how they work, and the weird things I
run into along the way.
</p>
</section>
<section class="max-w-3xl mx-auto px-4 pb-16">
<div class="space-y-6">
${cards}
</div>
</section>
{{> footer }}
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
<script type="module" src="/src/js/mobileMenu.ts"></script>
<script type="application/ld+json">
${JSON.stringify(
{
'@context': 'https://schema.org',
'@type': 'Blog',
name: 'The BentoPDF Blog',
url: `${SITE_URL}/blog/`,
description:
'Guides and honest comparisons from the maintainer of BentoPDF.',
publisher: {
'@type': 'Organization',
name: 'BentoPDF',
url: SITE_URL,
},
},
null,
2
)}
</script>
</body>
</html>
`;
}
function generate() {
if (!fs.existsSync(POSTS_DIR)) {
console.log('generate-blog: no blog/posts directory, skipping');
return;
}
const files = fs
.readdirSync(POSTS_DIR)
.filter((f) => f.endsWith('.md'))
.sort();
const posts = files.map(parsePost);
posts.sort((a, b) => (a.meta.date < b.meta.date ? 1 : -1));
const keep = new Set(['index.html', 'author-alam.html']);
for (const post of posts) {
fs.writeFileSync(
path.join(BLOG_DIR, `${post.slug}.html`),
renderPost(post)
);
keep.add(`${post.slug}.html`);
}
fs.writeFileSync(path.join(BLOG_DIR, 'index.html'), renderIndex(posts));
for (const entry of fs.readdirSync(BLOG_DIR)) {
if (entry.endsWith('.html') && !keep.has(entry)) {
fs.rmSync(path.join(BLOG_DIR, entry));
console.log(`generate-blog: removed stale ${entry}`);
}
}
console.log(
`generate-blog: ${posts.length} posts + index generated from blog/posts/`
);
}
generate();
+60 -3
View File
@@ -59,7 +59,47 @@ function buildUrl(langPrefix, pagePath) {
if (BASE_PATH && BASE_PATH !== '') parts.push(BASE_PATH.replace(/^\//, ''));
if (langPrefix) parts.push(langPrefix);
if (pagePath) parts.push(pagePath.replace(/^\//, ''));
return parts.filter(Boolean).join('/').replace(/\/+$/, '') || SITE_URL;
const url = parts.filter(Boolean).join('/').replace(/\/+$/, '') || SITE_URL;
return langPrefix && !pagePath ? `${url}/` : url;
}
function resolveTranslation(langResources, key) {
let namespace = 'common';
let keyPath = key;
const colonIndex = key.indexOf(':');
if (colonIndex !== -1) {
namespace = key.slice(0, colonIndex);
keyPath = key.slice(colonIndex + 1);
}
let node = langResources[namespace];
for (const segment of keyPath.split('.')) {
if (node == null || typeof node !== 'object') return null;
node = node[segment];
}
return typeof node === 'string' && node ? node : null;
}
function applyServerTranslations(document, langResources) {
document.querySelectorAll('[data-i18n]').forEach((element) => {
const key = element.getAttribute('data-i18n');
if (!key) return;
const translation = resolveTranslation(langResources, key);
if (translation) element.textContent = translation;
});
document.querySelectorAll('[data-i18n-placeholder]').forEach((element) => {
const key = element.getAttribute('data-i18n-placeholder');
if (!key) return;
const translation = resolveTranslation(langResources, key);
if (translation) element.setAttribute('placeholder', translation);
});
document.querySelectorAll('[data-i18n-title]').forEach((element) => {
const key = element.getAttribute('data-i18n-title');
if (!key) return;
const translation = resolveTranslation(langResources, key);
if (translation) element.setAttribute('title', translation);
});
}
const ORGANIZATION_LD_MARKER = 'data-bentopdf-organization';
@@ -105,10 +145,24 @@ function buildLocalHomeHref(lang) {
return `${BASE_PATH}${langSegment}`.replace(/\/+/g, '/');
}
function removeStaticBreadcrumbLd(document) {
for (const script of document.querySelectorAll(
`script[type="application/ld+json"]:not([${BREADCRUMB_MARKER}])`
)) {
try {
const parsed = JSON.parse(script.textContent || '');
if (parsed && parsed['@type'] === 'BreadcrumbList') script.remove();
} catch {
continue;
}
}
}
function injectToolBreadcrumb(document, lang, toolName, toolUrl) {
const h1 = document.querySelector('h1[data-i18n^="tools:"]');
if (!h1) return;
if (document.querySelector(`[${BREADCRUMB_MARKER}]`)) return;
removeStaticBreadcrumbLd(document);
const homeUrl = buildUrl(lang === 'en' ? '' : lang, '');
@@ -191,6 +245,8 @@ function processFileForLanguage(
document.documentElement.lang = lang;
document.documentElement.dir = lang === 'ar' ? 'rtl' : 'ltr';
applyServerTranslations(document, translations[lang]);
let title = null;
let description = null;
@@ -247,14 +303,13 @@ function processFileForLanguage(
document.head.appendChild(defaultLink);
const localizedUrl = buildUrl(lang, pagePath);
const canonicalUrl = buildUrl('', pagePath);
let canonical = document.querySelector('link[rel="canonical"]');
if (!canonical) {
canonical = document.createElement('link');
canonical.rel = 'canonical';
document.head.appendChild(canonical);
}
canonical.href = canonicalUrl;
canonical.href = localizedUrl;
const ogUrl = document.querySelector('meta[property="og:url"]');
if (ogUrl) ogUrl.content = localizedUrl;
@@ -288,6 +343,8 @@ function processFileForLanguage(
if (href.startsWith('/assets/') || href.includes('/assets/')) return;
if (href === '/blog' || href.startsWith('/blog/')) return;
const langPrefixRegex = new RegExp(
`^(${BASE_PATH})?/(${languages.join('|')})(/|$)`
);
+93 -17
View File
@@ -1,5 +1,6 @@
import fs from 'fs';
import path from 'path';
import { execFileSync } from 'child_process';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
@@ -32,9 +33,17 @@ const PRIORITY_MAP = {
'excel-to-pdf': 0.9,
'powerpoint-to-pdf': 0.9,
'jpg-to-pdf': 0.9,
'pdf-to-docx': 0.9,
'pdf-to-word': 0.9,
'unlock-pdf': 0.9,
'protect-pdf': 0.9,
'pdf-to-excel': 0.9,
'pdf-to-jpg': 0.9,
'compress-pdf-to-100kb': 0.8,
'compress-pdf-to-200kb': 0.8,
'compress-pdf-to-500kb': 0.8,
'compress-pdf-to-1mb': 0.8,
'compress-pdf-to-2mb': 0.8,
'compress-pdf-for-email': 0.8,
about: 0.8,
faq: 0.8,
contact: 0.7,
@@ -52,7 +61,7 @@ function buildUrl(lang, pageName) {
if (lang === 'en') {
return pagePath ? `${SITE_URL}/${pagePath}` : SITE_URL;
}
return pagePath ? `${SITE_URL}/${lang}/${pagePath}` : `${SITE_URL}/${lang}`;
return pagePath ? `${SITE_URL}/${lang}/${pagePath}` : `${SITE_URL}/${lang}/`;
}
function generateSitemap() {
@@ -66,22 +75,48 @@ function generateSitemap() {
.map((file) => file.replace('.html', ''))
.filter((name) => !EXCLUDED_PAGES.has(name));
const projectRoot = path.resolve(__dirname, '..');
const lastModCache = new Map();
const getLastMod = (lang, pageName) => {
const cacheKey = `${lang}::${pageName}`;
if (lastModCache.has(cacheKey)) return lastModCache.get(cacheKey);
const getLastMod = (pageName) => {
if (lastModCache.has(pageName)) return lastModCache.get(pageName);
const fileName = `${pageName}.html`;
const filePath =
lang === 'en'
? path.join(DIST_DIR, fileName)
: path.join(DIST_DIR, lang, fileName);
let iso;
try {
iso = fs.statSync(filePath).mtime.toISOString().slice(0, 10);
} catch {
iso = new Date().toISOString().slice(0, 10);
const candidates = [
path.join(projectRoot, 'src', 'pages', fileName),
path.join(projectRoot, fileName),
];
let iso = null;
for (const sourcePath of candidates) {
if (!fs.existsSync(sourcePath)) continue;
try {
const out = execFileSync(
'git',
['log', '-1', '--format=%cI', '--', sourcePath],
{ cwd: projectRoot, encoding: 'utf-8' }
).trim();
if (out) iso = out.slice(0, 10);
} catch {
iso = null;
}
if (!iso) {
try {
iso = fs.statSync(sourcePath).mtime.toISOString().slice(0, 10);
} catch {
iso = null;
}
}
break;
}
lastModCache.set(cacheKey, iso);
if (!iso) {
try {
iso = fs
.statSync(path.join(DIST_DIR, fileName))
.mtime.toISOString()
.slice(0, 10);
} catch {
iso = new Date().toISOString().slice(0, 10);
}
}
lastModCache.set(pageName, iso);
return iso;
};
@@ -93,12 +128,11 @@ function generateSitemap() {
for (const pageName of htmlFiles) {
const priority = getPriority(pageName);
const url = buildUrl('en', pageName);
const lastmod = getLastMod('en', pageName);
const lastmod = getLastMod(pageName);
sitemap += ` <url>
<loc>${url}</loc>
<lastmod>${lastmod}</lastmod>
<changefreq>weekly</changefreq>
<priority>${priority}</priority>
`;
@@ -114,6 +148,48 @@ function generateSitemap() {
`;
}
const blogDir = path.join(DIST_DIR, 'blog');
let blogCount = 0;
if (fs.existsSync(blogDir)) {
const blogFiles = fs
.readdirSync(blogDir)
.filter((file) => file.endsWith('.html'))
.map((file) => file.replace('.html', ''));
for (const name of blogFiles) {
const url =
name === 'index' ? `${SITE_URL}/blog/` : `${SITE_URL}/blog/${name}`;
const sourcePath = path.join(projectRoot, 'blog', `${name}.html`);
let lastmod;
try {
const out = execFileSync(
'git',
['log', '-1', '--format=%cI', '--', sourcePath],
{ cwd: projectRoot, encoding: 'utf-8' }
).trim();
lastmod = out ? out.slice(0, 10) : null;
} catch {
lastmod = null;
}
if (!lastmod) {
try {
lastmod = fs.statSync(sourcePath).mtime.toISOString().slice(0, 10);
} catch {
lastmod = new Date().toISOString().slice(0, 10);
}
}
sitemap += ` <url>
<loc>${url}</loc>
<lastmod>${lastmod}</lastmod>
<priority>0.7</priority>
</url>
`;
blogCount++;
}
}
if (blogCount > 0) {
console.log(` Blog: ${blogCount} URLs added (English only)`);
}
sitemap += `</urlset>
`;
+106
View File
@@ -0,0 +1,106 @@
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const TOOLS_CONFIG = path.resolve(__dirname, '../src/js/config/tools.ts');
const PAGES_DIR = path.resolve(__dirname, '../src/pages');
const PARTIAL_PATH = path.resolve(
__dirname,
'../src/partials/tool-links-static.html'
);
function escapeHtml(value) {
return value
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;');
}
function unescapeTs(value) {
return value.replace(/\\'/g, "'").replace(/\\\\/g, '\\');
}
function parseCategories(source) {
const headers = [
...source.matchAll(/name:\s*'((?:[^'\\]|\\.)*)',\s*\n\s*tools:\s*\[/g),
].map((m) => ({ name: unescapeTs(m[1]), index: m.index }));
const toolMatches = [
...source.matchAll(
/\{[^{}]*?href:\s*import\.meta\.env\.BASE_URL\s*\+\s*'((?:[^'\\]|\\.)*)'[^{}]*?\}/gs
),
];
const categories = headers.map((h) => ({ name: h.name, tools: [] }));
for (const match of toolMatches) {
const block = match[0];
const hrefFile = unescapeTs(match[1]);
const nameMatch = block.match(/name:\s*'((?:[^'\\]|\\.)*)'/s);
const subtitleMatch = block.match(/subtitle:\s*\n?\s*'((?:[^'\\]|\\.)*)'/s);
if (!nameMatch) continue;
let categoryIndex = -1;
for (let i = 0; i < headers.length; i++) {
if (headers[i].index < match.index) categoryIndex = i;
}
if (categoryIndex === -1) continue;
categories[categoryIndex].tools.push({
slug: hrefFile.replace(/\.html$/, ''),
name: unescapeTs(nameMatch[1]),
subtitle: subtitleMatch ? unescapeTs(subtitleMatch[1]) : '',
});
}
return categories.filter((c) => c.tools.length > 0);
}
function generate() {
const source = fs.readFileSync(TOOLS_CONFIG, 'utf-8');
const categories = parseCategories(source);
const existingPages = new Set(
fs
.readdirSync(PAGES_DIR)
.filter((f) => f.endsWith('.html'))
.map((f) => f.replace(/\.html$/, ''))
);
const seen = new Set();
const lines = [];
let toolCount = 0;
for (const category of categories) {
const tools = category.tools.filter(
(t) => existingPages.has(t.slug) && !seen.has(t.slug)
);
if (tools.length === 0) continue;
for (const t of tools) seen.add(t.slug);
lines.push(
`<div class="col-span-full mt-6 first:mt-0"><h2 class="text-lg font-semibold text-white">${escapeHtml(category.name)}</h2></div>`
);
for (const tool of tools) {
toolCount++;
lines.push(
`<a href="/${tool.slug}" class="block bg-gray-800 p-4 rounded-lg border border-gray-700 hover:bg-gray-700 transition-colors">` +
`<h3 class="text-white font-semibold mb-1">${escapeHtml(tool.name)}</h3>` +
`<p class="text-gray-400 text-sm">${escapeHtml(tool.subtitle)}</p>` +
`</a>`
);
}
}
if (toolCount < 50) {
console.error(
`generate-static-tool-links: only ${toolCount} tools parsed from tools.ts — parser is likely out of sync with the config format`
);
process.exit(1);
}
fs.writeFileSync(PARTIAL_PATH, lines.join('\n') + '\n');
console.log(
`Static tool links: ${toolCount} tools in ${categories.length} categories -> src/partials/tool-links-static.html`
);
}
generate();
+73 -24
View File
@@ -11,46 +11,95 @@ const mainDistPath = path.join(projectRoot, 'dist');
const targetDocsPath = path.join(mainDistPath, 'docs');
function copyDir(src, dest) {
if (!fs.existsSync(dest)) {
fs.mkdirSync(dest, { recursive: true });
}
if (!fs.existsSync(dest)) {
fs.mkdirSync(dest, { recursive: true });
}
const entries = fs.readdirSync(src, { withFileTypes: true });
const entries = fs.readdirSync(src, { withFileTypes: true });
for (const entry of entries) {
const srcPath = path.join(src, entry.name);
const destPath = path.join(dest, entry.name);
for (const entry of entries) {
const srcPath = path.join(src, entry.name);
const destPath = path.join(dest, entry.name);
if (entry.isDirectory()) {
copyDir(srcPath, destPath);
} else {
fs.copyFileSync(srcPath, destPath);
}
if (entry.isDirectory()) {
copyDir(srcPath, destPath);
} else {
fs.copyFileSync(srcPath, destPath);
}
}
}
console.log('Including docs in dist...');
if (!fs.existsSync(docsDistPath)) {
console.error('Error: Docs build not found. Please run "npm run docs:build" first.');
process.exit(1);
console.error(
'Error: Docs build not found. Please run "npm run docs:build" first.'
);
process.exit(1);
}
if (!fs.existsSync(mainDistPath)) {
console.error('Error: Main dist folder not found. Please run "npm run build" first.');
process.exit(1);
console.error(
'Error: Main dist folder not found. Please run "npm run build" first.'
);
process.exit(1);
}
try {
console.log(`Copying from: ${docsDistPath}`);
console.log(`Copying to: ${targetDocsPath}`);
console.log(`Copying from: ${docsDistPath}`);
console.log(`Copying to: ${targetDocsPath}`);
copyDir(docsDistPath, targetDocsPath);
copyDir(docsDistPath, targetDocsPath);
console.log('Docs successfully included in dist/docs!');
console.log('Docs successfully included in dist/docs!');
const files = fs.readdirSync(targetDocsPath);
console.log(`Copied ${files.length} items to dist/docs`);
const files = fs.readdirSync(targetDocsPath);
console.log(`Copied ${files.length} items to dist/docs`);
addDocsToSitemap();
} catch (error) {
console.error('Error copying docs:', error.message);
process.exit(1);
console.error('Error copying docs:', error.message);
process.exit(1);
}
function listDocsHtml(dir, prefix) {
const urls = [];
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
if (entry.isDirectory()) {
if (entry.name === 'assets' || entry.name.startsWith('.')) continue;
urls.push(
...listDocsHtml(path.join(dir, entry.name), `${prefix}/${entry.name}`)
);
} else if (entry.name.endsWith('.html') && entry.name !== '404.html') {
const slug = entry.name.replace(/\.html$/, '');
urls.push(slug === 'index' ? `${prefix}/` : `${prefix}/${slug}`);
}
}
return urls;
}
function addDocsToSitemap() {
const siteUrl = (process.env.SITE_URL || 'https://www.bentopdf.com').replace(
/\/+$/,
''
);
const sitemapPath = path.join(mainDistPath, 'sitemap.xml');
if (!fs.existsSync(sitemapPath)) {
console.warn(
'sitemap.xml not found in dist; skipping docs sitemap entries'
);
return;
}
let xml = fs.readFileSync(sitemapPath, 'utf-8');
if (xml.includes(`<loc>${siteUrl}/docs/</loc>`)) return;
const urls = listDocsHtml(targetDocsPath, '/docs');
const entries = urls
.map(
(url) =>
` <url>\n <loc>${siteUrl}${url}</loc>\n <priority>0.6</priority>\n </url>\n`
)
.join('');
xml = xml.replace('</urlset>', `${entries}</urlset>`);
fs.writeFileSync(sitemapPath, xml);
console.log(`Added ${urls.length} docs URLs to sitemap.xml`);
}
+108 -3
View File
@@ -67,6 +67,12 @@ function findAll(html, regex) {
return out;
}
const LOCALE_DIRS = new Set(
fs
.readdirSync(LOCALES_DIR)
.filter((d) => fs.statSync(path.join(LOCALES_DIR, d)).isDirectory())
);
function expectedCanonicalForFile(rel) {
const parts = rel.split('/');
const fileName = parts.pop();
@@ -74,12 +80,40 @@ function expectedCanonicalForFile(rel) {
const slug = baseName === 'index' ? '' : baseName;
const segments = [SITE_URL];
if (BASE_PATH) segments.push(BASE_PATH.replace(/^\//, ''));
for (const dir of parts) {
if (LOCALE_DIRS.has(dir) || dir === 'blog') segments.push(dir);
}
if (slug) segments.push(slug);
return segments.join('/').replace(/\/+$/, '') || SITE_URL;
}
function auditHtml(file) {
function auditHtml(file, knownSlugs) {
const html = fs.readFileSync(file.full, 'utf-8');
const isLocalized = file.rel.split('/').some((seg) => LOCALE_DIRS.has(seg));
if (!isLocalized && /[—–]/.test(html)) {
fail(
'em-dash',
`${file.rel}: contains an em or en dash (house style forbids them)`
);
}
if (!isLocalized) {
const internal = findAll(html, /<a[^>]+href=["'](\/[^"'#?]*)["']/g);
for (const href of internal) {
const clean = href.replace(/\/$/, '');
if (clean === '') continue;
const seg = clean.slice(1);
if (seg.includes('/')) continue;
if (LOCALE_DIRS.has(seg) || seg === 'blog' || seg === 'docs') continue;
if (!knownSlugs.has(seg)) {
fail(
'dead-link',
`${file.rel}: links to "${href}" but no such page exists in dist`
);
}
}
}
const titles = findAll(html, /<title[^>]*>[\s\S]*?<\/title>/g);
if (titles.length === 0) {
fail('title', `${file.rel}: no <title>`);
@@ -147,7 +181,7 @@ function auditHtml(file) {
);
}
const emptyI18n = html.match(/<span[^>]*data-i18n="[^"]+"[^>]*>\s*<\/span>/g);
const emptyI18n = html.match(/<span[^>]*data-i18n="[^"]+"[^>]*><\/span>/g);
if (emptyI18n && emptyI18n.length > 0) {
fail(
'data-i18n',
@@ -176,10 +210,76 @@ function auditHtml(file) {
`${file.rel}: hreflang href host "${url.hostname}" != expected "${HOST}"`
);
}
const trimmed = url.pathname.replace(/^\/|\/$/g, '');
if (LOCALE_DIRS.has(trimmed) && !url.pathname.endsWith('/')) {
fail(
'hreflang',
`${file.rel}: language-home hreflang "${m[1]}" must end with "/" (the server 301s the slashless form)`
);
}
} catch {
fail('hreflang', `${file.rel}: hreflang href "${m[1]}" not a valid URL`);
}
}
const descriptions = findAll(
html,
/<meta[^>]+name=["']description["'][^>]*content=["']([^"']*)["']/g
);
if (descriptions.length > 1) {
fail(
'description',
`${file.rel}: ${descriptions.length} meta description tags (expected 1)`
);
}
for (const desc of descriptions) {
if (desc.includes('★')) {
fail('description', `${file.rel}: meta description contains "★"`);
}
}
const isTopLevel = !file.rel.includes('/');
if (isTopLevel) {
const socialImages = findAll(
html,
/<meta[^>]+(?:property=["']og:image["']|name=["']twitter:image["'])[^>]*content=["']([^"']+)["']/g
);
for (const image of socialImages) {
let pathname;
try {
pathname = image.startsWith('http') ? new URL(image).pathname : image;
} catch {
continue;
}
if (
pathname.startsWith('/images/') &&
!fs.existsSync(path.join(DIST_DIR, pathname.replace(/^\//, '')))
) {
fail(
'social-image',
`${file.rel}: og/twitter image "${pathname}" does not exist in dist`
);
}
}
if (html.includes('faq-d') && !html.includes('"FAQPage"')) {
fail(
'faq-schema',
`${file.rel}: visible FAQ section without FAQPage JSON-LD`
);
}
const internalHtmlLinks = findAll(
html,
/<a[^>]+href=["'](\/?[a-z0-9][a-z0-9-]*\.html)["']/g
);
for (const href of internalHtmlLinks) {
fail(
'internal-link',
`${file.rel}: internal link "${href}" should be extensionless`
);
}
}
}
function auditSitemap() {
@@ -248,7 +348,12 @@ function main() {
fail('audit', 'no HTML files found in dist/');
}
for (const file of files) auditHtml(file);
const knownSlugs = new Set(
files
.filter((f) => !f.rel.includes('/'))
.map((f) => f.rel.replace(/\.html$/, ''))
);
for (const file of files) auditHtml(file, knownSlugs);
auditSitemap();
const total = failures.length + warnings.length;
+7 -7
View File
@@ -499,7 +499,7 @@ const baseCategories = [
subtitle: 'Convert PDF files to JSON format.',
},
{
href: import.meta.env.BASE_URL + 'pdf-to-docx.html',
href: import.meta.env.BASE_URL + 'pdf-to-word.html',
name: 'PDF to Word',
icon: 'ph-microsoft-word-logo',
subtitle: 'Convert PDF files to editable Word documents.',
@@ -778,10 +778,10 @@ const baseCategories = [
name: 'Secure PDF',
tools: [
{
href: import.meta.env.BASE_URL + 'encrypt-pdf.html',
name: 'Encrypt PDF',
href: import.meta.env.BASE_URL + 'protect-pdf.html',
name: 'Protect PDF',
icon: 'ph-lock',
subtitle: 'Lock your PDF by adding a password.',
subtitle: 'Password protect a PDF with strong AES encryption.',
},
{
href: import.meta.env.BASE_URL + 'sanitize-pdf.html',
@@ -790,10 +790,10 @@ const baseCategories = [
subtitle: 'Remove metadata, annotations, scripts, and more.',
},
{
href: import.meta.env.BASE_URL + 'decrypt-pdf.html',
name: 'Decrypt PDF',
href: import.meta.env.BASE_URL + 'unlock-pdf.html',
name: 'Unlock PDF',
icon: 'ph-lock-open',
subtitle: 'Unlock PDF by removing password protection.',
subtitle: 'Remove the password from a PDF so it opens freely.',
},
{
href: import.meta.env.BASE_URL + 'flatten-pdf.html',
+14 -2
View File
@@ -1,6 +1,18 @@
import type { AppConfig } from '@/types';
const disabledToolsSet = new Set<string>(__DISABLED_TOOLS__);
const RENAMED_TOOL_IDS: Record<string, string> = {
'decrypt-pdf': 'unlock-pdf',
'encrypt-pdf': 'protect-pdf',
'pdf-to-docx': 'pdf-to-word',
};
function normalizeToolId(toolId: string): string {
return RENAMED_TOOL_IDS[toolId] ?? toolId;
}
const disabledToolsSet = new Set<string>(
__DISABLED_TOOLS__.map(normalizeToolId)
);
let runtimeConfigLoaded = false;
let editorDisabledCategories: string[] = [];
@@ -23,7 +35,7 @@ export async function loadRuntimeConfig(): Promise<void> {
if (Array.isArray(config.disabledTools)) {
for (const toolId of config.disabledTools) {
if (typeof toolId === 'string') {
disabledToolsSet.add(toolId);
disabledToolsSet.add(normalizeToolId(toolId));
}
}
}
+3 -3
View File
@@ -557,7 +557,7 @@ export const nodeRegistry: Record<string, NodeRegistryEntry> = {
icon: 'ph-lock',
description: 'Encrypt PDF with password',
factory: () => new EncryptNode(),
toolPageId: 'encrypt-pdf',
toolPageId: 'protect-pdf',
},
DecryptNode: {
label: 'Decrypt',
@@ -565,7 +565,7 @@ export const nodeRegistry: Record<string, NodeRegistryEntry> = {
icon: 'ph-lock-open',
description: 'Remove PDF password protection',
factory: () => new DecryptNode(),
toolPageId: 'decrypt-pdf',
toolPageId: 'unlock-pdf',
},
SanitizeNode: {
label: 'Sanitize',
@@ -653,7 +653,7 @@ export const nodeRegistry: Record<string, NodeRegistryEntry> = {
icon: 'ph-microsoft-word-logo',
description: 'Convert PDF to Word document',
factory: () => new PdfToDocxNode(),
toolPageId: 'pdf-to-docx',
toolPageId: 'pdf-to-word',
},
PdfToXlsxNode: {
label: 'PDF to XLSX',
+95 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Add Attachments online free - Add attachments PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Embed one or more files into your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="add attachments, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -35,7 +35,7 @@
/>
<meta
property="og:description"
content="★ Add Attachments online free - Add attachments PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Embed one or more files into your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -54,7 +54,7 @@
<meta name="twitter:title" content="Add Attachments Free" />
<meta
name="twitter:description"
content="★ Add Attachments online free - Add attachments PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Embed one or more files into your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -68,10 +68,6 @@
<meta name="apple-mobile-web-app-title" content="Add Attachments" />
<title>Add Attachments to PDF - BentoPDF</title>
<meta
name="description"
content="Add file attachments to your PDF documents. Embed files at document or page level. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -389,32 +385,115 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is add attachments really free?
What kinds of files can I embed in a PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Any file type: spreadsheets, images, ZIP archives, CAD drawings,
even executables. The tool doesn't inspect or convert the file; it
stores the bytes inside the PDF under the original file name, and
you can embed several files in one pass.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
What's the difference between document-level and page-level
attachments?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Document-level attachments belong to the PDF as a whole and appear
in the reader's attachments panel. Page-level attachments are tied
to the pages you list in the page range field (for example 1,3,5-7),
and the same file is attached to every page in that range. Document
level is the safer choice, since some viewers never show page-level
attachments.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Where do the attached files show up when someone opens the PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
In readers that have an attachments panel, such as Adobe Acrobat
Reader or Firefox's built-in viewer, they're listed by file name and
can be opened or saved from there. Viewers without that panel won't
show them at all, although the files are still inside the PDF.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does embedding files make the PDF bigger?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes, by roughly the size of each attachment, since the file's bytes
are stored inside the PDF. A 40 MB spreadsheet attached to a 1 MB
report yields a PDF of about 41 MB, so keep attachment size in mind
before emailing the result.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is the file I attach uploaded anywhere when I embed it?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The PDF and the attachments are read and combined in your
browser by the CoherentPDF WebAssembly module, and the result is
downloaded straight from the page. Nothing is sent to a server.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why does the tool say an advanced processing module is required?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Embedding uses the CoherentPDF (cpdf) module, which loads on demand
from a CDN the first time you use it rather than shipping with the
main site. If you self-host BentoPDF or work in an air-gapped setup,
you can point the tool at your own copy of the module on the
<a
href="/wasm-settings"
class="text-indigo-300 hover:text-indigo-400"
>Advanced Features settings</a
>
page.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I remove an attachment later?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes.
<a
href="/edit-attachments"
class="text-indigo-300 hover:text-indigo-400"
>Edit Attachments</a
>
lists every embedded file and lets you remove individual ones or all
of them, and Extract Attachments saves them back out as separate
downloads.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Will attaching files break a digital signature on the PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes. Adding attachments rewrites the file, which invalidates any
existing digital signature. Attach the files first, then sign the
finished PDF with
<a
href="/digital-sign-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Digital Sign PDF</a
>.
</p>
</details>
</div>
+85 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Add Blank Page online free - Add blank page PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Insert an empty page anywhere in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="add blank page, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ Add Blank Page online free - Add blank page PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Insert an empty page anywhere in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -51,7 +51,7 @@
<meta name="twitter:title" content="Add Blank Page Free" />
<meta
name="twitter:description"
content="★ Add Blank Page online free - Add blank page PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Insert an empty page anywhere in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -65,10 +65,6 @@
<meta name="apple-mobile-web-app-title" content="Add Blank Page" />
<title>Add Blank Page - BentoPDF</title>
<meta
name="description"
content="Insert blank pages anywhere in your PDF document. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -377,32 +373,105 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is add blank page really free?
Where will the blank page be inserted?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
The position number is how many existing pages come before the new
blank pages. Enter 0 to put them at the very start, 3 to insert them
after page 3, or the total page count to append them at the end.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
What size are the blank pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Each blank page copies the width and height of your document's first
page, so a Letter document gets Letter blanks and an A4 document
gets A4 blanks. If your PDF mixes page sizes, the blanks still match
page 1 rather than the pages next to them.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Can I add more than one blank page at a time?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Enter any count of 1 or more and all of them are inserted together
at the same position. To add blanks at several different spots, run
the tool again on the output, or use
<a
href="/pdf-multi-tool"
class="text-indigo-300 hover:text-indigo-400"
>PDF Multi Tool</a
>
to arrange pages visually.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does it keep bookmarks and document properties?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Page content, images, text, and annotations on the pages are kept as
they are. The document is rebuilt page by page, so bookmarks (the
outline panel) and properties such as title and author aren't
carried over to the new file.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is the inserted page completely empty?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes. It has no text, no page number, and no printed note, just a
white page of the same size as page 1. If you want page numbers on
it afterward, run the result through
<a
href="/page-numbers"
class="text-indigo-300 hover:text-indigo-400"
>Page Numbers</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I use this to make every chapter start on a right-hand page for
double-sided printing?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
You can, one position per run. Insert a blank after each chapter
that ends on an odd page, download, then repeat on the new file for
the next chapter. The output keeps the original filename, so rename
copies as you go to avoid mixing them up.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I add blank pages to a password-protected PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
If the file needs a password to open, the tool asks for it before
reading the page count. The new file is saved without the password,
so protect it again afterward if you need to.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my PDF uploaded to add the page?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The page count is read and the new document is assembled in your
browser with pdf-lib, a JavaScript PDF library, and the download
comes straight from memory. Nothing is sent to a server.
</p>
</details>
</div>
+85 -19
View File
@@ -465,39 +465,105 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
<span data-i18n="tools:addPageLabels.faqWhatIsQuestion"
>What is a page label?</span
>
How do I label appendix pages A-1, A-2, A-3?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a" data-i18n="tools:addPageLabels.faqWhatIsAnswer">
A page label is the numbering shown by PDF readers in thumbnails,
page navigation, and print dialogs. It does not print new text onto
the page itself.
<p class="faq-d-a">
Add a rule for the appendix page range, keep Decimal Arabic as the
style, and type A- in the Label Prefix field. With the default start
value of 1 the pages become A-1, A-2, A-3, and a second rule with
the prefix B- handles the next appendix.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
<span data-i18n="tools:addPageLabels.faqMixQuestion"
>Can I mix Roman numerals and normal numbers?</span
>
Can page numbering start at 0 or at a number other than 1?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a" data-i18n="tools:addPageLabels.faqMixAnswer">
Yes. Add multiple rules, such as 1-4 with LowercaseRoman and 5-20
with DecimalArabic.
<p class="faq-d-a">
Each rule has a Start Value field that defaults to 1. Set it to 0
for zero-based numbering, or to any other number, for example 15 so
a chapter extracted from a longer book keeps its original page
numbers.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
<span data-i18n="tools:addPageLabels.faqPrivacyQuestion"
>Do my files stay private?</span
>
What does 'Continue numbering across disjoint ranges' do?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a" data-i18n="tools:addPageLabels.faqPrivacyAnswer">
Yes. The processing happens in your browser using CoherentPDF WASM.
Your PDF does not leave your device.
<p class="faq-d-a">
Turn it on when one rule covers pages that aren't contiguous, such
as 1-9,30-40 or odd, and you want the labels to keep counting in
sequence across the gap. With it off, each separate block of pages
starts again from the start value.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What happens to the page labels the PDF already has?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The 'Remove existing page labels' box is checked by default, so the
old labels are cleared before your rules are applied. Uncheck it if
you only want to relabel some pages and keep the existing labels on
the rest.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Which page range formats can I type?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Leave the field empty to cover every page, or use forms like 1-4, 7,
odd, or 1-9,30-40. Page numbers refer to physical positions in the
file, not to labels the PDF may already display.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I add labels to a password-protected PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Not directly. The tool stops with a Protected PDF message, so remove
the password first with
<a href="/unlock-pdf" class="text-indigo-300 hover:text-indigo-400"
>Unlock PDF</a
>
and then upload the copy that no longer needs one.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why does the tool ask me to configure CoherentPDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Page labels are written by the CoherentPDF engine, which normally
loads from a CDN the first time you use the tool. If that default
has been turned off in a self-hosted build, you'll be prompted to
point
<a
href="/wasm-settings"
class="text-indigo-300 hover:text-indigo-400"
>WASM Settings</a
>
at a copy of the library.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How do I check that the labels were applied?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Open the downloaded PDF in a reader that displays page labels, such
as Adobe Acrobat or Firefox's built-in viewer, and look at the page
number box in the toolbar. It shows the label, for example iv or
A-1, instead of the plain page index.
</p>
</details>
</div>
+92 -12
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Add Stamps online free - Add stamps PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Add image stamps to your PDF using the annotation toolbar. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="add stamps, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ Add Stamps online free - Add stamps PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Add image stamps to your PDF using the annotation toolbar. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,7 +48,7 @@
<meta name="twitter:title" content="Add Stamps Free" />
<meta
name="twitter:description"
content="★ Add Stamps online free - Add stamps PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Add image stamps to your PDF using the annotation toolbar. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -311,32 +311,112 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is add stamps really free?
What kind of stamps can I add with this tool?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
This tool places image stamps, so you pick an image file such as a
PNG or JPG (a company seal, an APPROVED graphic, a scanned notary
stamp) and drop it onto the page. For text-only marks like a
diagonal DRAFT label,
<a
href="/add-watermark"
class="text-indigo-300 hover:text-indigo-400"
>Add Watermark</a
>
is the better fit.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
What does the Stamp Username field do?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
The name you enter is recorded on each stamp you create as its
author, so reviewers can see who placed it. Set it before you upload
the PDF. It's optional, and leaving it blank creates stamps without
a name attached.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Can I put the same stamp on every page at once?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
No. Stamps are placed one at a time on the page you're viewing, and
you can move and resize each one before saving. If you need an
identical mark on all pages, use the image mode in
<a
href="/add-watermark"
class="text-indigo-300 hover:text-indigo-400"
>Add Watermark</a
>, which can apply one image to every page in a single step.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are the stamps permanent, or can they be removed later?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Stamps are saved as PDF stamp annotations, so a PDF editor can still
select, move, or delete them. If you want them merged into the page
content so they can't be lifted off, run the saved file through
<a href="/flatten-pdf" class="text-indigo-300 hover:text-indigo-400"
>Flatten PDF</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How do I move or resize a stamp after placing it?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Click the stamp in the viewer to select it, then drag it to a new
position or pull its corner handles to change the size. Nothing is
final until you click Save Stamped PDF, so you can adjust as much as
you like first.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What's the difference between this and Sign PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
<a href="/sign-pdf" class="text-indigo-300 hover:text-indigo-400"
>Sign PDF</a
>
is built for signatures: you draw one, type one, or upload one and
place it on the page. Add Stamps is for reusable image marks such as
seals, RECEIVED stamps, or QC stamps, with your name recorded as the
author of each one.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does the stamp tool work on password-protected PDFs?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
If the file needs a password to open, the tool asks for it before
loading the viewer. You need the open password; the tool doesn't
bypass encryption.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my document uploaded when I stamp it?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The viewer, the stamp editor, and the export all run in your
browser, and the stamped PDF is written on your device. Nothing is
sent to a server, which matters when you're stamping contracts,
inspection reports, or notarized documents.
</p>
</details>
</div>
+88 -20
View File
@@ -7,11 +7,11 @@
<!-- Primary Meta Tags -->
<meta
name="title"
content="Add Watermark Online Free - Add Watermark Tool | BentoPDF"
content="Watermark PDF Free - Add Text or Image Watermarks | BentoPDF"
/>
<meta
name="description"
content="★ Add Watermark online free - Add watermark PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Stamp text or an image over your PDF pages. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="add watermark, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -28,11 +28,11 @@
<meta property="og:url" content="https://www.bentopdf.com/add-watermark" />
<meta
property="og:title"
content="Add Watermark Online Free - Add Watermark Tool | BentoPDF"
content="Watermark PDF Free - Add Text or Image Watermarks | BentoPDF"
/>
<meta
property="og:description"
content="★ Add Watermark online free - Add watermark PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Stamp text or an image over your PDF pages. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -45,10 +45,13 @@
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/add-watermark" />
<meta name="twitter:title" content="Add Watermark Free" />
<meta
name="twitter:title"
content="Watermark PDF Free - Add Text or Image Watermarks | BentoPDF"
/>
<meta
name="twitter:description"
content="★ Add Watermark online free - Add watermark PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Stamp text or an image over your PDF pages. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -61,11 +64,7 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Add Watermark" />
<title>Add Watermark - BentoPDF</title>
<meta
name="description"
content="Add text or image watermarks to your PDF documents. Customize opacity with rotation. Free, secure, and runs entirely in your browser."
/>
<title>Watermark PDF Free - Add Text or Image Watermarks | BentoPDF</title>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -776,32 +775,101 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is add watermark really free?
Can I watermark only certain pages of a PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Yes. Type a range such as 1-3, 5, 7-9 in the Page Range field, or
leave it set to "all". If you want different text or a different
position on individual pages, uncheck "Apply to all pages" and use
the page arrows above the preview to set each page separately.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
How do I add a diagonal CONFIDENTIAL or DRAFT watermark across the
page?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Stay in Text mode, type the word, and raise the font size (10 to 200
points, default 72) until it spans the page. The angle slider
already defaults to -45 degrees for the classic diagonal look, so
usually you only need to enlarge the text and drag it to the center
of the preview.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Can I use a logo image as the watermark?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Switch to Image mode and upload a PNG or JPG; other image formats
aren't accepted. A PNG with a transparent background blends best
with the page. You can scale it from 10% to 200%, set its opacity
and angle, and drag it into position on the preview.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What does the Tiled layout do?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Tiled repeats the watermark across the whole page in a diagonal grid
that follows the rotation angle, so the mark runs edge to edge. The
horizontal and vertical gap sliders control the spacing between
tiles as a percentage of the watermark size. Lower the opacity when
tiling so the document underneath stays readable.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can someone remove the watermark afterward?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The watermark is drawn into the page content rather than added as a
separate annotation, so it can't be deleted with one click in a PDF
viewer. It isn't tamper-proof though. For a harder-to-strip result,
use Tiled mode, or check "Flatten watermark" to bake every page into
pixels, which also makes the document's text unselectable.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does adding a watermark change the original text or image quality?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The pages keep their original text, images, and dimensions, and
the watermark is placed on top, so text stays selectable and
searchable. The exception is the "Flatten watermark" option, which
re-renders every page as an image at 2.5x scale and removes
selectable text.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What opacity should I use for a watermark?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The slider runs from 0.05 to 1 and defaults to 0.3. Values between
0.2 and 0.4 keep the mark visible without hiding the content beneath
it; go higher only for small marks placed in a margin or corner.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my PDF uploaded when I add a watermark?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The live preview, the drag-and-drop editor, and the final
rendering all run inside your browser with pdf-lib, so neither the
PDF nor a logo image you add leaves your device.
</p>
</details>
</div>
+96 -17
View File
@@ -10,7 +10,7 @@
/>
<meta
name="description"
content="★ Adjust PDF colors online free - Brightness, contrast, saturation, hue, temperature & more ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Fine-tune brightness, contrast, saturation and more in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="keywords"
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ Adjust PDF colors online free - Brightness, contrast, saturation, hue, temperature & more ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Fine-tune brightness, contrast, saturation and more in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -47,7 +47,7 @@
<meta name="twitter:title" content="Adjust Colors Free" />
<meta
name="twitter:description"
content="★ Adjust PDF colors online free - Brightness, contrast, saturation, hue & more ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Fine-tune brightness, contrast, saturation and more in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -60,10 +60,6 @@
<meta name="apple-mobile-web-app-title" content="Adjust Colors" />
<title>Adjust Colors - BentoPDF</title>
<meta
name="description"
content="Adjust brightness, contrast, saturation, hue, temperature, gamma and more in your PDF. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -467,7 +463,7 @@
<p class="text-gray-400 text-sm">Change PDF background</p>
</a>
<a
href="change-text-color.html"
href="text-color.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 Color</h3>
@@ -486,32 +482,115 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is adjust colors really free?
How do I brighten a dark scanned PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Move the Brightness slider (range -100 to +100) up to lighten the
page, and raise Contrast if the text still looks washed out. When
only the midtones are too dark, the Gamma slider (0.2 to 5.0) lifts
them without blowing out the white background. The preview updates
as you drag, so you can check the first page before applying the
settings to all of them.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Can I convert a color PDF to grayscale with this tool?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Drag the Saturation slider all the way to -100 and every page
becomes grayscale, which also cuts ink use when printing. If you
don't need any of the other adjustments, the
<a
href="/pdf-to-greyscale"
class="text-indigo-300 hover:text-indigo-400"
>grayscale conversion tool</a
>
does the same thing in one step.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
What do the hue, temperature, and tint sliders do?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Hue Shift rotates every color around the color wheel by 0 to 360
degrees while leaving whites, grays, and blacks untouched.
Temperature (-50 to +50) shifts the page toward blue on the cool end
or yellow-orange on the warm end, and Tint (-50 to +50) shifts
between green and magenta, which is useful for photos scanned with a
color cast.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Will the text still be selectable after adjusting colors?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. To apply the changes, each page is rendered to an image at 2x
resolution and saved into a new PDF, so the output is image-based
and text can't be selected or searched. Keep your original for
editing, or run the result through
<a href="/ocr-pdf" class="text-indigo-300 hover:text-indigo-400"
>OCR</a
>
to add a searchable text layer.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why is my PDF larger after adjusting the colors?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Every page is stored as a full-page PNG image instead of text and
vector drawing commands, so the file usually grows, especially for
text-heavy documents. Running the result through
<a
href="/compress-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Compress PDF</a
>
afterward brings the size back down.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I give a PDF a sepia or vintage look?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Raise the Sepia slider (0 to 100) to add a brown tone; higher values
give a stronger antique look. Combine it with a small drop in
Contrast or Saturation to soften the result, and click Reset at any
point to return every slider to its default.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does the preview show every page or only the first one?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The live preview renders the first page only, so you can test
settings quickly. When you click Apply, the same settings are
processed on every page of the document and the adjusted PDF
downloads.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my PDF uploaded anywhere when I adjust its colors?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The page rendering and the color math run in your browser, and
the adjusted PDF is assembled on your device, so the file never
leaves your computer.
</p>
</details>
</div>
+96 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Alternate Merge online free - Alternate merge PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Merge PDFs by alternating pages from each PDF. Preserves Bookmarks. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="alternate merge, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -35,7 +35,7 @@
/>
<meta
property="og:description"
content="★ Alternate Merge online free - Alternate merge PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Merge PDFs by alternating pages from each PDF. Preserves Bookmarks. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -54,7 +54,7 @@
<meta name="twitter:title" content="Alternate Merge Free" />
<meta
name="twitter:description"
content="★ Alternate Merge online free - Alternate merge PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Merge PDFs by alternating pages from each PDF. Preserves Bookmarks. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -68,10 +68,6 @@
<meta name="apple-mobile-web-app-title" content="Alternate Merge" />
<title>Alternate & Mix PDF Pages - BentoPDF</title>
<meta
name="description"
content="Alternate and mix pages from multiple PDF files. Interleave PDF pages in any order. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -360,32 +356,116 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is alternate merge really free?
What does alternate merge do that a normal merge doesn't?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
A normal merge appends whole files one after another. Alternate
merge takes page 1 from each file in turn, then page 2 from each,
and so on, so the pages of two or more PDFs are interleaved into a
single document. If you only need files back to back, use
<a href="/merge-pdf" class="text-indigo-300 hover:text-indigo-400"
>Merge PDF</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
How do I fix a double-sided scan where the fronts and backs are in
separate PDFs?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Upload the fronts PDF first and the backs PDF second, then click Mix
Pages. The output alternates front 1, back 1, front 2, back 2 and so
on. If the backs were scanned last page first, flip that file with
<a
href="/reverse-pages"
class="text-indigo-300 hover:text-indigo-400"
>Reverse Pages</a
>
before mixing.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
The fronts and backs are in the same PDF, not separate files. Which
tool do I need?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
This tool interleaves separate files. If one PDF holds all the
fronts followed by all the backs,
<a
href="/duplex-collate"
class="text-indigo-300 hover:text-indigo-400"
>Duplex Collate</a
>
splits that single file at the midpoint and interleaves the two
halves, with an option to reverse the back block.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What happens if the PDFs have different page counts?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Interleaving continues until the shorter file runs out, and the
remaining pages from the longer file are appended in order at the
end. No pages are dropped.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I interleave more than two PDFs?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Any number of files from two upward. With three files the output
goes A1, B1, C1, A2, B2, C2 and so on, following the order shown in
the file list, which you can change by dragging the grip handles.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does the output keep bookmarks and page numbers from the original
files?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Bookmarks from each source file are carried into the mixed PDF. Page
labels are reset to a plain 1 to N sequence by default; turn on the
option to keep original page labels if you want each file's own
labels, which can produce duplicates such as two pages both labeled
1.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I alternate pages from password-protected PDFs?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
If a file is encrypted you're asked for its password when it loads,
and the decrypted copy is used for mixing. The output isn't
encrypted, so use
<a href="/protect-pdf" class="text-indigo-300 hover:text-indigo-400"
>Protect PDF</a
>
afterward if it needs a password again.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are the PDFs uploaded to a server while they're being interleaved?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The files are read in your browser and interleaved by a
WebAssembly build of cpdf running in a background worker on your
device, and the finished alternated-mixed.pdf is saved straight from
the browser.
</p>
</details>
</div>
+87 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Background Color online free - Background color PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Change the background color of your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="background color, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -35,7 +35,7 @@
/>
<meta
property="og:description"
content="★ Background Color online free - Background color PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Change the background color of your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -54,7 +54,7 @@
<meta name="twitter:title" content="Background Color Free" />
<meta
name="twitter:description"
content="★ Background Color online free - Background color PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Change the background color of your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -68,10 +68,6 @@
<meta name="apple-mobile-web-app-title" content="Background Color" />
<title>Change Background Color - BentoPDF</title>
<meta
name="description"
content="Change the background color of your PDF documents. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -332,32 +328,107 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is background color really free?
How do I change the background color of a PDF without losing the
text?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Upload the PDF, pick a color, and the tool draws a solid rectangle
behind each page and places the original page content on top of it.
The text stays real text, so it remains selectable and searchable,
and the page dimensions don't change.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Why didn't the background color show up on some pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
The color sits underneath the existing content, so any page that
already has an opaque background covers it up. Scanned pages, which
are usually one full-page image, and pages with a drawn white
background are the most common cases.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Does the color apply to every page or can I pick specific pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
There's no page range option, so the same color is applied to every
page in the document. To color only certain pages, pull them out
with
<a href="/split-pdf" class="text-indigo-300 hover:text-indigo-400"
>Split PDF</a
>, color that file, and merge it back.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What colors work best as a PDF background?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Light, muted tones such as cream, ivory, or pale yellow keep black
text readable, which is why the default is a light yellow (#FFFFCC).
A dark background makes normal black text hard to read because the
text color isn't changed; use
<a href="/text-color" class="text-indigo-300 hover:text-indigo-400"
>Change Text Color</a
>
on the result if you want light text on a dark page.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Will links, form fields, or bookmarks survive the color change?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Each page is re-embedded as a drawing on top of the color layer
and written into a new file, so link annotations, form fields,
comments, and bookmarks aren't carried over. Change the background
first and add those elements afterward.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does changing the background turn my pages into images or make the
file bigger?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Pages aren't rasterized. The tool works at the PDF object level and
only adds a filled rectangle per page, so fonts and vector graphics
stay intact and the file size stays close to the original.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my PDF uploaded when I change its background color?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The color layer is added by code running in your browser and the
finished file is saved directly from the page to your device. The
document isn't sent to a server at any point.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I change the background color of a password-protected PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
If the PDF needs a password to open, the tool prompts you for it and
then processes the file as usual. The output is saved without that
password, so protect it again with
<a href="/protect-pdf" class="text-indigo-300 hover:text-indigo-400"
>Protect PDF</a
>
if you still need it locked.
</p>
</details>
</div>
+81 -10
View File
@@ -476,33 +476,104 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
What is Bates numbering?
What does the Bates number look like on the page?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Bates numbering is a method of indexing legal documents for easy
identification and retrieval. Each page receives a unique sequential
number, often combined with a prefix or suffix.
By default it's a six-digit zero-padded number such as 000001 placed
at the footer center in 10 pt Helvetica. Presets can add an exhibit
number, a case label, and a page number, for example Exhibit 1 Case
XYZ 000001 Page 1, and the preview box shows the exact text before
you process anything.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I number multiple files at once?
Can I use my own prefix or case number instead of the presets?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! Upload multiple PDFs and the bates numbers will continue
sequentially across all files. Drag files to reorder them.
Yes. Pick Custom style and write a template with placeholders:
[BATES] for the sequential number, [PAGE] for the page number within
the file, [FILE] for the file counter, and [FILENAME] for the source
file name. A template like SMITH-[BATES] produces SMITH-000001,
SMITH-000002, and so on.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files secure?
Does the numbering continue across multiple PDFs or restart for each
file?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
All processing happens entirely in your browser. Your files never
leave your device.
It continues. If the first file has 30 pages and numbering starts at
1, the second file begins at 000031, following the order of the file
list, which you can rearrange by dragging. There's no option to
restart the count per file; process the files separately if you need
that.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How many digits can the number have?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Zero padding can be 3, 4, 5, or 6 digits, or turned off so 1, 2, 3
print without leading zeros. The count itself isn't capped; if it
grows past the padding width, the extra digits are still printed.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Where does the stamp go, and will it cover my content?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
You choose one of six spots: header or footer, at the left, center,
or right. The margin scales with the page, roughly 4 percent of the
width or height with a floor of 8 points and a cap of 40, so the
stamp sits in the same relative place on Letter, A4, and oversized
exhibits. Existing content isn't shifted, so on pages printed edge
to edge the stamp can overlap it.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are Bates numbers searchable text or an image?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
They're real text drawn in Helvetica, Times New Roman, or Courier,
so they can be selected, searched, and read by review software
without OCR. These are the built-in PDF standard fonts, which cover
Latin characters only, so a template containing other scripts will
fail.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my discovery documents uploaded to a server for stamping?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Stamping happens inside your browser and the numbered files are
written straight to your downloads folder. Nothing about the
documents, the case name, or the numbering leaves the machine, which
matters for privileged material.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What do I get when I stamp several files at once?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Each PDF is numbered as its own file and keeps its original name; a
single file downloads directly, and two or more download together as
bates_numbered.zip. The files aren't merged, so the page counts and
order inside each document stay as they were.
</p>
</details>
</div>
+88 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ BMP to PDF online free - BMP to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Create a PDF from one or more BMP images. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="bmp to pdf, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ BMP to PDF online free - BMP to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Create a PDF from one or more BMP images. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,7 +48,7 @@
<meta name="twitter:title" content="BMP to PDF Free" />
<meta
name="twitter:description"
content="★ BMP to PDF online free - BMP to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Create a PDF from one or more BMP images. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -62,10 +62,6 @@
<meta name="apple-mobile-web-app-title" content="BMP to PDF" />
<title>BMP to PDF - BentoPDF</title>
<meta
name="description"
content="Convert BMP images to PDF. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -326,32 +322,108 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is bmp to pdf really free?
Can I combine several BMP files into one PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Yes. Every BMP you add becomes its own page in a single PDF, in the
order shown in the file list. There's no option to produce one PDF
per file, so convert files separately if you need them split.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Why is the PDF smaller than my BMP files?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
BMP stores uncompressed pixels, so the files are large. The
converter redraws each image and stores it in the PDF as lossless
PNG, which usually shrinks it considerably without changing a single
pixel.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Is any image quality lost in the conversion?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
No. Pixels are stored losslessly and there's no quality setting on
this tool, so the output has the same resolution and colors as the
source. If you need a smaller file afterward, run the PDF through
<a
href="/compress-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Compress PDF</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What page size does the PDF get when I convert a BMP?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Each page is sized to the image's pixel dimensions at one point per
pixel, so a 2480 by 3508 pixel scan produces a page about 34 by 49
inches rather than A4. Viewers and printers scale it to fit, and
<a
href="/fix-page-size"
class="text-indigo-300 hover:text-indigo-400"
>Fix Page Size</a
>
can resize every page to A4 or Letter afterward.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why does it say one of my files is invalid?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Images are decoded by your browser, which handles standard Windows
bitmaps. Unusual variants such as OS/2 headers or rare compression
modes can fail; re-saving the file as a standard 24-bit BMP or as
PNG in any image editor fixes it.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I mix BMP with JPG or PNG files?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
This tool accepts only .bmp files and skips anything else you add.
Use
<a
href="/image-to-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Images to PDF</a
>
when you need to combine several formats into one document.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does the BMP's DPI setting affect the result?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The resolution stored in the file header is ignored and page
size comes purely from pixel count, so two images with the same
pixel dimensions produce identical pages regardless of their DPI.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my BMP files uploaded anywhere?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Decoding uses your browser's own image support and the PDF is
assembled locally with pdf-lib, so scanner or medical imaging
exports never leave your computer.
</p>
</details>
</div>
+83 -12
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Bookmark online free - Bookmark PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Bookmark online. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="bookmark, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ Bookmark online free - Bookmark PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Bookmark online. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,7 +48,7 @@
<meta name="twitter:title" content="Bookmark Free" />
<meta
name="twitter:description"
content="★ Bookmark online free - Bookmark PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Bookmark online. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -787,32 +787,103 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is bookmark really free?
How do I add bookmarks to a PDF that doesn't have any?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Upload the PDF, go to a page, type a title, and click Add to Page;
drag entries to nest or reorder them. Click Save PDF with Bookmarks
to download the result. For a printed contents page inside the
document rather than sidebar navigation, use
<a
href="/table-of-contents"
class="text-indigo-300 hover:text-indigo-400"
>Table of Contents</a
>
instead.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Will my existing bookmarks be kept?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Only if you check Auto-extract existing bookmarks before uploading,
or use the extract button afterward, so they load into the panel.
When you save, the panel's contents replace the PDF's bookmark tree
entirely, so anything not loaded into the editor is dropped.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
What is the CSV format for importing bookmarks?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
A header row followed by one line per bookmark with three columns:
title,page,level. Titles containing commas go in double quotes, page
is the 1-based page number, and level controls nesting, with the
lowest number for top-level entries and each deeper child adding
one.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can a bookmark jump to a specific spot on a page instead of the top?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Open the bookmark's edit dialog, turn on Set custom destination, and
either type X and Y coordinates plus a zoom percentage or click the
pick button and then click the exact spot on the page preview. The
bookmark is saved as an XYZ destination, which most readers honor.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I color or bold bookmarks?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Each bookmark can be red, blue, green, yellow, purple, or a custom
hex color, and styled bold, italic, or bold italic. Turn on Batch
Mode to select several bookmarks and apply a color or style to all
of them at once.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How do I get bookmarks out of a PDF for editing in a spreadsheet?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Load them with Auto-extract, then use Export to CSV or Export to
JSON; the file is named after your PDF with a -bookmarks suffix. The
CSV opens in Excel or Google Sheets, and once you've edited it you
can import it back and save a new PDF.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does the editor work on password-protected PDFs?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
You'll be asked for the password when you upload the file, and the
editor opens once it's entered. The saved PDF is written without the
password, so protect it again afterward if you need to.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my PDF uploaded while I edit bookmarks?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The page preview, the bookmark tree, and the final save are all
handled in your browser with PDF.js and pdf-lib, so the file never
leaves your computer.
</p>
</details>
</div>
+83 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ CBZ to PDF online free - CBZ to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert comic book archives (CBZ/CBR) to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="cbz to pdf, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ CBZ to PDF online free - CBZ to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert comic book archives (CBZ/CBR) to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,7 +48,7 @@
<meta name="twitter:title" content="CBZ to PDF Free" />
<meta
name="twitter:description"
content="★ CBZ to PDF online free - CBZ to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert comic book archives (CBZ/CBR) to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -62,10 +62,6 @@
<meta name="apple-mobile-web-app-title" content="CBZ to PDF" />
<title>CBZ to PDF - Convert XPS/OCBZ to PDF - BentoPDF</title>
<meta
name="description"
content="Convert XPS and OXPS documents to PDF format. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -333,32 +329,103 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is cbz to pdf really free?
Does converting a CBZ to PDF reduce the image quality?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
JPEG and PNG pages are copied into the PDF as they are, with no
re-encoding, so the artwork looks exactly like the original and the
file size stays about the same. Other formats such as WebP, GIF, or
BMP are decoded and re-saved as lossless PNG before embedding.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
How does the tool decide the page order?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Pages are sorted by filename using natural ordering, so page2.jpg
comes before page10.jpg. Files in subfolders are included and sorted
by their full path, and non-image files such as ComicInfo.xml are
ignored.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
What page size do the comic pages get in the PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Each page is sized to the pixel dimensions of its image, one point
per pixel, so a double-page spread comes out as a wide landscape
page and single pages stay portrait. There's no option to force one
size here; if you need uniform pages, run the result through
<a
href="/fix-page-size"
class="text-indigo-300 hover:text-indigo-400"
>Fix Page Size</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I convert CBR files as well as CBZ?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
.cbr archives are accepted and can be mixed with .cbz files in the
same batch. CBR files are routed through the PyMuPDF engine, which
downloads on first use, so they take a little longer than CBZ files,
which are unpacked directly in the browser.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Which image formats inside the archive are supported?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
JPEG and PNG are embedded directly. GIF, BMP, WebP, AVIF, TIFF,
HEIC, and JXL are converted to PNG by your browser first, so those
less common formats only work if your browser can display them;
TIFF, HEIC, and JXL fail in some browsers. The converter checks the
actual image data rather than the extension, so a PNG named .jpg
still works.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a limit on archive size or page count?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
A single CBZ can hold up to 2,000 images, with each image capped at
100 MB and 500 MB of uncompressed image data per archive. Those
limits keep the browser from running out of memory, and they're far
above a typical comic issue.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What happens when I convert several comics at once?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Each archive becomes its own PDF named after the original file. One
file downloads directly; two or more are bundled into
comic-converted.zip.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my comic files uploaded anywhere?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. CBZ archives are unzipped and rebuilt as PDFs entirely inside
your browser, and CBR files are handled by an engine that also runs
locally. Nothing from your collection leaves your device.
</p>
</details>
</div>
+91 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Change Permissions online free - Change permissions PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Set or change user permissions on a PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="change permissions, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -35,7 +35,7 @@
/>
<meta
property="og:description"
content="★ Change Permissions online free - Change permissions PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Set or change user permissions on a PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -54,7 +54,7 @@
<meta name="twitter:title" content="Change Permissions Free" />
<meta
name="twitter:description"
content="★ Change Permissions online free - Change permissions PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Set or change user permissions on a PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -68,10 +68,6 @@
<meta name="apple-mobile-web-app-title" content="Change Permissions" />
<title>Change PDF Permissions - Manage PDF Security - BentoPDF</title>
<meta
name="description"
content="Change PDF permissions and passwords. Set or modify user permissions, encryption, and access controls. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -445,32 +441,111 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is change permissions really free?
What is the difference between a user password and an owner
password?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
The user password is required to open the PDF at all. The owner
password protects the permission settings and is what someone needs
to change or remove them later. Set only an owner password if anyone
should be able to open the file but with printing, copying, or
editing restricted.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Why does the tool ask for an owner password when I set permissions?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Permission flags are only enforced when an owner password exists;
without one, PDF readers treat the file as unrestricted. The tool
therefore requires a New Owner Password whenever you set permissions
or a user password.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
How do I stop people from copying text or printing my PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Uncheck "Allow Copying Text" and "Allow Printing", enter a New Owner
Password, and click Change Permissions. Adobe Reader and other
compliant viewers will then block those actions. Some third-party
tools ignore permission flags, so for sensitive material consider
<a
href="/rasterize-pdf"
class="text-indigo-300 hover:text-indigo-400"
>rasterizing the pages</a
>
as well.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Which permissions can I control?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Seven checkboxes: printing, copying text, modifying content,
annotating, filling forms, document assembly (inserting, deleting,
or rotating pages), and page extraction. An unchecked box means the
action is not allowed.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What encryption does Change Permissions use?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The output is encrypted with 256-bit AES. That also makes this a
quick way to upgrade an old RC4-encrypted PDF: enter its current
password, set new passwords, and the file is rewritten with AES-256.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I change permissions on a PDF that is already password
protected?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes, enter the existing password in the Current Password field. The
tool opens the file with it, then re-encrypts it with your new
passwords and permission settings; a wrong current password produces
an error and nothing is changed.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How do I remove all restrictions instead of changing them?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Leave both new password fields empty and click Change Permissions.
The output is fully decrypted with no passwords and no permission
flags. If you don't have the current password, use
<a
href="/remove-restrictions"
class="text-indigo-300 hover:text-indigo-400"
>Remove Restrictions</a
>
instead, which works without one when the PDF opens freely.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my PDF or its owner password sent anywhere when I change
permissions?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The encryption is done by QPDF compiled to WebAssembly inside
your browser tab, so the file and every password you type stay on
your device.
</p>
</details>
</div>
+80 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Combine Single Page online free - Combine single page PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Combine Single Page online. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="combine single page, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -35,7 +35,7 @@
/>
<meta
property="og:description"
content="★ Combine Single Page online free - Combine single page PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Combine Single Page online. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -54,7 +54,7 @@
<meta name="twitter:title" content="Combine Single Page Free" />
<meta
name="twitter:description"
content="★ Combine Single Page online free - Combine single page PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Combine Single Page online. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -68,10 +68,6 @@
<meta name="apple-mobile-web-app-title" content="Combine Single Page" />
<title>Combine to Single Page - BentoPDF</title>
<meta
name="description"
content="Combine all PDF pages into one continuous page. Stack pages horizontally or vertically. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -409,32 +405,100 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is combine single page really free?
How do I merge all pages of a PDF into one long page?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Upload the PDF, keep Layout Direction set to Vertical, and click the
process button. Every page is placed top to bottom on one continuous
page, with the output width matching the widest source page and
narrower pages centered.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Can I put the pages side by side instead of stacked?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Choose Horizontal (Left to Right) in Layout Direction. Pages are
laid out in order from left to right on a single wide page, and
pages shorter than the tallest one are centered vertically.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Can I add a gap or a line between the pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Spacing (0 by default) adds a gap between pages, measured in the
PDF's own units where 72 equals one inch, and Background Color fills
that gap. Turn on Add Separator Lines to draw a line through the
middle of each gap, with its own thickness (0.5 units and up, in
steps of 0.5) and color.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does the background color apply to the whole page or only the gaps?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
It fills the whole output page underneath the source pages, so it
shows in the spacing between pages and in any margin where a
narrower page is centered. With white selected, the default, no fill
is drawn at all.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Will the text in the combined page still be selectable?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Each source page is rendered to an image at 2x resolution and
drawn onto the new page, so the result is a picture of your pages
rather than live text. Keep the original PDF if you need to copy or
search text later.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a limit to how many pages I can stitch together?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The tool doesn't set one, but the output grows with every page you
add: a 100-page document becomes a page roughly 100 pages tall. Some
readers struggle with very large pages; Adobe Reader, for example,
doesn't display pages larger than 200 inches on a side.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What is a single long-page PDF useful for?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
It suits scrolling previews for the web, design mockups, comic
strips, and storyboards where the reader scrolls instead of flipping
pages. If you want several pages printed on one sheet in a grid,
<a href="/n-up-pdf" class="text-indigo-300 hover:text-indigo-400"
>N-Up PDF</a
>
is the better fit.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does the combined PDF get uploaded to a server?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Rendering the pages and building the new single-page PDF both
happen in your browser, and the file stays on your device the whole
time.
</p>
</details>
</div>
+80 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Compare PDFs online free - Compare PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Compare two PDFs side by side. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="compare pdfs, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ Compare PDFs online free - Compare PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Compare two PDFs side by side. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,7 +48,7 @@
<meta name="twitter:title" content="Compare PDFs Free" />
<meta
name="twitter:description"
content="★ Compare PDFs online free - Compare PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Compare two PDFs side by side. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -62,10 +62,6 @@
<meta name="apple-mobile-web-app-title" content="Compare PDFs" />
<title>Compare PDFs - BentoPDF</title>
<meta
name="description"
content="Compare two PDF files side by side or with overlay. See differences between PDF versions. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
<style>
@@ -1160,32 +1156,100 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is compare pdfs really free?
How do I see what changed between two versions of a PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Upload the original as the first PDF and the revised version as the
second. The tool pairs matching pages, then highlights added,
deleted, modified, and moved content on each page pair, with
counters showing how many changes of each kind were found.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
What is the difference between side-by-side and overlay mode?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Side-by-side shows the two pages next to each other with
synchronized scrolling, which is easiest for reading text changes.
Overlay stacks the revised page on top of the original with an
opacity slider, so shifted or resized elements stand out, and the
Flicker button switches the top page on and off to make small moves
visible.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Can it compare scanned PDFs that have no text layer?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
With OCR turned on, page images are run through Tesseract in your
browser and the recognized text is compared, so scanned documents
can be checked. OCR currently uses the English language model, and
it's slower than comparing PDFs that already contain text.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I filter out formatting changes and only see text differences?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Changes are grouped into text, image, header/footer, annotation,
formatting, and background categories, each with its own toggle.
Turn off the categories you don't care about, and use the text
search box to find a specific changed word or phrase.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What happens when pages were added, removed, or reordered between
versions?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Pages are paired by content similarity rather than by page number,
so an inserted page doesn't throw off everything after it. A page
with no counterpart is reported as added or removed, and the page
navigation steps through the pairs the tool built.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does it detect changes to comments and annotations?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Annotation changes are their own category, so added or removed
comments, highlights, and markup are flagged separately from body
text and can be shown or hidden with the annotation filter.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I save the comparison as a report?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The Export as PDF menu produces a PDF of the comparison. In
side-by-side mode you can choose a split view, alternating pages, or
only the left or right document with highlights; in overlay mode it
exports the overlay view.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are the two PDFs sent anywhere to be compared?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Rendering, page pairing, OCR, and change detection all run in
your browser with WebAssembly and web workers, and nothing is
transmitted, so contracts and other confidential drafts stay on your
machine.
</p>
</details>
</div>
+709
View File
@@ -0,0 +1,709 @@
<!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 for Email Attachment Free | BentoPDF</title>
<meta
name="title"
content="Compress PDF for Email Attachment Free | BentoPDF"
/>
<meta
name="description"
content="Shrink a PDF to fit email attachment limits like Gmail's 25MB. Free, no uploads. Compression runs in your browser."
/>
<meta
name="keywords"
content="compress pdf for email, compress pdf, reduce pdf size, pdf compressor"
/>
<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-for-email"
/>
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta
property="og:url"
content="https://www.bentopdf.com/compress-pdf-for-email"
/>
<meta
property="og:title"
content="Compress PDF for Email Attachment Free | BentoPDF"
/>
<meta
property="og:description"
content="Shrink a PDF to fit email attachment limits like Gmail's 25MB. Free, no uploads. Compression runs in your browser."
/>
<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-for-email"
/>
<meta
name="twitter:title"
content="Compress PDF for Email Free - BentoPDF"
/>
<meta
name="twitter:description"
content="Shrink a PDF to fit email attachment limits like Gmail's 25MB. Free, no uploads. Compression runs in your browser."
/>
<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 for Email" />
<link href="/src/css/styles.css" rel="stylesheet" />
<!-- 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>
<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">
Compress PDF for Email
</h1>
<p class="text-gray-400 mb-6">
Shrink PDFs to fit any email attachment limit.
</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 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-300 hover:text-indigo-400 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>
<section class="max-w-4xl mx-auto px-4 pt-12">
<p id="direct-answer" class="text-gray-300 text-lg leading-relaxed">
To email a large PDF, compress it below your provider's attachment limit
first: add the file below, pick Balanced, and download the smaller copy
to attach. The work happens in your browser, so a confidential contract
never touches a third-party server on its way to your outbox.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">
Email attachment limits in practice
</h2>
<p class="text-gray-400 leading-relaxed">
Gmail allows 25MB per message, Outlook.com 20MB, Yahoo 25MB, iCloud
20MB. and corporate mail servers are often far stricter, commonly 10MB
and sometimes 5MB. The limit applies to the whole message after
encoding, which inflates attachments by about a third, so a "25MB" limit
really fits roughly an 18MB file. When in doubt, aim well below the
ceiling.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">
Better than a download link
</h2>
<p class="text-gray-400 leading-relaxed">
Cloud links expire, need permissions, and get quarantined by security
filters. A compressed attachment simply arrives. Balanced level
typically cuts a scanned contract or slide deck by 60 to 90%, which
turns most too-big files into comfortable attachments while keeping them
readable and printable.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">
For recurring email workflows
</h2>
<p class="text-gray-400 leading-relaxed">
If you regularly send batches of documents, compress them all at once.
each file processes independently in your browser. Pair with the Merge
PDF tool to combine several attachments into one tidy file before
compressing.
</p>
</section>
<!-- 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"
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 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"
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="merge-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">Merge PDF</h3>
<p class="text-gray-400 text-sm">Free online merge PDF tool</p>
</a>
<a
href="split-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">Split PDF</h3>
<p class="text-gray-400 text-sm">Free online split PDF tool</p>
</a>
<a
href="pdf-to-jpg.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">PDF to JPG</h3>
<p class="text-gray-400 text-sm">Free online PDF to JPG 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"
data-i18n="faq.sectionTitle"
>
Frequently Asked Questions
</h2>
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
What size should an email attachment be?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
Under 10MB is safe for virtually every recipient, including strict
corporate servers. Under 5MB is courteous for recipients on mobile
connections.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why does my 24MB PDF bounce with a 25MB limit?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
Email encodes attachments in a format that adds roughly 33%
overhead, so a 24MB file becomes a 32MB message. Compress the PDF to
about 18MB or less to fit a 25MB limit.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is it safe to compress confidential documents here?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
Yes. this is the point of BentoPDF. The file is processed by
WebAssembly inside your browser and is never uploaded, so the only
copies are on your device and in the email you choose to send.
</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/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 for Email - BentoPDF",
"applicationCategory": "PDF Compression Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"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 for Email",
"item": "https://www.bentopdf.com/compress-pdf-for-email"
}
]
}
</script>
</body>
</html>
+720
View File
@@ -0,0 +1,720 @@
<!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 to 100KB Free Online | BentoPDF</title>
<meta name="title" content="Compress PDF to 100KB Free Online | BentoPDF" />
<meta
name="description"
content="Shrink a PDF below 100KB for job portals and government forms. Free, no uploads. Compression runs entirely in your browser."
/>
<meta
name="keywords"
content="compress pdf to 100kb, compress pdf, reduce pdf size, pdf compressor"
/>
<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-to-100kb"
/>
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta
property="og:url"
content="https://www.bentopdf.com/compress-pdf-to-100kb"
/>
<meta
property="og:title"
content="Compress PDF to 100KB Free Online | BentoPDF"
/>
<meta
property="og:description"
content="Shrink a PDF below 100KB for job portals and government forms. Free, no uploads. Compression runs entirely in your browser."
/>
<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-to-100kb"
/>
<meta
name="twitter:title"
content="Compress PDF to 100KB Free - BentoPDF"
/>
<meta
name="twitter:description"
content="Shrink a PDF below 100KB for job portals and government forms. Free, no uploads. Compression runs entirely in your browser."
/>
<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 to 100KB" />
<link href="/src/css/styles.css" rel="stylesheet" />
<!-- 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>
<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">
Compress PDF to 100KB
</h1>
<p class="text-gray-400 mb-6">
Get your PDF under 100KB for portals with strict upload limits.
</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 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-300 hover:text-indigo-400 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>
<section class="max-w-4xl mx-auto px-4 pt-12">
<p id="direct-answer" class="text-gray-300 text-lg leading-relaxed">
To compress a PDF to 100KB, add your file below, choose the Aggressive
or Extreme compression level, and download the smaller file. Everything
runs inside your browser. the PDF is never uploaded to a server, so even
sensitive documents like ID scans and application forms stay on your
device.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">
When you need a PDF under 100KB
</h2>
<p class="text-gray-400 leading-relaxed">
A 100KB cap is common on job application portals, government e-filing
systems, university admission forms, and visa or immigration websites.
These systems usually reject larger files outright, often without a
helpful error message, so compressing before you upload saves a failed
submission.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">
What to expect at 100KB
</h2>
<p class="text-gray-400 leading-relaxed">
A text-based PDF of a few pages. a resume, cover letter, or typed form.
compresses below 100KB easily with no visible change. Scanned documents
and photo-heavy files are harder: to hit 100KB they need stronger image
downscaling, so expect visibly softer images. If your scan will not
reach 100KB with the Extreme level, try the Photon mode, which rebuilds
each page as an optimized image, or split the document and compress the
pages you actually need to submit.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">
Tips for the smallest possible file
</h2>
<p class="text-gray-400 leading-relaxed">
Remove pages you do not need before compressing. Prefer documents
exported straight from an editor over scans. a re-typed one-page form is
often 20KB while the same page scanned is 500KB. If you control the
scanner, scan at 150 DPI in grayscale instead of 300 DPI color.
</p>
</section>
<!-- 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"
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 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"
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="merge-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">Merge PDF</h3>
<p class="text-gray-400 text-sm">Free online merge PDF tool</p>
</a>
<a
href="split-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">Split PDF</h3>
<p class="text-gray-400 text-sm">Free online split PDF tool</p>
</a>
<a
href="pdf-to-jpg.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">PDF to JPG</h3>
<p class="text-gray-400 text-sm">Free online PDF to JPG 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"
data-i18n="faq.sectionTitle"
>
Frequently Asked Questions
</h2>
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Can every PDF be compressed to 100KB?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
Not always. Short text-based PDFs almost always can. Long or heavily
scanned documents may bottom out above 100KB even at Extreme level.
in that case split the file or rescan at a lower DPI and compress
again.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Which compression level should I pick for 100KB?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
Start with Aggressive. If the result is still over 100KB, run
Extreme, and for scans try Photon mode. You can compress the same
file repeatedly with different levels. nothing is uploaded, so
retries are instant.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Will my text stay selectable?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
With the standard Condense engine, yes. text, links, and form fields
are preserved. Photon mode converts pages to images, so text is no
longer selectable; use it only when a scan refuses to shrink.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my document private?<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes. Compression runs entirely in your browser using WebAssembly.
The file never leaves your device, which matters for the ID
documents and applications that 100KB limits usually involve.
</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/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 to 100KB - BentoPDF",
"applicationCategory": "PDF Compression Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"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 to 100KB",
"item": "https://www.bentopdf.com/compress-pdf-to-100kb"
}
]
}
</script>
</body>
</html>
+683
View File
@@ -0,0 +1,683 @@
<!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 to 1MB Free Online | BentoPDF</title>
<meta name="title" content="Compress PDF to 1MB Free Online | BentoPDF" />
<meta
name="description"
content="Reduce any PDF below 1MB for uploads and sharing. Free, and nothing is uploaded to any server. Runs entirely in your browser."
/>
<meta
name="keywords"
content="compress pdf to 1mb, compress pdf, reduce pdf size, pdf compressor"
/>
<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-to-1mb" />
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta
property="og:url"
content="https://www.bentopdf.com/compress-pdf-to-1mb"
/>
<meta
property="og:title"
content="Compress PDF to 1MB Free Online | BentoPDF"
/>
<meta
property="og:description"
content="Reduce any PDF below 1MB for uploads and sharing. Free, and nothing is uploaded to any server. Runs entirely in your browser."
/>
<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-to-1mb"
/>
<meta name="twitter:title" content="Compress PDF to 1MB Free - BentoPDF" />
<meta
name="twitter:description"
content="Reduce any PDF below 1MB for uploads and sharing. Free, and nothing is uploaded to any server. Runs entirely in your browser."
/>
<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 to 1MB" />
<link href="/src/css/styles.css" rel="stylesheet" />
<!-- 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>
<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">Compress PDF to 1MB</h1>
<p class="text-gray-400 mb-6">
Reduce large PDFs below the most common 1MB upload limit.
</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 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-300 hover:text-indigo-400 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>
<section class="max-w-4xl mx-auto px-4 pt-12">
<p id="direct-answer" class="text-gray-300 text-lg leading-relaxed">
To compress a PDF to 1MB, add the file below, use the Balanced level,
and download the smaller copy. One megabyte is the most common upload
ceiling on the web, and nearly every document reaches it without visible
quality loss. processed privately in your browser.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">
The most common upload limit
</h2>
<p class="text-gray-400 leading-relaxed">
Countless web forms cap attachments at 1MB: HR systems, insurance claim
uploads, property portals, CRM attachments. Even large reports with
photos usually compress below 1MB at Balanced level, because most PDF
weight is unoptimized images and duplicate embedded fonts that
compression removes losslessly first.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">Very large files</h2>
<p class="text-gray-400 leading-relaxed">
A 50 to 100MB scanned book or brochure may need the Aggressive level to
get under 1MB, and extremely long documents may not fit at any quality.
In that case, split the PDF into logical parts. chapters or sections.
and compress each part under 1MB.
</p>
</section>
<!-- 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"
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 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"
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="merge-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">Merge PDF</h3>
<p class="text-gray-400 text-sm">Free online merge PDF tool</p>
</a>
<a
href="split-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">Split PDF</h3>
<p class="text-gray-400 text-sm">Free online split PDF tool</p>
</a>
<a
href="pdf-to-jpg.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">PDF to JPG</h3>
<p class="text-gray-400 text-sm">Free online PDF to JPG 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"
data-i18n="faq.sectionTitle"
>
Frequently Asked Questions
</h2>
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
How much can compression reduce my PDF?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
Typical reductions are 50 to 90%. Image-heavy files shrink the most;
already-optimized PDFs shrink the least. You see the exact
before-and-after size instantly, and nothing counts against a quota.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit for what I can compress?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
No hard limit. processing happens on your own machine, so capacity
depends on your device rather than a server plan. Files of several
hundred megabytes work on a typical laptop.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does compressing affect signatures or form fields?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
The standard engine preserves form fields. A digitally signed PDF,
however, will have its signature invalidated by any modification.
compress before signing, not after.
</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/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 to 1MB - BentoPDF",
"applicationCategory": "PDF Compression Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"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 to 1MB",
"item": "https://www.bentopdf.com/compress-pdf-to-1mb"
}
]
}
</script>
</body>
</html>
+691
View File
@@ -0,0 +1,691 @@
<!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 to 200KB Free Online | BentoPDF</title>
<meta name="title" content="Compress PDF to 200KB Free Online | BentoPDF" />
<meta
name="description"
content="Reduce a PDF below 200KB for application portals and email forms. Free, no uploads. Runs entirely in your browser."
/>
<meta
name="keywords"
content="compress pdf to 200kb, compress pdf, reduce pdf size, pdf compressor"
/>
<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-to-200kb"
/>
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta
property="og:url"
content="https://www.bentopdf.com/compress-pdf-to-200kb"
/>
<meta
property="og:title"
content="Compress PDF to 200KB Free Online | BentoPDF"
/>
<meta
property="og:description"
content="Reduce a PDF below 200KB for application portals and email forms. Free, no uploads. Runs entirely in your browser."
/>
<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-to-200kb"
/>
<meta
name="twitter:title"
content="Compress PDF to 200KB Free - BentoPDF"
/>
<meta
name="twitter:description"
content="Reduce a PDF below 200KB for application portals and email forms. Free, no uploads. Runs entirely in your browser."
/>
<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 to 200KB" />
<link href="/src/css/styles.css" rel="stylesheet" />
<!-- 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>
<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">
Compress PDF to 200KB
</h1>
<p class="text-gray-400 mb-6">
Reduce your PDF below 200KB without losing readability.
</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 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-300 hover:text-indigo-400 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>
<section class="max-w-4xl mx-auto px-4 pt-12">
<p id="direct-answer" class="text-gray-300 text-lg leading-relaxed">
To get a PDF under 200KB, add the file below, pick the Balanced or
Aggressive level, and download the result. The compression happens
locally in your browser. no upload, no signup, no file limit.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">
When 200KB is the target
</h2>
<p class="text-gray-400 leading-relaxed">
A 200KB ceiling shows up on bank KYC uploads, scholarship and exam
registration portals, and many national e-government services. It is a
friendlier target than 100KB: most everyday documents reach it with the
Balanced level and no visible quality loss.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">
Getting a stubborn file under 200KB
</h2>
<p class="text-gray-400 leading-relaxed">
If a scanned document stays above 200KB, step up to Aggressive, which
downscales images harder while keeping text crisp. Multi-page scans
benefit from removing blank or irrelevant pages first. every scanned
page you delete is often 100KB saved before compression even starts.
</p>
</section>
<!-- 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"
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 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"
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="merge-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">Merge PDF</h3>
<p class="text-gray-400 text-sm">Free online merge PDF tool</p>
</a>
<a
href="split-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">Split PDF</h3>
<p class="text-gray-400 text-sm">Free online split PDF tool</p>
</a>
<a
href="pdf-to-jpg.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">PDF to JPG</h3>
<p class="text-gray-400 text-sm">Free online PDF to JPG 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"
data-i18n="faq.sectionTitle"
>
Frequently Asked Questions
</h2>
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
What quality should I expect at 200KB?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
Typed documents look identical. Scans keep readable text at
Aggressive level; photos inside the PDF will look slightly softer
but remain clear on screen.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
The portal wants under 200KB but my file is 10MB. possible?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
Usually yes, if most of the weight is images. A 10MB scan at 300 DPI
color typically compresses to 150 to 400KB at Aggressive level. If
it lands just above 200KB, re-run with Extreme.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Do I need to sign up or pay?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
No. Every BentoPDF tool is free with no account, and because the
work happens in your browser there are no server costs to pass on to
you.
</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/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 to 200KB - BentoPDF",
"applicationCategory": "PDF Compression Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"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 to 200KB",
"item": "https://www.bentopdf.com/compress-pdf-to-200kb"
}
]
}
</script>
</body>
</html>
+682
View File
@@ -0,0 +1,682 @@
<!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 to 2MB Free Online | BentoPDF</title>
<meta name="title" content="Compress PDF to 2MB Free Online | BentoPDF" />
<meta
name="description"
content="Bring a PDF under 2MB while keeping high image quality. Free, no uploads. Runs entirely in your browser."
/>
<meta
name="keywords"
content="compress pdf to 2mb, compress pdf, reduce pdf size, pdf compressor"
/>
<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-to-2mb" />
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta
property="og:url"
content="https://www.bentopdf.com/compress-pdf-to-2mb"
/>
<meta
property="og:title"
content="Compress PDF to 2MB Free Online | BentoPDF"
/>
<meta
property="og:description"
content="Bring a PDF under 2MB while keeping high image quality. Free, no uploads. Runs entirely in your browser."
/>
<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-to-2mb"
/>
<meta name="twitter:title" content="Compress PDF to 2MB Free - BentoPDF" />
<meta
name="twitter:description"
content="Bring a PDF under 2MB while keeping high image quality. Free, no uploads. Runs entirely in your browser."
/>
<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 to 2MB" />
<link href="/src/css/styles.css" rel="stylesheet" />
<!-- 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>
<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">Compress PDF to 2MB</h1>
<p class="text-gray-400 mb-6">
Meet 2MB portal limits while keeping high image quality.
</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 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-300 hover:text-indigo-400 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>
<section class="max-w-4xl mx-auto px-4 pt-12">
<p id="direct-answer" class="text-gray-300 text-lg leading-relaxed">
To compress a PDF to 2MB, add your file below, choose the Light or
Balanced level, and download the result. A 2MB budget lets you keep high
image quality. ideal for portfolios and reports. and the compression
runs entirely on your device.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">
Quality-first compression
</h2>
<p class="text-gray-400 leading-relaxed">
With 2MB to work with, you rarely need destructive settings. The Light
level removes dead weight. duplicate fonts, unused objects, editing
leftovers. and keeps images nearly untouched, which suits design
portfolios, photography-heavy reports, and print-ready documents that
still have to pass an upload check.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">Common 2MB situations</h2>
<p class="text-gray-400 leading-relaxed">
University thesis submission systems, conference paper uploads, and many
procurement portals cap files at 2MB. Documents exported from Word or
Google Docs almost always fit after Light compression; InDesign or Canva
exports with full-resolution imagery may need Balanced.
</p>
</section>
<!-- 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"
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 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"
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="merge-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">Merge PDF</h3>
<p class="text-gray-400 text-sm">Free online merge PDF tool</p>
</a>
<a
href="split-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">Split PDF</h3>
<p class="text-gray-400 text-sm">Free online split PDF tool</p>
</a>
<a
href="pdf-to-jpg.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">PDF to JPG</h3>
<p class="text-gray-400 text-sm">Free online PDF to JPG 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"
data-i18n="faq.sectionTitle"
>
Frequently Asked Questions
</h2>
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Which level keeps the best image quality?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
Light. It focuses on structural savings and gentle image
optimization. Use Balanced only if Light leaves you above 2MB.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why is my exported PDF so large in the first place?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
Design tools often embed full-resolution images and complete font
files. Compression subsets the fonts and re-encodes images at
sensible resolution, which is where the large savings come from.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I check the result before downloading?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
You see the compressed size immediately after processing, and you
can re-run with a different level as many times as you like. nothing
is uploaded, so iteration is instant.
</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/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 to 2MB - BentoPDF",
"applicationCategory": "PDF Compression Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"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 to 2MB",
"item": "https://www.bentopdf.com/compress-pdf-to-2mb"
}
]
}
</script>
</body>
</html>
+688
View File
@@ -0,0 +1,688 @@
<!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 to 500KB Free Online | BentoPDF</title>
<meta name="title" content="Compress PDF to 500KB Free Online | BentoPDF" />
<meta
name="description"
content="Bring a PDF under 500KB with almost no visible quality loss. Free, no uploads. Runs entirely in your browser."
/>
<meta
name="keywords"
content="compress pdf to 500kb, compress pdf, reduce pdf size, pdf compressor"
/>
<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-to-500kb"
/>
<!-- Open Graph / Facebook / LinkedIn -->
<meta property="og:type" content="website" />
<meta
property="og:url"
content="https://www.bentopdf.com/compress-pdf-to-500kb"
/>
<meta
property="og:title"
content="Compress PDF to 500KB Free Online | BentoPDF"
/>
<meta
property="og:description"
content="Bring a PDF under 500KB with almost no visible quality loss. Free, no uploads. Runs entirely in your browser."
/>
<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-to-500kb"
/>
<meta
name="twitter:title"
content="Compress PDF to 500KB Free - BentoPDF"
/>
<meta
name="twitter:description"
content="Bring a PDF under 500KB with almost no visible quality loss. Free, no uploads. Runs entirely in your browser."
/>
<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 to 500KB" />
<link href="/src/css/styles.css" rel="stylesheet" />
<!-- 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>
<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">
Compress PDF to 500KB
</h1>
<p class="text-gray-400 mb-6">
Bring your PDF under 500KB while keeping images sharp.
</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 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-300 hover:text-indigo-400 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>
<section class="max-w-4xl mx-auto px-4 pt-12">
<p id="direct-answer" class="text-gray-300 text-lg leading-relaxed">
To compress a PDF to 500KB, add your file below, keep the recommended
Balanced level, and download the result. 500KB is a comfortable target.
most documents reach it with no visible difference, and your file never
leaves your browser.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">The sweet spot target</h2>
<p class="text-gray-400 leading-relaxed">
Half a megabyte is the most forgiving of the common upload limits. used
by CMS uploads, tender portals, and course submission systems. Balanced
level typically gets a 5 to 20MB office document or light scan under
500KB while keeping images sharp and text perfectly crisp.
</p>
</section>
<section class="max-w-4xl mx-auto px-4 pt-8">
<h2 class="text-2xl font-bold text-white mb-3">
If you are just over the line
</h2>
<p class="text-gray-400 leading-relaxed">
A file that lands at 600 to 700KB after Balanced almost always drops
below 500KB with Aggressive. Check for an embedded photo cover page or a
high-resolution logo on every page. repeated images are a common hidden
cost that compression handles well.
</p>
</section>
<!-- 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"
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 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"
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="merge-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">Merge PDF</h3>
<p class="text-gray-400 text-sm">Free online merge PDF tool</p>
</a>
<a
href="split-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">Split PDF</h3>
<p class="text-gray-400 text-sm">Free online split PDF tool</p>
</a>
<a
href="pdf-to-jpg.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">PDF to JPG</h3>
<p class="text-gray-400 text-sm">Free online PDF to JPG 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"
data-i18n="faq.sectionTitle"
>
Frequently Asked Questions
</h2>
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Will 500KB compression change how my PDF prints?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
At Balanced level, print quality stays excellent for text and vector
graphics. Photos are optimized for screen-and-print use; only
large-format printing would show the difference.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I compress multiple PDFs to 500KB at once?<i
data-lucide="plus"
class="faq-d-icon"
></i>
</summary>
<p class="faq-d-a">
Yes. add several files and each is compressed independently in your
browser, with no queue and no per-file fee.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why is my compressed file already smaller than 500KB but the portal
still rejects it?<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Some portals measure size in mebibytes or reject certain PDF
versions. Re-check the exact limit wording, and try the Sanitize PDF
tool to strip unusual metadata if a compliant file is still
rejected.
</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/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 to 500KB - BentoPDF",
"applicationCategory": "PDF Compression Tool",
"operatingSystem": "Any - Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"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 to 500KB",
"item": "https://www.bentopdf.com/compress-pdf-to-500kb"
}
]
}
</script>
</body>
</html>
+136 -12
View File
@@ -14,7 +14,7 @@
/>
<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"
content="Reduce the file size of your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="keywords"
@@ -516,6 +516,56 @@
</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">
Compress to a Specific Size
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 gap-4">
<a
href="/compress-pdf-to-100kb"
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 to 100KB</h3>
<p class="text-gray-400 text-sm">
Get your PDF under 100KB for portals with strict upload limits.
</p></a
><a
href="/compress-pdf-to-200kb"
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 to 200KB</h3>
<p class="text-gray-400 text-sm">
Reduce your PDF below 200KB without losing readability.
</p></a
><a
href="/compress-pdf-to-500kb"
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 to 500KB</h3>
<p class="text-gray-400 text-sm">
Bring your PDF under 500KB while keeping images sharp.
</p></a
><a
href="/compress-pdf-to-1mb"
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 to 1MB</h3>
<p class="text-gray-400 text-sm">
Reduce large PDFs below the most common 1MB upload limit.
</p></a
><a
href="/compress-pdf-to-2mb"
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 to 2MB</h3>
<p class="text-gray-400 text-sm">
Meet 2MB portal limits while keeping high image quality.
</p></a
><a
href="/compress-pdf-for-email"
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 for Email</h3>
<p class="text-gray-400 text-sm">
Shrink PDFs to fit any email attachment limit.
</p></a
>
</div>
</section>
<!-- FAQ Section -->
<section class="max-w-4xl mx-auto px-4 py-12">
<h2
@@ -527,34 +577,108 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
What's the difference between Condense and Photon?
Why is my PDF still large after compressing it?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
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.
Most of a PDF's size comes from images, so a file with few images,
or images that are already small, won't shrink much, and the result
message tells you when the size couldn't be reduced. Try a stronger
level such as Aggressive, turn on Convert to Grayscale, or switch to
Photon if the file is a scan.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Which compression level should I use?
How much does each compression level reduce image quality?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
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.
With Condense, Light keeps images at 90% JPEG quality and 150 DPI,
Balanced uses 75% and 96 DPI, Aggressive uses 50% and 72 DPI, and
Extreme uses 30% and 60 DPI. Balanced is the default and reads fine
on screen; Light is the safer choice for anything that will be
printed.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are there file size limits?
Will I still be able to select and search text after compression?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No limits! Compress as many PDFs as you need, of any size,
completely free.
With Condense, yes: it recompresses images, subsets fonts, and
cleans up the file structure without touching the text layer, so
selection, search, and links keep working. Photon renders every page
to a JPEG, which permanently removes selectable text and hyperlinks.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does compressing remove metadata from my PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
It depends on the level. Light keeps the document info fields,
Balanced, Aggressive, and Extreme strip them, and the two strongest
levels also remove XMP metadata. You can override this either way
with the Remove metadata checkbox under Custom Settings.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I compress a scanned PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Scanned PDFs are full-page images, so they respond well to
compression. Start with Condense at Balanced or Aggressive, which
downsamples the scans in place, and use Photon only if you need a
smaller result and can accept losing any OCR text layer the scan may
have.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What do the Custom Settings do?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
They override the preset for the Condense algorithm: Output Quality
(1 to 100) sets JPEG quality, Resize Images To sets the target DPI,
and Only Process Above leaves images already below that DPI alone.
Checkboxes let you remove metadata, subset fonts, and drop embedded
thumbnails.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I compress a PDF to a specific size like 1 MB?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
There's no target size box on this page, so step through the levels
and check the size in the result message until the file fits. For
common limits there are dedicated pages with settings chosen for
that ceiling, such as
<a
href="/compress-pdf-to-1mb"
class="text-indigo-300 hover:text-indigo-400"
>Compress PDF to 1MB</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my PDF uploaded to a server for compression?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Condense runs a PyMuPDF engine compiled to WebAssembly and
Photon uses the browser's own page renderer, so everything happens
on your device. You can compress one file or a whole batch, which
comes back as compressed-pdfs.zip, and none of them leave your
computer.
</p>
</details>
</div>
+99 -20
View File
@@ -7,11 +7,11 @@
<!-- Primary Meta Tags -->
<meta
name="title"
content="Crop PDF Online Free - Crop PDF Tool | BentoPDF"
content="Crop PDF Online Free - Trim Margins and Resize Pages | BentoPDF"
/>
<meta
name="description"
content="★ Crop PDF online free - Crop PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Trim the margins of every page in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="crop pdf, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -28,11 +28,11 @@
<meta property="og:url" content="https://www.bentopdf.com/crop-pdf" />
<meta
property="og:title"
content="Crop PDF Online Free - Crop PDF Tool | BentoPDF"
content="Crop PDF Online Free - Trim Margins and Resize Pages | BentoPDF"
/>
<meta
property="og:description"
content="★ Crop PDF online free - Crop PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Trim the margins of every page in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -45,10 +45,13 @@
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/crop-pdf" />
<meta name="twitter:title" content="Crop PDF Free" />
<meta
name="twitter:title"
content="Crop PDF Online Free - Trim Margins and Resize Pages | BentoPDF"
/>
<meta
name="twitter:description"
content="★ Crop PDF online free - Crop PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Trim the margins of every page in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -61,11 +64,9 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Crop PDF" />
<title>Crop PDF - BentoPDF</title>
<meta
name="description"
content="Crop PDF pages visually with precision. Free, secure, and runs entirely in your browser."
/>
<title>
Crop PDF Online Free - Trim Margins and Resize Pages | BentoPDF
</title>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -381,32 +382,110 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is crop pdf really free?
Does cropping permanently delete the part of the page outside the
box?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Not in the default mode. The tool sets each page's crop box, so
viewers and printers show only the selected area while the full page
content stays in the file and can be restored by resetting the crop
box in a PDF editor. Turn on Flattening Crop if the trimmed area has
to be gone for good, for example before sharing an excerpt.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Will my text still be selectable after cropping?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
In the default mode, yes: nothing is re-rendered, so text, links,
and vector graphics stay exactly as they were. Flattening Crop
renders each cropped page as an image, which removes selectable text
and usually makes the file larger.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Can I crop different pages by different amounts?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Yes. Use the page navigation to move through the document and draw a
separate box on each page; the tool remembers every box you set, and
pages you never drew on keep their original size. To use one box
everywhere, check Apply to all pages and the box on the current page
is copied to every page.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What page size will the cropped PDF have?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Each cropped page takes on the size of its box, so trimming a 1-inch
margin from every side of a Letter page leaves a 6.5 x 9 inch page.
If you need a standard size like A4 or Letter afterward, run the
result through
<a
href="/fix-page-size"
class="text-indigo-300 hover:text-indigo-400"
>Fix Page Size</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a way to type exact crop measurements?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Cropping is done by dragging the corners or edges of the overlay
on the page preview; there's no numeric input for margins or
dimensions in this tool. Zooming the browser in helps when a margin
is only a few millimeters wide.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does cropping reduce image quality or file size?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The default mode changes neither: the content is untouched, so
quality is identical, and the file stays about the same size because
the hidden margin data is still inside. Flattening Crop replaces
cropped pages with images, which typically makes the file bigger
rather than smaller.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my document uploaded while I crop it?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The page previews are rendered in your browser and the crop is
applied locally, so the file never leaves your computer; the cropped
copy is saved under the original file name.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I crop a scanned PDF to remove black edges?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes. Draw the box inside the dark border on each page, or set it
once and use Apply to all pages if every scan has the same border.
Because the default crop only hides the edges, use Flattening Crop
if the border must be physically removed, and straighten tilted
scans first with
<a href="/deskew-pdf" class="text-indigo-300 hover:text-indigo-400"
>Deskew PDF</a
>.
</p>
</details>
</div>
+82 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ CSV to PDF online free - CSV to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert CSV spreadsheet files to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="csv to pdf, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ CSV to PDF online free - CSV to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert CSV spreadsheet files to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,7 +48,7 @@
<meta name="twitter:title" content="CSV to PDF Free" />
<meta
name="twitter:description"
content="★ CSV to PDF online free - CSV to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert CSV spreadsheet files to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -62,10 +62,6 @@
<meta name="apple-mobile-web-app-title" content="CSV to PDF" />
<title>CSV to PDF - Convert Spreadsheets to PDF - BentoPDF</title>
<meta
name="description"
content="Convert CSV (Comma-Separated Values) spreadsheet files to PDF format. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -331,32 +327,102 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is csv to pdf really free?
How is the CSV laid out in the PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
The first row becomes a bold header with a blue background and the
remaining rows become striped table rows in 9-point text on
landscape A4 pages. Long tables continue over as many pages as
needed, with the header repeated on each page.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
My file uses semicolons or tabs instead of commas. Will it work?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Yes. The parser detects the delimiter automatically, so comma,
semicolon, tab, and pipe separated files all convert. Quoted fields
containing commas or line breaks are handled according to standard
CSV rules.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
My CSV has many columns. Why is the table squashed?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
All columns are shrunk to fit the page width and cell text wraps
onto extra lines, so very wide files end up with narrow columns.
There's no setting for page size or orientation, so split wide
datasets into several files or drop columns you don't need.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I convert several CSV files at once?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes. A single file downloads as a PDF with the same base name, while
several files are packaged into csv-converted.zip with one PDF per
file.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does it handle accented or non-Latin characters?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The file is read as UTF-8 and the PDF uses the built-in Helvetica
font, which covers Latin characters including accents. Text in
scripts such as Chinese, Arabic, or Cyrillic may not display
correctly, and files saved in other encodings can show garbled
characters.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why does it say the CSV file is empty?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Rows that are completely blank are dropped before the table is
built, so a file containing only empty lines or whitespace triggers
that error. Open the file in a text editor and confirm it has at
least a header row with values.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I keep spreadsheet formatting such as column widths, colors, or
multiple sheets?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. CSV holds only raw values, so there's no formatting to preserve.
For .xlsx or .xls files with formatting and several sheets, use
<a
href="/excel-to-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Excel to PDF</a
>
instead.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my spreadsheet data sent anywhere?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The CSV is parsed and the PDF is generated in your browser with
JavaScript libraries (PapaParse and jsPDF), so financial or customer
data in the file stays on your machine.
</p>
</details>
</div>
+89 -20
View File
@@ -7,11 +7,11 @@
<!-- Primary Meta Tags -->
<meta
name="title"
content="Delete Pages Online Free - Delete Pages Tool | BentoPDF"
content="Delete Pages from a PDF Free Online | BentoPDF"
/>
<meta
name="description"
content="★ Delete Pages online free - Delete pages PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Remove specific pages from your document. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="delete pages, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -28,11 +28,11 @@
<meta property="og:url" content="https://www.bentopdf.com/delete-pages" />
<meta
property="og:title"
content="Delete Pages Online Free - Delete Pages Tool | BentoPDF"
content="Delete Pages from a PDF Free Online | BentoPDF"
/>
<meta
property="og:description"
content="★ Delete Pages online free - Delete pages PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Remove specific pages from your document. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -45,10 +45,13 @@
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/delete-pages" />
<meta name="twitter:title" content="Delete Pages Free" />
<meta
name="twitter:title"
content="Delete Pages from a PDF Free Online | BentoPDF"
/>
<meta
name="twitter:description"
content="★ Delete Pages online free - Delete pages PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Remove specific pages from your document. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -61,11 +64,7 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Delete Pages" />
<title>Delete PDF Pages - BentoPDF</title>
<meta
name="description"
content="Remove specific pages from your PDF file. Free and secure."
/>
<title>Delete Pages from a PDF Free Online | BentoPDF</title>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -329,32 +328,102 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is delete pages really free?
How do I delete specific pages from a PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Upload the file, then either type the pages in the box using ranges
like 2, 4-6, 9 or click the page thumbnails to mark them. Marked
pages are highlighted so you can double-check before clicking the
button, and the result downloads as a new PDF with those pages gone.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Can I delete every page in the file?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
No. At least one page has to remain, and the tool refuses with an
error if your selection covers the whole document.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Do the remaining pages lose quality or formatting?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
No. The kept pages are copied over unchanged, including their text,
images, fonts, and order, so nothing is re-rendered or recompressed.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are bookmarks and links kept after deleting pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Links and annotations that live on the kept pages come along, but
the document's bookmark tree isn't carried over because the pages
are copied into a fresh PDF. If you need bookmarks afterward,
rebuild them with
<a href="/bookmark" class="text-indigo-300 hover:text-indigo-400"
>Edit Bookmarks</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I delete pages from a password-protected PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
You'll be prompted for the password when you upload the file. The
downloaded PDF is saved without the password, so add protection
again with
<a href="/protect-pdf" class="text-indigo-300 hover:text-indigo-400"
>Protect PDF</a
>
if the document still needs it.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Will the PDF get smaller after removing pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Usually, if the removed pages carried their own images or fonts,
since only the resources the kept pages reference are written to the
new file. Pages that share resources with the rest of the document
free up less space.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my PDF uploaded to a server to delete the pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The thumbnails are rendered and the new file is assembled in
your browser, so the document stays on your device from upload to
download.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What if I want to keep only a few pages instead of deleting many?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Use
<a
href="/extract-pages"
class="text-indigo-300 hover:text-indigo-400"
>Extract Pages</a
>, which does the reverse: you list the pages to keep and everything
else is left out. The output is the same kind of clean copy.
</p>
</details>
</div>
+85 -15
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Deskew PDF online free - Automatically straighten tilted scanned pages ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Automatically straighten tilted scanned pages using OpenCV. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="keywords"
@@ -33,7 +33,7 @@
/>
<meta
property="og:description"
content="★ Deskew PDF online free - Automatically straighten tilted scanned pages ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Automatically straighten tilted scanned pages using OpenCV. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,7 +48,7 @@
<meta name="twitter:title" content="Deskew PDF Free" />
<meta
name="twitter:description"
content="★ Deskew PDF online free - Automatically straighten tilted scanned pages ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Automatically straighten tilted scanned pages using OpenCV. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -358,35 +358,105 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
What is PDF deskewing?
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">
Deskewing is the process of correcting tilted or rotated pages in
scanned documents. When you scan a document, it's common for pages
to be slightly skewed. This tool automatically detects and corrects
that skew.
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">
How accurate is the skew detection?
What does the Skew Threshold setting do?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Our tool uses OpenCV's advanced image processing algorithms to
detect skew angles with high precision. It works best on documents
with clear text content.
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">
Are my files private?
Does deskewing keep the text selectable?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! All processing happens entirely in your browser using
WebAssembly. Your files never leave your device.
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>
+101 -50
View File
@@ -13,7 +13,7 @@
/>
<meta
name="description"
content="★ Add digital signature to PDF online free ★ Use X.509 certificates ★ PKCS#7 signatures ★ No signup ★ Privacy-first ★ Works in browser"
content="Add a cryptographic digital signature to your PDF using X.509 certificates. Supports PKCS#12 (.pfx, .p12) and PEM formats.. Free. Runs entirely in your browser."
/>
<meta
name="keywords"
@@ -38,7 +38,7 @@
/>
<meta
property="og:description"
content="★ Add digital signature to PDF online free ★ Use X.509 certificates ★ PKCS#7 signatures ★ No signup ★ Privacy-first ★ Works in browser"
content="Add a cryptographic digital signature to your PDF using X.509 certificates. Supports PKCS#12 (.pfx, .p12) and PEM formats.. Free. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -56,7 +56,7 @@
<meta name="twitter:title" content="Digital Signature PDF Free" />
<meta
name="twitter:description"
content="★ Add digital signature to PDF online free ★ Use X.509 certificates ★ PKCS#7 signatures ★ Privacy-first"
content="Add a cryptographic digital signature to your PDF using X.509 certificates. Supports PKCS#12 (.pfx, .p12) and PEM formats.. Free. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -708,12 +708,12 @@
</h2>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
<a
href="encrypt-pdf.html"
href="protect-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"
data-i18n="tools:encryptPdf.name"
data-i18n="tools:protectPdf.name"
>
Encrypt PDF
</h3>
@@ -725,12 +725,12 @@
</p>
</a>
<a
href="decrypt-pdf.html"
href="unlock-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"
data-i18n="tools:decryptPdf.name"
data-i18n="tools:unlockPdf.name"
>
Decrypt PDF
</h3>
@@ -804,66 +804,117 @@
</h2>
<div class="faq-list">
<details class="faq-d">
<summary
class="faq-d-q"
data-i18n="tools:digitalSignPdf.faqWhatIsQuestion"
>
What is a digital signature?
<summary class="faq-d-q">
What is the difference between Digital Signature and Sign PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a" data-i18n="tools:digitalSignPdf.faqWhatIsAnswer">
A digital signature is a cryptographic mechanism that verifies the
authenticity and integrity of a document. Unlike a drawn signature,
it uses public key cryptography (X.509 certificates) to prove the
signer's identity.
<p class="faq-d-a">
<a href="/sign-pdf" class="text-indigo-300 hover:text-indigo-400"
>Sign PDF</a
>
places a drawn, typed, or uploaded picture of your signature on the
page; it's visual only. This tool applies a cryptographic PKCS#7
signature using your X.509 certificate, so a PDF reader can verify
who signed and detect any change made afterward. You can also show a
visible signature block at the same time.
</p>
</details>
<details class="faq-d">
<summary
class="faq-d-q"
data-i18n="tools:digitalSignPdf.faqFormatsQuestion"
>
What certificate formats are supported?
<summary class="faq-d-q">
Can I sign with a PEM certificate instead of a .pfx or .p12 file?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a" data-i18n="tools:digitalSignPdf.faqFormatsAnswer">
We support PKCS#12 format certificates (.pfx, .p12) which contain
both your certificate and private key in a single encrypted file.
These are commonly issued by certificate authorities.
<p class="faq-d-a">
Yes. Upload a single .pem file that contains both the certificate
and the private key. Encrypted private keys work too; enter the key
password in the Certificate Password field. If your certificate and
key are in separate PEM files, paste them into one file first.
</p>
</details>
<details class="faq-d">
<summary
class="faq-d-q"
data-i18n="tools:digitalSignPdf.faqPrivateKeyQuestion"
>
Is my private key safe?
<summary class="faq-d-q">
Do I need an internet connection to sign?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p
class="faq-d-a"
data-i18n="tools:digitalSignPdf.faqPrivateKeyAnswer"
>
Yes! All processing happens entirely in your browser. Your
certificate, private key, and PDF files never leave your device or
get uploaded to any server.
<p class="faq-d-a">
Often, yes. The signing library fetches the issuer certificate chain
from the URLs in your certificate's Authority Information Access
extension, and if those servers can't be reached, signing fails for
certificates that need chain validation. Your PDF and private key
are never part of those requests; only the certificate URLs are
fetched.
</p>
</details>
<details class="faq-d">
<summary
class="faq-d-q"
data-i18n="tools:digitalSignPdf.faqValidReadersQuestion"
>
Will the signature be valid in PDF readers?
<summary class="faq-d-q">
Why does Adobe Reader say the signature validity is unknown?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p
class="faq-d-a"
data-i18n="tools:digitalSignPdf.faqValidReadersAnswer"
>
Yes, the tool creates standard PKCS#7 detached signatures that are
recognized by all major PDF viewers. For full validation, use a
certificate from a trusted Certificate Authority.
<p class="faq-d-a">
The reader can't trace the certificate back to a root it trusts.
That's expected for self-signed certificates, which are fine for
testing but always show a warning. For documents other people need
to rely on, use a certificate issued by a Certificate Authority that
PDF readers trust.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Do I have to add a visible signature on the page?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The cryptographic signature is embedded whether or not the
visible block is enabled. Turn on Visible Signature if you want a
stamp on the page: pick the first, last, all, or a specific page,
set the position and size in points, and add a PNG, JPG, or WebP
image or a line of text; with neither, the tool writes the
certificate's common name and the current date.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What are the Reason, Location, and Contact Info fields for?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
They're optional metadata stored inside the signature itself. Reason
records why you signed, such as "Approved" or "Reviewed", Location
where it happened, and Contact Info how to reach you. PDF readers
display them in the signature panel.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can a digitally signed PDF still be edited?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The file can still be opened and edited, but any change made after
signing breaks the integrity check and readers will report the
document as modified. If the PDF has form fields or annotations that
should be fixed in place, run it through
<a href="/flatten-pdf" class="text-indigo-300 hover:text-indigo-400"
>Flatten PDF</a
>
before signing, not after.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How can I check that the signature was applied correctly?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Open the signed file in
<a
href="/validate-signature-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Validate Signature</a
>. It lists every signature, shows the signer and issuer, checks the
certificate dates, and confirms whether the bytes have changed since
signing. You can also load your CA certificate there to verify the
trust chain.
</p>
</details>
</div>
+79 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Divide Pages online free - Divide pages PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Divide pages horizontally or vertically. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="divide pages, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ Divide Pages online free - Divide pages PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Divide pages horizontally or vertically. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,7 +48,7 @@
<meta name="twitter:title" content="Divide Pages Free" />
<meta
name="twitter:description"
content="★ Divide Pages online free - Divide pages PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Divide pages horizontally or vertically. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -62,10 +62,6 @@
<meta name="apple-mobile-web-app-title" content="Divide Pages" />
<title>Divide PDF Pages - BentoPDF</title>
<meta
name="description"
content="Split each page of your PDF horizontally or vertically into two pages. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -371,32 +367,99 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is divide pages really free?
How do I split a two-page book scan into separate pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Upload the PDF, choose Vertical (Left &amp; Right) as the split
type, and process it. Each page is cut at the exact midpoint into a
left page followed by a right page, so a book scanned two pages per
sheet becomes one page per sheet in reading order.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
What is the difference between vertical and horizontal division?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Vertical cuts each page down the middle into left and right halves,
which suits landscape pages with side-by-side content. Horizontal
cuts across the middle into top and bottom halves, top half first,
which suits tall pages such as posters or stacked forms.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Can I divide only some pages and leave the rest alone?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Enter a page range such as 1-5, 8, 11-13 in the page range box. Only
those pages are divided; every other page is copied into the output
unchanged and in its original position. Leave the box blank to
divide all pages.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does dividing pages lower the quality or change the text?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The tool copies each page twice and sets a different crop box on
each copy rather than re-rendering anything, so text stays
selectable, vector graphics stay sharp, and images keep their
original resolution.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I choose where the cut happens instead of the middle?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No, the split is always at the midpoint of the page. If the content
is off-center or you need an uneven cut, use
<a href="/crop-pdf" class="text-indigo-300 hover:text-indigo-400"
>Crop PDF</a
>
to set the exact area you want for each half.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How many pages will the output have?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Each divided page becomes two pages, so a 10-page document with
every page divided produces 20 pages. Pages outside your range still
count once, and the halves keep the same order as the original.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
The halves come out sideways. What should I do?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Divide Pages doesn't rotate anything, so fix the orientation with
<a href="/rotate-pdf" class="text-indigo-300 hover:text-indigo-400"
>Rotate PDF</a
>
either before dividing or on the divided output, depending on how
the scan was made.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my PDF uploaded when I divide its pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The page copying and crop-box changes happen in your browser,
and the divided file is written on your device without any upload.
</p>
</details>
</div>
+64 -38
View File
@@ -478,70 +478,96 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
<span data-i18n="tools:duplexCollate.faqOddPagesQuestion"
>What if my scan has an odd number of pages?</span
>
What kind of scan is this tool for?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a" data-i18n="tools:duplexCollate.faqOddPagesAnswer">
A duplex scan should have an even page count. If it does not, a page
was probably scanned twice or missed. The tool warns you before
processing, and any unpaired pages are appended at the end so
nothing is lost.
<p class="faq-d-a">
A PDF produced by feeding a stack through a single-sided scanner
twice, once for the fronts and once for the backs, which gives one
file with all front pages first and all back pages after. The tool
interleaves the two blocks into front 1, back 1, front 2, back 2
order. If the fronts and backs are in two separate PDFs, use
<a
href="/alternate-merge"
class="text-indigo-300 hover:text-indigo-400"
>Alternate &amp; Mix Pages</a
>
instead.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
<span data-i18n="tools:duplexCollate.faqBackOrderQuestion"
>Why would I keep the back block as-is?</span
>
How do I know where to set the split point?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a" data-i18n="tools:duplexCollate.faqBackOrderAnswer">
It depends on how the stack was fed for the second pass. Flipping
the whole stack over produces back sides in reverse order, which is
the default. If your scanner returned them in the same order as the
fronts, choose to keep the block as-is.
<p class="faq-d-a">
The split is the last page of the front block, which for a normal
two-pass scan is exactly half the total. Click Auto-detect split
(half) to fill that in, then read the preview summary, which shows
the size of each block and the resulting page count before you
commit.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
<span data-i18n="faq.isFree.question"
>Is BentoPDF really free?</span
>
What does the grouped export option do?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a" data-i18n="faq.isFree.answer">
Yes, absolutely. All tools on BentoPDF are 100% free to use, with no
file limits, no sign-ups, and no watermarks. We believe everyone
deserves access to simple, powerful PDF tools without a paywall.
<p class="faq-d-a">
If the stack held several short documents, such as two-page forms,
enter the pages per document and the collated output is cut into
chunks of that length. Multiple chunks download as a ZIP with one
PDF per document; a single chunk downloads as a plain PDF.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
<span data-i18n="faq.areFilesSecure.question"
>Are my files secure? Where are they processed?</span
>
What filename does the collated PDF get?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a" data-i18n="faq.areFilesSecure.answer">
Your files are as secure as possible because they never leave your
computer. All processing happens directly in your web browser
(client-side). We never upload your files to a server, so you
maintain complete privacy and control over your documents.
<p class="faq-d-a">
A single collated file downloads under your original name with
_collated added, for example scan_collated.pdf. Grouped output is a
ZIP named scan_collated_grouped.zip containing the separate PDFs.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
<span data-i18n="faq.platforms.question"
>Does it work on Mac, Windows, and Mobile?</span
>
Can I preview the result before downloading?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a" data-i18n="faq.platforms.answer">
Yes! Since BentoPDF runs entirely in your browser, it works on any
operating system with a modern web browser, including Windows,
macOS, Linux, iOS, and Android.
<p class="faq-d-a">
The page shows a summary line as you change the split point and back
order, including the front and back block sizes and the output page
count, and it warns when the blocks are uneven. There is no
thumbnail preview, so check the first few pages of the download and
switch the back block order if the backs come out reversed.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does it keep bookmarks from the scanned PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The output is rebuilt page by page, so page content and rotation are
preserved but document-level bookmarks aren't carried across.
Scanner output rarely has any, but if yours does you can add them
again with
<a href="/bookmark" class="text-indigo-300 hover:text-indigo-400"
>Edit Bookmarks</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my scanned document uploaded to be reordered?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The PDF is opened in your browser, the pages are copied into a
new document on your device, and the result is downloaded directly,
so scans of forms and records never leave your computer.
</p>
</details>
</div>
+88 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Edit Attachments online free - Edit attachments PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="View or remove attachments in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="edit attachments, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -35,7 +35,7 @@
/>
<meta
property="og:description"
content="★ Edit Attachments online free - Edit attachments PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="View or remove attachments in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -54,7 +54,7 @@
<meta name="twitter:title" content="Edit Attachments Free" />
<meta
name="twitter:description"
content="★ Edit Attachments online free - Edit attachments PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="View or remove attachments in your PDF. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -68,10 +68,6 @@
<meta name="apple-mobile-web-app-title" content="Edit Attachments" />
<title>Edit Attachments - BentoPDF</title>
<meta
name="description"
content="View and remove attachments from your PDF documents. Manage embedded files easily. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -325,32 +321,108 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is edit attachments really free?
How do I see what files are attached to a PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Upload the PDF and the tool scans it and lists every embedded file
by name, marking each one as a document-level attachment or as a
page attachment with its page number. If nothing is embedded, it
tells you so instead of showing an empty list.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Can I remove just one attachment instead of all of them?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Click the trash icon next to any attachment to mark it, and click
again to unmark it before saving. Remove All Attachments selects
everything at once, and the new PDF is written with only the marked
files taken out.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Does removing attachments change the rest of the PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
The pages, text, and images are untouched. The attachments you keep
are re-embedded under their original names and, for page
attachments, on their original pages, but any description text
stored with them isn't carried over.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Will deleting attachments make my PDF smaller?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Usually, and often by a lot, because embedded files are stored in
full inside the PDF. A document carrying a large spreadsheet or
image attachment can drop to a fraction of its size once that file
is removed.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What is the difference between a document-level and a page-level
attachment?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Document-level attachments live in the PDF's embedded files list and
show up in a viewer's attachments panel. Page-level attachments are
file attachment annotations pinned to a spot on one page, usually
shown as a paperclip or pushpin icon. The tool lists and removes
both kinds.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I download the attachments before deleting them?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
This tool only lists and removes them. To save the embedded files to
your computer first, run the PDF through
<a
href="/extract-attachments"
class="text-indigo-300 hover:text-indigo-400"
>Extract Attachments</a
>, then come back here to strip them.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I add or replace an attachment here?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No, this tool only removes attachments. Use
<a
href="/add-attachments"
class="text-indigo-300 hover:text-indigo-400"
>Add Attachments</a
>
to embed new files, and combine the two steps when you want to swap
an outdated attachment for a newer version.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are the attachments uploaded anywhere when I edit them?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The PDF is parsed by a cpdf engine running as WebAssembly in
your browser, the attachment list is built locally, and the cleaned
file is saved straight from your browser. Neither the document nor
its attachments is sent to a server, which matters when the
attachments are the sensitive part.
</p>
</details>
</div>
+90 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Edit Metadata online free - Edit metadata PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Change the author, title, and other properties. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="edit metadata, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ Edit Metadata online free - Edit metadata PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Change the author, title, and other properties. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,7 +48,7 @@
<meta name="twitter:title" content="Edit Metadata Free" />
<meta
name="twitter:description"
content="★ Edit Metadata online free - Edit metadata PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Change the author, title, and other properties. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -62,10 +62,6 @@
<meta name="apple-mobile-web-app-title" content="Edit Metadata" />
<title>Edit PDF Metadata - BentoPDF</title>
<meta
name="description"
content="Edit PDF metadata including title, author, subject, keywords, and custom fields. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -436,32 +432,110 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is edit metadata really free?
Which metadata fields can I change?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Title, Author, Subject, Keywords, Creator, Producer, Creation Date,
and Modification Date, plus any custom key-value pairs you add. The
form loads with the file's current values, so you only edit what
needs changing.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
How do I delete a field like Author completely?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Clear the box and save. Whatever is in the form is written back, so
an emptied field is stored as empty. To strip every field at once,
including hidden ones, use
<a
href="/remove-metadata"
class="text-indigo-300 hover:text-indigo-400"
>Remove Metadata</a
>
instead.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Why does the modification date change even though I didn't touch it?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
If the Modification Date box is left empty, the tool stamps the
current date and time when it saves. Set a specific date in the
picker if a particular value needs to be kept.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I add my own fields such as Department or Project ID?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes. Click the add button, enter a key and a value, and the pair is
written into the PDF's info dictionary alongside the standard
fields. Not every reader lists custom entries, but they stay in the
file and show up in tools that read the full info dictionary, such
as
<a
href="/view-metadata"
class="text-indigo-300 hover:text-indigo-400"
>View Metadata</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
I changed the title but Acrobat still shows the old one. Why?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The tool writes to the document info dictionary. Some PDFs also
carry an XMP metadata stream, and readers like Acrobat prefer XMP
when both exist, so the old title can still appear there. Run
<a
href="/remove-metadata"
class="text-indigo-300 hover:text-indigo-400"
>Remove Metadata</a
>
first, then edit, to avoid the conflict.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How should I enter keywords?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Separate them with commas, for example invoice, 2026, Q3. They're
saved as a keyword list that document management systems and desktop
search can index.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does editing metadata alter the pages or send my file anywhere?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Only the info dictionary is rewritten; pages, fonts, links, and
bookmarks are untouched, and the whole edit happens in your browser,
so the document never leaves your device.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I edit metadata on a password-protected PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
If the file needs a password to open, the tool asks for it and then
loads the document normally. Without the password the file can't be
opened here.
</p>
</details>
</div>
+95 -16
View File
@@ -10,11 +10,11 @@
<meta
name="title"
content="Edit PDF Text Online Free - PDF Text Editor | BentoPDF"
content="Edit Text in a PDF Free - Rewrite with Live Reflow | BentoPDF"
/>
<meta
name="description"
content="★ Edit PDF text online free - Click any paragraph and edit it in place with live reflow ★ No signup ★ Privacy-first ★ Works in browser"
content="Click any paragraph and edit it in place with live reflow, fonts, and styling. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="keywords"
@@ -32,17 +32,20 @@
<meta property="og:url" content="https://www.bentopdf.com/edit-pdf-text" />
<meta
property="og:title"
content="Edit PDF Text Online Free - PDF Text Editor | BentoPDF"
content="Edit Text in a PDF Free - Rewrite with Live Reflow | BentoPDF"
/>
<meta
property="og:description"
content="★ Edit PDF text online free - Click any paragraph and edit it in place with live reflow ★ No signup ★ Privacy-first ★ Works in browser"
content="Click any paragraph and edit it in place with live reflow, fonts, and styling. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta property="og:site_name" content="BentoPDF" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/edit-pdf-text" />
<meta name="twitter:title" content="Edit PDF Text Free" />
<meta
name="twitter:title"
content="Edit Text in a PDF Free - Rewrite with Live Reflow | BentoPDF"
/>
<meta
name="twitter:description"
content="Edit PDF text in place with live reflow. Free, private, in your browser."
@@ -53,7 +56,7 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Edit PDF Text" />
<title>Edit PDF Text - BentoPDF</title>
<title>Edit Text in a PDF Free - Rewrite with Live Reflow | BentoPDF</title>
<link href="/src/css/styles.css" rel="stylesheet" />
<link href="/src/css/edit-pdf-text.css" rel="stylesheet" />
@@ -352,33 +355,109 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Does my PDF leave my device?
Can I edit the text in a scanned PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The whole editor, including the PDF engine, runs in your
browser. Files are never uploaded anywhere.
Not with this tool. A scanned page is a picture, and even after
OCR the text is an invisible layer over that picture, so there are
no glyphs to edit. The editor detects this and shows a notice that
the page's text blocks are an OCR layer, searchable and selectable
but not editable.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why are some paragraphs locked?
Does the text reflow when I add or delete words?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Paragraphs using fragile subset fonts or complex layouts are
protected so your document can't be silently corrupted. Everything
else stays fully editable.
Within the paragraph you are editing, lines rewrap live as you
type and the block grows or shrinks to fit. Other paragraphs and
pages stay where they are, so check that a much longer paragraph
doesn't run into the content below it.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Will the fonts match the original?
Can I use a font from my computer?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes. The editor reuses the document's embedded fonts where
possible, and you can also pull in fonts installed on your device.
Open the Font menu and choose System fonts to list the fonts
installed on your machine. This relies on the Local Font Access
API, which is currently available in Chrome and Edge; in other
browsers you can still use the fonts already embedded in the
document.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a find and replace across the whole document?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The Find &amp; Replace bar offers Next, Replace, and Replace All,
with Match case, Whole word, and Ignore accents options. Replace
All works through every page of the document, not just the one on
screen.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I edit images and shapes, not just text?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Use the Edit menu to choose Text, Images, Shapes, or Edit All,
which controls what is selectable on busy pages. Images can be
moved, rotated in 90 degree steps, flipped, or replaced while
keeping their placement, you can add new images and text boxes,
and shapes expose their path stroke settings.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What happens if the PDF is digitally signed or is PDF/A?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Editing a signed document invalidates its signature, so the editor
warns you and saves your changes as an appended revision, which
keeps the original signed version verifiable. For PDF/A files it
warns that edits may break conformance.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Will the editor open a password-protected PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
It asks for the password first and then opens the document for
editing. The saved copy is written from the decrypted document, so
if you still need protection, add it again with
<a
href="/protect-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Protect PDF</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How is this different from the PDF Editor tool?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
This tool changes the text, images, and shapes that are already
part of the page, with fonts, spacing, alignment, lists, and
right-to-left support. The
<a href="/edit-pdf" class="text-indigo-300 hover:text-indigo-400"
>PDF Editor</a
>
is for annotating: highlights, comments, drawings, and other
markup layered on top of the page.
</p>
</details>
</div>
+93 -20
View File
@@ -7,11 +7,11 @@
<!-- Primary Meta Tags -->
<meta
name="title"
content="Edit PDF Online Free - Edit PDF Tool | BentoPDF"
content="Edit PDF Online Free - Annotate, Highlight and Redact | BentoPDF"
/>
<meta
name="description"
content="★ Edit PDF online free - Edit PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Edit Pdf online. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="keywords"
@@ -31,11 +31,11 @@
<meta property="og:url" content="https://www.bentopdf.com/edit-pdf" />
<meta
property="og:title"
content="Edit PDF Online Free - Edit PDF Tool | BentoPDF"
content="Edit PDF Online Free - Annotate, Highlight and Redact | BentoPDF"
/>
<meta
property="og:description"
content="★ Edit PDF online free - Edit PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Edit Pdf online. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,10 +48,13 @@
<!-- 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:title"
content="Edit PDF Online Free - Annotate, Highlight and Redact | BentoPDF"
/>
<meta
name="twitter:description"
content="★ Edit PDF online free - Edit PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Edit Pdf online. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -64,11 +67,9 @@
<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."
/>
<title>
Edit PDF Online Free - Annotate, Highlight and Redact | BentoPDF
</title>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -316,32 +317,104 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is edit pdf really free?
Can I change the existing text in my PDF with this editor?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
This editor works on top of the page: highlights, comments, shapes,
images, freehand drawing, redaction, and new text boxes. To rewrite
text that's already in the document, use
<a
href="/edit-pdf-text"
class="text-indigo-300 hover:text-indigo-400"
>Edit PDF Text</a
>, which lets you click a paragraph and edit it in place.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Will my annotations show up in Acrobat, Preview, or Chrome?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Yes. Highlights, comments, shapes, and drawings are saved as
standard PDF annotations, so other viewers display them and can
usually edit or delete them. Text boxes are written into the page as
regular text on download, so they look identical everywhere but
can't be moved afterward.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Is the redaction permanent?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Yes. Applying a redaction removes the content underneath the marked
area from the file rather than covering it with a box, so the text
can't be recovered by copying or searching. Open the downloaded file
and check before you share it.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I open more than one PDF at a time?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Up to 10 documents can be open at once, each in its own tab above
the viewer. Adding more files opens more tabs, and removing a file
from the list closes its tab.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does the editor save my changes automatically?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Everything stays in your browser's memory until you click
Download Edited PDF, and closing or refreshing the tab discards the
changes. Download before you leave the page.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why can't I highlight text on my scanned PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Highlight, underline, and strikethrough attach to real text, and a
scanned page is only an image. Run the file through
<a href="/ocr-pdf" class="text-indigo-300 hover:text-indigo-400"
>OCR PDF</a
>
first to add a text layer, or mark it up visually with the pen or
rectangle tools.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I add text in Chinese, Japanese, Arabic, or other non-Latin
scripts?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes. When a text box contains characters outside the basic Latin
set, the editor fetches a matching Noto font and embeds it in the
PDF so the text renders correctly in other viewers.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does the editor upload my PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The editor runs a PDF engine (PDFium compiled to WebAssembly)
inside your browser. The only network requests are for the editor's
code and optional font files; the document itself never leaves your
device.
</p>
</details>
</div>
+70 -22
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Convert Email to PDF online free - EML to PDF, MSG to PDF ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert email files (EML, MSG) to PDF format. Supports Outlook exports and standard email formats. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="keywords"
@@ -35,7 +35,7 @@
/>
<meta
property="og:description"
content="★ Convert Email to PDF online free - EML to PDF, MSG to PDF ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert email files (EML, MSG) to PDF format. Supports Outlook exports and standard email formats. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -51,7 +51,7 @@
<meta name="twitter:title" content="Email to PDF Free" />
<meta
name="twitter:description"
content="★ Convert Email to PDF online free - EML to PDF, MSG to PDF ★ No signup ★ Privacy-first ★ Works in browser"
content="Convert email files (EML, MSG) to PDF format. Supports Outlook exports and standard email formats. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -65,10 +65,6 @@
<meta name="apple-mobile-web-app-title" content="Email to PDF" />
<title>Email to PDF - Convert EML/MSG to PDF - BentoPDF</title>
<meta
name="description"
content="Convert email files (EML, MSG) to PDF format. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -390,45 +386,97 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
What email formats are supported?
How do I get an .eml or .msg file out of my email client?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
BentoPDF supports both .eml (standard email format) and .msg
(Microsoft Outlook) files. These are the most common formats for
exported or saved emails.
In Gmail, open the message, use the three-dot menu, and choose
Download message to save an .eml file. Outlook for Windows saves a
.msg when you drag a message to a folder or use Save As; Apple Mail
and Thunderbird save .eml through their Save As commands. Drop the
saved file into the tool.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is email to PDF conversion really free?
Do inline images and formatting survive the conversion?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
HTML emails keep their layout, fonts, and colors, and images
embedded in the message itself (the cid: kind used for signatures
and pasted screenshots) are included. Images that the email loads
from a web server aren't downloaded, so those spots come out empty.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my emails kept private?
Can I hide the CC and BCC lines?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your email files
never leave your device, ensuring complete privacy for sensitive
communications.
Turn off Include CC and BCC before converting and the header block
shows only From, To, Date, and Subject. The same panel has a toggle
for the attachments list at the bottom of the PDF.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What about email attachments?
Which page sizes are available?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The PDF displays a list of attachments at the bottom and also embeds
the actual files into the PDF. You can access them via the
Attachments panel in PDF readers like Adobe Reader or Foxit.
A4, US Letter, and Legal, with a 50-point margin on every side. Long
emails flow onto as many pages as needed. The page size applies to
the whole batch, so pick it before you click Convert.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I convert a whole thread or mailbox (.mbox, .pst) at once?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The tool reads individual message files only, one email per PDF. It
doesn't open .mbox or .pst mailboxes, so export the messages you
need as separate .eml or .msg files first; you can then drop them
all in together and get a ZIP of PDFs.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are links in the email clickable in the PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Web and mailto links are re-created as clickable links wherever the
link text can be matched on the page. Very short link text (three
characters or fewer) isn't matched, so those particular links appear
as plain text.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What is the converted email's PDF named?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
A single email becomes a PDF with the same base name as the .eml or
.msg file. Several emails are packaged into emails-converted.zip
with one PDF per message.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does converting an email trigger tracking pixels or contact the
sender's server?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The message is parsed and rendered entirely in your browser, and
no remote images, scripts, or stylesheets referenced by the email
are fetched. Open-tracking pixels never fire, and the email's
contents never leave your device.
</p>
</details>
</div>
+70 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ EPUB to PDF online free - EPUB to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert EPUB e-books to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="epub to pdf, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ EPUB to PDF online free - EPUB to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert EPUB e-books to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,7 +48,7 @@
<meta name="twitter:title" content="EPUB to PDF Free" />
<meta
name="twitter:description"
content="★ EPUB to PDF online free - EPUB to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert EPUB e-books to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -62,10 +62,6 @@
<meta name="apple-mobile-web-app-title" content="EPUB to PDF" />
<title>EPUB to PDF - Convert EPUB to PDF - BentoPDF</title>
<meta
name="description"
content="Convert EPUB e-books to PDF format. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -334,32 +330,90 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is epub to pdf really free?
Will the PDF keep the formatting, images, and fonts from my EPUB?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Text, images, tables, and embedded fonts carry over. Because the
reflowable book is laid out into fixed pages, the page breaks won't
match what you see in an ebook reader. For heavily styled EPUBs,
check the first few pages of the output to confirm the layout.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Can I convert a DRM-protected EPUB from Kindle, Apple Books, or
Kobo?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
No. The tool reads the EPUB file directly and doesn't remove DRM, so
protected books fail to convert. It works with DRM-free EPUB files.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Does it support both EPUB 2 and EPUB 3?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Yes, both versions convert. EPUB 3 extras such as embedded audio and
video have no PDF equivalent and are dropped, while the text,
images, and tables are kept.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I convert several EPUB files at once?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes. Add multiple files and click Convert to PDF; the results
download as epub-converted.zip with one PDF per book. A single file
downloads directly as a PDF with the same base name.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I choose the page size, margins, or font size?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Not in this tool. There are no settings; the PyMuPDF engine renders
the book with its default layout into standard page dimensions.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is the text in the converted PDF selectable and searchable?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes. The EPUB text is written into the PDF as real text rather than
page images, so you can search, select, copy, highlight, and
annotate it in any PDF reader.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my ebook uploaded to a server for conversion?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The PyMuPDF engine loads into your browser as WebAssembly and
renders the book there, so the EPUB never leaves your device. Large
books with many images just take a little longer on slower machines.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why does the first conversion take longer than later ones?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
On the first run the browser downloads the PyMuPDF engine before it
can start. After that the engine stays loaded, so converting more
books in the same session starts right away.
</p>
</details>
</div>
+86 -20
View File
@@ -7,11 +7,11 @@
<!-- Primary Meta Tags -->
<meta
name="title"
content="Excel to PDF Converter Free Online - Convert Files | BentoPDF"
content="Excel to PDF Converter Free - XLSX to PDF Online | BentoPDF"
/>
<meta
name="description"
content="★ Excel to PDF online free - Convert Excel to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert Excel spreadsheets (XLSX, XLS, ODS, CSV) to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="keywords"
@@ -31,11 +31,11 @@
<meta property="og:url" content="https://www.bentopdf.com/excel-to-pdf" />
<meta
property="og:title"
content="Excel to PDF Converter Free Online - Convert Files | BentoPDF"
content="Excel to PDF Converter Free - XLSX to PDF Online | BentoPDF"
/>
<meta
property="og:description"
content="★ Excel to PDF online free - Convert Excel to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Convert Excel spreadsheets (XLSX, XLS, ODS, CSV) to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -48,10 +48,13 @@
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/excel-to-pdf" />
<meta name="twitter:title" content="Excel to PDF Free" />
<meta
name="twitter:title"
content="Excel to PDF Converter Free - XLSX to PDF Online | BentoPDF"
/>
<meta
name="twitter:description"
content="★ Excel to PDF online free - Convert Excel to PDF easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Convert Excel spreadsheets (XLSX, XLS, ODS, CSV) to PDF format. Supports multiple files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -64,11 +67,7 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Excel to PDF" />
<title>Excel to PDF - Convert XLSX, XLS to PDF - BentoPDF</title>
<meta
name="description"
content="Convert Excel spreadsheets (XLSX, XLS, ODS, CSV) to PDF format. Free, secure, and runs entirely in your browser."
/>
<title>Excel to PDF Converter Free - XLSX to PDF Online | BentoPDF</title>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -338,32 +337,99 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is excel to pdf really free?
Which spreadsheet formats can I convert to PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
The tool accepts .xlsx and .xls Excel workbooks, OpenDocument .ods
files from LibreOffice Calc, and .csv files. You can mix formats in
the same batch and convert them all at once.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Does it convert all sheets in the workbook or just the first one?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
All sheets are included in the PDF. The LibreOffice engine follows
each sheet's own page setup, print area, and scaling, so Print
Preview in Excel is a good guide to what you'll get.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Will formulas and charts survive the conversion?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Charts are rendered into the PDF, and formulas appear as their
computed values rather than the formula text. Cell formatting such
as fills, borders, fonts, and number formats is preserved.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
How do I stop a wide spreadsheet from being cut across several
pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
There are no layout options in the tool itself, so set the
orientation, print area, and fit-to-width scaling in Excel or
LibreOffice Calc before uploading. The converter reads those
settings from the file and lays out the PDF accordingly.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why does the first conversion take a while to start?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The browser-based LibreOffice engine is downloaded the first time
you convert, which can take a moment on a slow connection. After
that it stays cached for the session, so further conversions start
right away.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What do I get when I convert several spreadsheets at once?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
One file downloads directly as a PDF with the same name as the
spreadsheet. Two or more files are bundled into excel-converted.zip
with one PDF per spreadsheet.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Should I use Excel to PDF or CSV to PDF for a .csv file?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Excel to PDF runs a CSV through the full LibreOffice layout engine,
which is heavier but handles long rows and print settings the way a
spreadsheet would.
<a href="/csv-to-pdf" class="text-indigo-300 hover:text-indigo-400"
>CSV to PDF</a
>
is a lighter, faster option for plain tabular data without
formatting.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my spreadsheet uploaded to a server for conversion?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The LibreOffice engine runs inside your browser through
WebAssembly, so the workbook is opened, rendered, and saved as a PDF
on your own device. Financial data and personal records never leave
your computer.
</p>
</details>
</div>
+85 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Extract Attachments online free - Extract PDF attachments easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Extract all embedded files from PDF(s) as a ZIP. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="extract attachments, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -35,7 +35,7 @@
/>
<meta
property="og:description"
content="★ Extract Attachments online free - Extract PDF attachments easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Extract all embedded files from PDF(s) as a ZIP. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -54,7 +54,7 @@
<meta name="twitter:title" content="Extract Attachments Free" />
<meta
name="twitter:description"
content="★ Extract Attachments online free - Extract PDF attachments easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Extract all embedded files from PDF(s) as a ZIP. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -68,10 +68,6 @@
<meta name="apple-mobile-web-app-title" content="Extract Attachments" />
<title>Extract Attachments from PDF - BentoPDF</title>
<meta
name="description"
content="Extract all embedded attachments from your PDF documents. Download attachments as a ZIP file. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -334,32 +330,105 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is extract attachments really free?
What counts as an attachment in a PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Files embedded inside the PDF, either at the document level (the
paperclip panel in Acrobat) or attached to a specific page as a file
attachment annotation. Images drawn on the page, fonts, and form
data are not attachments; for pictures use
<a
href="/extract-images"
class="text-indigo-300 hover:text-indigo-400"
>Extract Images</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Why does it say the PDF has no attachments?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
It means cpdf found no embedded files at either the document or page
level. Pictures on the page, hyperlinks to external files, and form
field data can look like attachments in a viewer but aren't stored
as embedded files, so there is nothing to extract.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
How are the extracted files named?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Each file keeps the name it was embedded with. Attachments tied to a
specific page get the PDF's name and page number added as a prefix,
and if two attachments share a name the second gets a _1 suffix so
nothing is overwritten inside the ZIP.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I extract attachments from several PDFs at once?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Upload as many PDFs as you like and click Extract Attachments once.
Everything found across all of them is placed in one
extracted-attachments.zip, and the status message reports the total
count and combined size.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
What file types can be extracted?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Anything that was embedded: spreadsheets, XML data files, images,
ZIP archives, other PDFs, and so on. The tool copies the bytes out
exactly as they were stored and doesn't convert or open them.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I extract attachments from a password-protected PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Encrypted PDFs prompt for their password when loaded, and extraction
then runs on the decrypted copy held in memory. Without the correct
password the embedded files can't be read.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I view or delete individual attachments instead of extracting
all of them?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
This tool extracts everything in one pass. To inspect, remove, or
replace individual attachments inside the PDF use
<a
href="/edit-attachments"
class="text-indigo-300 hover:text-indigo-400"
>Edit Attachments</a
>, and to embed new ones use Add Attachments.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are the embedded files uploaded during extraction?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The PDFs are parsed by a WebAssembly build of cpdf in a
background worker in your browser, the ZIP is assembled locally, and
the download comes straight from your device. Attachments often
contain source data, so this keeps them off any server.
</p>
</details>
</div>
+78 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Extract Images online free - Extract images PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Extract all embedded images from your PDF files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="extract images, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ Extract Images online free - Extract images PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Extract all embedded images from your PDF files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -51,7 +51,7 @@
<meta name="twitter:title" content="Extract Images Free" />
<meta
name="twitter:description"
content="★ Extract Images online free - Extract images PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Extract all embedded images from your PDF files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -65,10 +65,6 @@
<meta name="apple-mobile-web-app-title" content="Extract Images" />
<title>Extract Images from PDF - BentoPDF</title>
<meta
name="description"
content="Extract all images from PDF files. Download individual images or all as a ZIP. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -343,32 +339,98 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is extract images really free?
What format are the extracted images saved in?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Each image comes out in the format it's stored in inside the PDF,
most often JPEG or PNG, with no re-encoding. Files are numbered in
the order they're found, for example image_1.jpg and image_2.png,
and Download All packs them into extracted-images.zip.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Why does the tool say no images were found?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
It only pulls out embedded raster images. If the graphics are vector
drawings, charts, or text drawn as paths, there's nothing to
extract, and you'd need to render the page as a picture with
<a href="/pdf-to-png" class="text-indigo-300 hover:text-indigo-400"
>PDF to PNG</a
>
instead.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Will I get the original full-resolution images?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
You get the image data exactly as it's embedded, at its stored
resolution rather than the size it appears on the page. If whoever
made the PDF downsampled the images before embedding them, that
lower resolution is all that exists in the file.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I extract images from a scanned PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
A scanned PDF stores each page as one large image, so you'll get one
full-page picture per page rather than the individual photos or
figures on it. Crop what you need from those page images afterward.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Why do I get duplicate images?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Images are collected page by page, so a logo or header graphic
that's reused on many pages is extracted once for every page it
appears on. Keep the first copy and discard the rest.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I extract images from several PDFs at once?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Upload as many PDFs as you want and click Extract once. Images from
all the files are numbered continuously and shown in a single grid,
and Download All puts everything into one ZIP.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I choose which images or pages to extract?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
There are no page or selection options; every embedded image on
every page is extracted. You can still save only the ones you want
from the preview grid, since each thumbnail has its own download
button.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my PDF's images uploaded during extraction?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The PDF is opened by a PyMuPDF engine running as WebAssembly
inside your browser, and the images are pulled out of the file in
memory on your device. The preview grid, the individual downloads,
and the ZIP are all generated locally.
</p>
</details>
</div>
+98 -20
View File
@@ -7,11 +7,11 @@
<!-- Primary Meta Tags -->
<meta
name="title"
content="Extract Pages Online Free - Extract Pages Tool | BentoPDF"
content="Extract Pages from a PDF Free Online | BentoPDF"
/>
<meta
name="description"
content="★ Extract Pages online free - Extract pages PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Save a selection of pages as new files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="extract pages, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -28,11 +28,11 @@
<meta property="og:url" content="https://www.bentopdf.com/extract-pages" />
<meta
property="og:title"
content="Extract Pages Online Free - Extract Pages Tool | BentoPDF"
content="Extract Pages from a PDF Free Online | BentoPDF"
/>
<meta
property="og:description"
content="★ Extract Pages online free - Extract pages PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Save a selection of pages as new files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -45,10 +45,13 @@
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://www.bentopdf.com/extract-pages" />
<meta name="twitter:title" content="Extract Pages Free" />
<meta
name="twitter:title"
content="Extract Pages from a PDF Free Online | BentoPDF"
/>
<meta
name="twitter:description"
content="★ Extract Pages online free - Extract pages PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Save a selection of pages as new files. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -61,11 +64,7 @@
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="Extract Pages" />
<title>Extract PDF Pages - BentoPDF</title>
<meta
name="description"
content="Extract specific pages from a PDF into separate files. Free, secure, and runs entirely in your browser."
/>
<title>Extract Pages from a PDF Free Online | BentoPDF</title>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -332,32 +331,111 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is extract pages really free?
Can I choose which pages to extract?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
Yes. Type page numbers and ranges separated by commas, such as 2,
4-6, 9, and only those pages are pulled out. Numbering starts at 1,
and the total page count is shown next to the file so you can check
the range before extracting.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
Do the extracted pages come as one PDF or separate files?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Separate files. Each selected page becomes its own single-page PDF
named like report_page_4.pdf, and they download together in a ZIP
called report_extracted_pages.zip. To end up with one PDF that
contains only certain pages, use
<a
href="/delete-pages"
class="text-indigo-300 hover:text-indigo-400"
>Delete Pages</a
>
to remove the rest instead.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Does extracting keep the original quality?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Yes. Pages are copied, not re-rendered, so text, images, fonts, and
vector graphics are unchanged from the source, and text stays
selectable and searchable.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are bookmarks, links, and annotations preserved?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Comments, highlights, and other annotations on the page travel with
it. Bookmarks are not carried over, since each output is a new file
built from the copied page, and links that jump to other pages of
the original have nothing to point at.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I extract the same page more than once or in a different order?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Each page appears once in the ZIP no matter how often it's listed,
and the files are named by their original page numbers rather than
the order you typed. Use
<a
href="/organize-pdf"
class="text-indigo-300 hover:text-indigo-400"
>Organize PDF</a
>
if you need duplicates or a custom order inside a single document.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I extract pages from a password-protected PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The tool prompts for the password when the file is loaded, then
extracts normally. The extracted files are new PDFs without the
password.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is my PDF uploaded when I extract pages from it?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The document is opened and the pages are copied in your browser,
and the ZIP is built locally, so nothing is transmitted. A 500-page
file only takes as long as your own machine needs to copy the
selected pages.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I extract hundreds of pages at once?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
There's no hard limit, but every extracted page becomes a separate
PDF inside the ZIP, so a large selection means many small files and
more memory use in the browser tab. For cutting a whole document
into chunks,
<a href="/split-pdf" class="text-indigo-300 hover:text-indigo-400"
>Split PDF</a
>
is the better fit.
</p>
</details>
</div>
+85 -16
View File
@@ -11,7 +11,7 @@
/>
<meta
name="description"
content="★ Extract Tables online free - Extract tables PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Extract tables from PDF files and export as CSV, JSON, or Markdown. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta name="keywords" content="extract tables, online pdf" />
<meta name="author" content="BentoPDF" />
@@ -32,7 +32,7 @@
/>
<meta
property="og:description"
content="★ Extract Tables online free - Extract tables PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser ★ Fast & secure"
content="Extract tables from PDF files and export as CSV, JSON, or Markdown. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
property="og:image"
@@ -51,7 +51,7 @@
<meta name="twitter:title" content="Extract Tables Free" />
<meta
name="twitter:description"
content="★ Extract Tables online free - Extract tables PDFs easily ★ No signup ★ Unlimited files ★ Privacy-first ★ Works in browser"
content="Extract tables from PDF files and export as CSV, JSON, or Markdown. Free, no uploads, no signup. Runs entirely in your browser."
/>
<meta
name="twitter:image"
@@ -65,10 +65,6 @@
<meta name="apple-mobile-web-app-title" content="Extract Tables" />
<title>Extract PDF Tables - BentoPDF</title>
<meta
name="description"
content="Extract tables from PDF files and export as CSV, JSON, or Markdown. Free, secure, and runs entirely in your browser."
/>
<link href="/src/css/styles.css" rel="stylesheet" />
@@ -347,32 +343,105 @@
<div class="faq-list">
<details class="faq-d">
<summary class="faq-d-q">
Is extract tables really free?
Which output format should I choose?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes! BentoPDF is 100% free with no hidden fees, no signup required,
and unlimited file processing.
CSV opens in Excel, Google Sheets, or any database import. JSON
gives an array of rows, each an array of cell strings, for scripts
and APIs. Markdown gives a pipe table you can paste into GitHub, a
wiki, or documentation.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Are my files private and secure?
What do I get when the PDF contains several tables?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Absolutely! All processing happens in your browser. Your files never
leave your device, ensuring complete privacy.
Each table is saved as its own file, named like table_1_page3.csv,
and all of them are bundled into filename_tables.zip. A single table
downloads directly as filename_table.csv, .json, or .md. If you'd
rather have every table in one file, use
<a href="/pdf-to-csv" class="text-indigo-300 hover:text-indigo-400"
>PDF to CSV</a
>.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is there a file size limit?
Why does it say no tables were found?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No! Process files of any size, as many times as you want, completely
free.
Detection works on the document's text layer. Scanned PDFs contain
only an image, so run them through
<a href="/ocr-pdf" class="text-indigo-300 hover:text-indigo-400"
>OCR PDF</a
>
first. Text that only looks like a table because of spacing, with no
table structure, may also go undetected.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
A table continues over several pages. Will it come out as one file?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. Each page is scanned separately, so a table that spans pages is
exported as one file per page, each with the page number in its
name. Join the pieces in a spreadsheet after extraction.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can I extract tables from only some pages?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
The whole document is always scanned, though the page number in each
filename tells you where a table came from. To limit the scan, save
the pages you need first with
<a
href="/extract-pages"
class="text-indigo-300 hover:text-indigo-400"
>Extract Pages</a
>
and run this tool on the smaller file.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Does the CSV handle commas and line breaks inside cells?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
Yes. Cells containing commas, quotes, or newlines are wrapped in
double quotes with inner quotes doubled, so spreadsheet software
reads them correctly. Empty cells are written as empty fields.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Can tables be extracted from a password-protected PDF?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
If the file needs a password to open, you're asked for it before
extraction starts, and the tables are read from a decrypted copy
held in memory.
</p>
</details>
<details class="faq-d">
<summary class="faq-d-q">
Is the PDF uploaded for table detection?
<i data-lucide="plus" class="faq-d-icon"></i>
</summary>
<p class="faq-d-a">
No. The detection engine (PyMuPDF compiled to WebAssembly) is
downloaded from a CDN the first time you use it, then runs inside
your browser. Your PDF stays on your device.
</p>
</details>
</div>

Some files were not shown because too many files have changed in this diff Show More