mirror of
https://github.com/alam00000/bentopdf.git
synced 2026-11-05 03:50:29 +01:00
seo fixes
This commit is contained in:
@@ -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>
|
||||
@@ -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's PDF editor</a
|
||||
>, pick your file, make your changes, and download the result. The PDF
|
||||
stays on your device. There'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'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'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're working on it.
|
||||
</p>
|
||||
<p class="text-gray-300 leading-relaxed mb-5">
|
||||
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.
|
||||
</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'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'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'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's form filler render them properly.
|
||||
</p>
|
||||
<p class="text-gray-300 leading-relaxed mb-5">
|
||||
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
|
||||
<a class="text-indigo-300 hover:text-indigo-400" href="/edit-pdf"
|
||||
>PDF editor</a
|
||||
>
|
||||
and type into them. If you'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'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'll need OCR first.
|
||||
<a class="text-indigo-300 hover:text-indigo-400" href="/ocr-pdf"
|
||||
>BentoPDF'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'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'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.
|
||||
</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'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'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'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's
|
||||
developer tools. The website is how you get the software; it doesn'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't simply edit them because there isn't any text there yet.
|
||||
</p>
|
||||
<p class="text-gray-300 leading-relaxed mb-5">
|
||||
You'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'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't an imposed file-size limit.
|
||||
</p>
|
||||
<p class="text-gray-300 leading-relaxed mb-5">
|
||||
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.
|
||||
</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't specific to BentoPDF; it'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>
|
||||
@@ -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>
|
||||
@@ -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.
|
||||
@@ -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' },
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Generated
+3
-2
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 |
@@ -1312,5 +1312,13 @@
|
||||
"faqSinglePageAnswer": "نعم! فعّل خيار \"التكرار\" وستتكرر صفحات التراكب على جميع صفحات الملف الأساسي. العلامة المائية ذات الصفحة الواحدة ستُطبق على كل صفحة.",
|
||||
"faqPrivacyQuestion": "هل ملفاتي خاصة وآمنة؟",
|
||||
"faqPrivacyAnswer": "بالتأكيد! تتم جميع المعالجة في متصفحك. لا تغادر ملفاتك جهازك أبداً، مما يضمن خصوصية كاملة."
|
||||
},
|
||||
"unlockPdf": {
|
||||
"name": "فك تشفير PDF",
|
||||
"subtitle": "فتح PDF بإزالة حماية كلمة المرور."
|
||||
},
|
||||
"protectPdf": {
|
||||
"name": "تشفير PDF",
|
||||
"subtitle": "قفل PDF بإضافة كلمة مرور."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1312,5 +1312,13 @@
|
||||
"faqSinglePageAnswer": "Так! Уключыце опцыю \"Паўтараць\" і старонкі накладання будуць паўтарацца на ўсіх старонках базавага файла. Аднастаронкавы вадзяны знак будзе прымяняцца да кожнай старонкі.",
|
||||
"faqPrivacyQuestion": "Ці з'яўляюцца мае файлы прыватнымі і бяспечнымі?",
|
||||
"faqPrivacyAnswer": "Безумоўна! Уся апрацоўка адбываецца ў вашым браўзеры. Вашы файлы ніколі не пакідаюць вашу прыладу, забяспечваючы поўную прыватнасць."
|
||||
},
|
||||
"unlockPdf": {
|
||||
"name": "Расшыфраваць PDF",
|
||||
"subtitle": "Разблакіраваць PDF, выдаліўшы пароль."
|
||||
},
|
||||
"protectPdf": {
|
||||
"name": "Зашыфраваць PDF",
|
||||
"subtitle": "Заблакіраваць PDF, дадаўшы пароль."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1312,5 +1312,13 @@
|
||||
"faqSinglePageAnswer": "はい! 「ループ」オプションを有効にすると、オーバーレイPDFページがすべてのベース ページにわたって繰り返されます。単一ページのウォーターマークはすべてのページに適用されます。",
|
||||
"faqPrivacyQuestion": "私のファイルは非公開で安全ですか?",
|
||||
"faqPrivacyAnswer": "絶対に!すべての処理はブラウザ内で行われます。ファイルがデバイスの外に出ることはなく、完全なプライバシーが確保されます。"
|
||||
},
|
||||
"unlockPdf": {
|
||||
"name": "PDFの復号化",
|
||||
"subtitle": "パスワード保護を解除してPDFのロックを解除します。"
|
||||
},
|
||||
"protectPdf": {
|
||||
"name": "PDFの暗号化",
|
||||
"subtitle": "パスワードを追加してPDFをロックします。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1312,5 +1312,13 @@
|
||||
"faqSinglePageAnswer": "네! \"반복\" 옵션을 활성화하면 오버레이 페이지가 모든 기본 페이지에 반복됩니다. 단일 페이지 워터마크가 모든 페이지에 적용됩니다.",
|
||||
"faqPrivacyQuestion": "내 파일은 비공개이고 안전한가요?",
|
||||
"faqPrivacyAnswer": "물론입니다! 모든 처리는 브라우저에서 이루어집니다. 파일이 기기를 떠나지 않아 완전한 개인정보 보호가 보장됩니다."
|
||||
},
|
||||
"unlockPdf": {
|
||||
"name": "PDF 복호화",
|
||||
"subtitle": "비밀번호를 제거하여 PDF 잠금을 해제합니다."
|
||||
},
|
||||
"protectPdf": {
|
||||
"name": "PDF 암호화",
|
||||
"subtitle": "비밀번호를 설정하여 PDF를 보호합니다."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1312,5 +1312,13 @@
|
||||
"faqSinglePageAnswer": "Да! Включите опцию \"Повтор\" и страницы наложения будут повторяться на всех страницах базового файла. Одностраничный водяной знак будет применён к каждой странице.",
|
||||
"faqPrivacyQuestion": "Мои файлы конфиденциальны и защищены?",
|
||||
"faqPrivacyAnswer": "Безусловно! Вся обработка происходит в вашем браузере. Ваши файлы никогда не покидают ваше устройство, обеспечивая полную конфиденциальность."
|
||||
},
|
||||
"unlockPdf": {
|
||||
"name": "Расшифровка документа",
|
||||
"subtitle": "Снять защиту документа, удалив пароль."
|
||||
},
|
||||
"protectPdf": {
|
||||
"name": "Шифрование документа",
|
||||
"subtitle": "Защитить документ с помощью пароля."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1312,5 +1312,13 @@
|
||||
"faqSinglePageAnswer": "Так! Увімкніть опцію «Повторювати», і сторінки накладання будуть застосовані до всіх сторінок. Один водяний знак — на всі сторінки.",
|
||||
"faqPrivacyQuestion": "Чи безпечні мої файли?",
|
||||
"faqPrivacyAnswer": "Так! Уся обробка відбувається у вашому браузері. Файли не покидають ваш пристрій."
|
||||
},
|
||||
"unlockPdf": {
|
||||
"name": "Розблокувати PDF",
|
||||
"subtitle": "Видалити пароль і зняти захист PDF."
|
||||
},
|
||||
"protectPdf": {
|
||||
"name": "Зашифрувати PDF",
|
||||
"subtitle": "Захистити PDF паролем."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1311,5 +1311,13 @@
|
||||
"faqSinglePageAnswer": "可以!啟用重複使用功能後,疊加 PDF 的頁面會在所有基礎頁面上重複套用。單頁浮水印會套用至每一頁。",
|
||||
"faqPrivacyQuestion": "我的檔案是否私密安全?",
|
||||
"faqPrivacyAnswer": "當然!所有處理都在您的瀏覽器中進行。您的檔案永遠不會離開您的裝置,確保完全隱私。"
|
||||
},
|
||||
"unlockPdf": {
|
||||
"name": "解密 PDF",
|
||||
"subtitle": "透過移除密碼保護解鎖 PDF。"
|
||||
},
|
||||
"protectPdf": {
|
||||
"name": "加密 PDF",
|
||||
"subtitle": "透過新增密碼為您的 PDF 上鎖。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1312,5 +1312,13 @@
|
||||
"faqSinglePageAnswer": "可以!启用\"循环\"选项,叠加页面将在所有基础页面上重复。单页水印将应用到每一页。",
|
||||
"faqPrivacyQuestion": "我的文件是否私密安全?",
|
||||
"faqPrivacyAnswer": "当然!所有处理都在您的浏览器中进行。您的文件永远不会离开您的设备,确保完全隐私。"
|
||||
},
|
||||
"unlockPdf": {
|
||||
"name": "解密 PDF",
|
||||
"subtitle": "通过移除密码保护解锁 PDF。"
|
||||
},
|
||||
"protectPdf": {
|
||||
"name": "加密 PDF",
|
||||
"subtitle": "通过添加密码锁定您的 PDF。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
@@ -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, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"');
|
||||
}
|
||||
|
||||
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();
|
||||
@@ -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('|')})(/|$)`
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
`;
|
||||
|
||||
|
||||
@@ -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, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"');
|
||||
}
|
||||
|
||||
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();
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 & 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>
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & 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
@@ -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
@@ -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
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user