# python_epub_to_pdf
**Repository Path**: enzoism/python_epub_to_pdf
## Basic Information
- **Project Name**: python_epub_to_pdf
- **Description**: python编写工具完后电子书转化为PDF
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-28
- **Last Updated**: 2025-12-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Python之PDF小工具
> 【穷鬼套餐(买不起WPS会员)】这是一个多功能工具,既可以将EPUB电子书转换为PDF格式,也可以对现有的PDF文件进行拆分。
----
# 1-epub_to_pdf
```python
#!/usr/bin/env python3
"""
epub_to_pdf.py
ebooklib>=0.20、weasyprint>=66.0 实测通过
"""
import os
import sys
import ebooklib
from ebooklib import epub
from weasyprint import HTML
from weasyprint.text.fonts import FontConfiguration
def convert_epub_to_pdf(src_epub: str, dst_pdf: str | None = None) -> str | None:
"""把单个 epub 转 pdf,返回输出文件路径;失败返回 None"""
try:
book = epub.read_epub(src_epub)
html_parts = []
for item in book.get_items():
if item.get_type() == ebooklib.ITEM_DOCUMENT:
html_parts.append(item.get_content().decode('utf-8', errors='ignore'))
if not html_parts:
raise ValueError('文档不包含可解析章节')
# 拼成完整 HTML
full_html = f"""
{''.join(html_parts)}
"""
if dst_pdf is None:
out_dir = os.path.join('.', 'pdf')
os.makedirs(out_dir, exist_ok=True)
title = os.path.splitext(os.path.basename(src_epub))[0]
dst_pdf = os.path.join(out_dir, f"{title}.pdf")
HTML(string=full_html).write_pdf(dst_pdf, font_config=FontConfiguration())
print(f"✅ 成功:{dst_pdf}")
return dst_pdf
except Exception as e:
print(f"❌ 失败:{src_epub}\n原因:{e}")
return None
def main(target):
if os.path.isfile(target) and target.lower().endswith('.epub'):
convert_epub_to_pdf(target)
elif os.path.isdir(target):
epub_files = [f for f in os.listdir(target) if f.lower().endswith('.epub')]
if not epub_files:
print('📂 该目录下没有 epub 文件')
return
for f in epub_files:
convert_epub_to_pdf(os.path.join(target, f))
# ----------------------------
# 脚本入口
# ----------------------------
if __name__ == '__main__':
# if len(sys.argv) != 2:
# print('用法:python epub_to_pdf.py ')
# sys.exit(1)
#
# target = sys.argv[1]
main("/Users/rong/Documents/09-深度学习/epub_book")
```
----
# 2-epub_to_pdf
```python
#!/usr/bin/env python3
"""
epub_to_pdf.py
ebooklib>=0.20、weasyprint>=66.0 实测通过
"""
import sys
import os
# 添加PyPDF2库用于PDF操作
try:
import PyPDF2
PDF_LIBRARY_AVAILABLE = True
except ImportError:
PyPDF2 = None
PDF_LIBRARY_AVAILABLE = False
def split_pdf(input_pdf_path: str, output_pdf_path: str, pdf_file_name: str, start_page: int, end_page: int) -> bool:
"""按指定页码范围拆分PDF文件"""
if not PDF_LIBRARY_AVAILABLE:
print("❌ 错误:缺少PyPDF2库,请安装PyPDF2")
return False
try:
with open(input_pdf_path + pdf_file_name, 'rb') as infile:
reader = PyPDF2.PdfReader(infile)
writer = PyPDF2.PdfWriter()
# 检查页码范围是否有效
total_pages = len(reader.pages)
if start_page < 1 or end_page > total_pages or start_page > end_page:
print(f"❌ 错误:页码范围无效。总页数: {total_pages},请求范围: {start_page}-{end_page}")
return False
# 提取指定页面
for i in range(start_page - 1, end_page): # 页码从0开始索引
writer.add_page(reader.pages[i])
# 确保输出目录存在
os.makedirs(output_pdf_path, exist_ok=True)
# 写入新文件
output_file_name = output_pdf_path + str(start_page) + "_" + str(end_page) + "_" + pdf_file_name
with open(output_file_name, 'wb') as outfile:
writer.write(outfile)
print(f"✅ 成功拆分PDF: {input_pdf_path} 的第 {start_page}-{end_page} 页已保存到 {output_file_name}")
return True
except Exception as e:
print(f"❌ 拆分PDF失败:{e}")
return False
def main(pdf_file):
split_pdf(pdf_file, "output.pdf", 1, 10)
# ----------------------------
# 脚本入口
# ----------------------------
if __name__ == '__main__':
input_pdf_path = "./pdf/"
output_pdf_path = "./pdf_split/"
input_pdf_name = "曾国藩传_张宏杰.pdf"
success = split_pdf(input_pdf_path, output_pdf_path, input_pdf_name, 1, 115)
success = split_pdf(input_pdf_path, output_pdf_path, input_pdf_name, 115, 206)
success = split_pdf(input_pdf_path, output_pdf_path, input_pdf_name, 206, 338)
sys.exit(0 if success else 1)
```
----
# 3-项目说明
## 功能特性
1. EPUB转PDF转换器
2. PDF文件按页码范围拆分
## 安装依赖
```bash
pip install -r requirements.txt
```
或者使用uv:
```bash
uv pip install -r .
```
## 使用方法
### EPUB转PDF
```bash
python main.py
```
示例:
```bash
# 转换单个EPUB文件
python main.py books/example.epub
# 转换目录下的所有EPUB文件
python main.py books/
```
### 拆分PDF文件
```bash
python main.py split <输入PDF文件> <输出PDF文件> <起始页码> <结束页码>
```
示例:
```bash
# 拆分PDF的第5页到第10页
python main.py split input.pdf output.pdf 5 10
```
## 依赖库
- ebooklib: 处理EPUB文件
- weasyprint: 将HTML转换为PDF
- PyPDF2: 操作PDF文件