44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
"""
|
|
Render one or more pages of a PDF to PNG files.
|
|
|
|
Usage:
|
|
python render_pdf_page.py <pdf_path> <page_numbers> [--dpi 300] [--out-dir ./pages]
|
|
python render_pdf_page.py "F:/ЦТ/2018.pdf" "5,6,7,8" --dpi 300 --out-dir ./tmp_pages
|
|
|
|
page_numbers: comma-separated 1-based page numbers
|
|
"""
|
|
import sys
|
|
import os
|
|
import argparse
|
|
import fitz # PyMuPDF
|
|
|
|
def render_pages(pdf_path, pages, dpi=300, out_dir='.'):
|
|
os.makedirs(out_dir, exist_ok=True)
|
|
doc = fitz.open(pdf_path)
|
|
scale = dpi / 72.0
|
|
mat = fitz.Matrix(scale, scale)
|
|
results = []
|
|
for page_num in pages:
|
|
idx = page_num - 1
|
|
if idx < 0 or idx >= len(doc):
|
|
print(f' Page {page_num} out of range (doc has {len(doc)} pages)', file=sys.stderr)
|
|
continue
|
|
page = doc[idx]
|
|
pix = page.get_pixmap(matrix=mat)
|
|
out_path = os.path.join(out_dir, f'page_{page_num:03d}.png')
|
|
pix.save(out_path)
|
|
results.append(out_path)
|
|
print(f' Rendered page {page_num} -> {out_path} ({pix.width}x{pix.height})')
|
|
doc.close()
|
|
return results
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('pdf_path')
|
|
parser.add_argument('pages', help='comma-separated 1-based page numbers, e.g. "5,6,7,8"')
|
|
parser.add_argument('--dpi', type=int, default=300)
|
|
parser.add_argument('--out-dir', default='./tmp_pages')
|
|
args = parser.parse_args()
|
|
pages = [int(p.strip()) for p in args.pages.split(',')]
|
|
render_pages(args.pdf_path, pages, dpi=args.dpi, out_dir=args.out_dir)
|