Download utils/pdf_utils.py from PerrinT/office: direct link, hf CLI and curl.
- Browser
- Download file 2.72 kB
-
https://huggingface.co/spaces/PerrinT/office/resolve/main/utils/pdf_utils.py
- Command line
-
hf download hf://spaces/PerrinT/office/utils/pdf_utils.py
-
curl -L -o pdf_utils.py https://huggingface.co/spaces/PerrinT/office/resolve/main/utils/pdf_utils.py
2.72 kB
| import PyPDF2 | |
| import io | |
| from typing import List | |
| def merge_pdfs(files: List) -> bytes: | |
| """合并多个PDF文件""" | |
| merger = PyPDF2.PdfMerger() | |
| for file in files: | |
| merger.append(file) | |
| buffer = io.BytesIO() | |
| merger.write(buffer) | |
| merger.close() | |
| return buffer.getvalue() | |
| def split_pdf(file, pages: str = None) -> List[bytes]: | |
| """拆分PDF文件""" | |
| reader = PyPDF2.PdfReader(file) | |
| total_pages = len(reader.pages) | |
| if pages: | |
| page_list = parse_page_range(pages, total_pages) | |
| else: | |
| page_list = list(range(total_pages)) | |
| results = [] | |
| for page_num in page_list: | |
| writer = PyPDF2.PdfWriter() | |
| writer.add_page(reader.pages[page_num]) | |
| buffer = io.BytesIO() | |
| writer.write(buffer) | |
| results.append(buffer.getvalue()) | |
| return results | |
| def parse_page_range(pages_str: str, total_pages: int) -> List[int]: | |
| """解析页码范围字符串""" | |
| result = [] | |
| parts = pages_str.split(',') | |
| for part in parts: | |
| part = part.strip() | |
| if '-' in part: | |
| start, end = part.split('-') | |
| start = int(start) - 1 | |
| end = int(end) if end else total_pages | |
| result.extend(range(start, end)) | |
| else: | |
| result.append(int(part) - 1) | |
| return result | |
| def add_watermark(pdf_file, watermark_text: str) -> bytes: | |
| """添加文字水印""" | |
| from reportlab.lib.pagesizes import letter | |
| from reportlab.pdfgen import canvas | |
| reader = PyPDF2.PdfReader(pdf_file) | |
| writer = PyPDF2.PdfWriter() | |
| for page in reader.pages: | |
| # 创建水印 | |
| watermark_buffer = io.BytesIO() | |
| c = canvas.Canvas(watermark_buffer, pagesize=letter) | |
| c.setFont("Helvetica", 50) | |
| c.setFillAlpha(0.3) | |
| c.saveState() | |
| c.translate(300, 400) | |
| c.rotate(45) | |
| c.drawCentredString(0, 0, watermark_text) | |
| c.restoreState() | |
| c.save() | |
| # 添加水印到页面 | |
| watermark_buffer.seek(0) | |
| watermark_reader = PyPDF2.PdfReader(watermark_buffer) | |
| watermark_page = watermark_reader.pages[0] | |
| page.merge_page(watermark_page) | |
| writer.add_page(page) | |
| buffer = io.BytesIO() | |
| writer.write(buffer) | |
| return buffer.getvalue() | |
| def add_password(pdf_file, user_password: str, owner_password: str = None) -> bytes: | |
| """添加密码保护""" | |
| reader = PyPDF2.PdfReader(pdf_file) | |
| writer = PyPDF2.PdfWriter() | |
| for page in reader.pages: | |
| writer.add_page(page) | |
| if not owner_password: | |
| owner_password = user_password | |
| writer.encrypt(user_password, owner_password) | |
| buffer = io.BytesIO() | |
| writer.write(buffer) | |
| return buffer.getvalue() | |