Skip to content

Commit 04a782c

Browse files
authored
ENH: Add compress command (#10)
1 parent 5939d40 commit 04a782c

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ Options:
3030
Commands:
3131
2-up Create a booklet-style PDF from a single input.
3232
cat Concatenate pages from PDF files into a single PDF file.
33+
compress Compress a PDF.
3334
extract-images Extract images from PDF without resampling or altering.
35+
extract-text Extract text from a PDF file.
36+
meta Show metadata of a PDF file
37+
3438
```
3539

3640
You can see the help of every subcommand by typing:

cpdf/cli.py

+9-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import typer
55

66
import cpdf.cat
7+
import cpdf.compress
78
import cpdf.extract_images
89
import cpdf.metadata
910
import cpdf.up2
@@ -57,7 +58,7 @@ def cat(
5758
def metadata(
5859
pdf: Path,
5960
output: cpdf.metadata.OutputOptions = typer.Option( # noqa
60-
cpdf.metadata.OutputOptions.text,
61+
cpdf.metadata.OutputOptions.text.value,
6162
"--output",
6263
"-o",
6364
help="output format",
@@ -68,9 +69,7 @@ def metadata(
6869

6970

7071
@entry_point.command(name="extract-text") # type: ignore[misc]
71-
def extract_text(
72-
pdf: Path,
73-
):
72+
def extract_text(pdf: Path):
7473
"""Extract text from a PDF file."""
7574
from PyPDF2 import PdfReader
7675

@@ -79,7 +78,13 @@ def extract_text(
7978
print(page.extract_text())
8079

8180

81+
@entry_point.command(name="compress") # type: ignore[misc]
82+
def compress(pdf: Path, output: Path):
83+
cpdf.compress.main(pdf, output)
84+
85+
8286
up2.__doc__ = cpdf.up2.__doc__
8387
extract_images.__doc__ = cpdf.extract_images.__doc__
8488
cat.__doc__ = cpdf.cat.__doc__
8589
metadata.__doc__ = cpdf.metadata.__doc__
90+
compress.__doc__ = cpdf.compress.__doc__

cpdf/compress.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""Compress a PDF."""
2+
3+
import os
4+
from pathlib import Path
5+
6+
from PyPDF2 import PdfReader, PdfWriter
7+
8+
9+
def main(pdf: Path, output: Path):
10+
reader = PdfReader(pdf)
11+
writer = PdfWriter()
12+
for page in reader.pages:
13+
page.compress_content_streams()
14+
writer.add_page(page)
15+
16+
with open(output, "wb") as fp:
17+
writer.write(fp)
18+
19+
orig_size = os.path.getsize(pdf)
20+
comp_size = os.path.getsize(output)
21+
ratio = comp_size / orig_size
22+
23+
print(f"Original Size : {orig_size:,}")
24+
print(f"Compressed Size: {comp_size:,} ({ratio * 100:2.1f}% of original)")

0 commit comments

Comments
 (0)