使用Python,Xpath获取所有的漫画章节路径,并下载漫画图片生成单个/多个pdf,并进行pdf合并
- 1 效果图
- 2 原理
- 2.1 pa_mh.py获取喜欢的漫画及所有章节
- 2.2 pyImg2pdf.py根据图片生成单个/多个pdf并增加章节提示
- 3 源码
- 3.1 pa_mh.py获取喜欢的漫画及所有章节
- 3.2 pyImg2pdf.py根据图片生成单个/多个pdf并增加章节提示
多图生成pdf可以用img2pdf。或者pypdf2。
pip install img2pdf
pip install pypdf2
img2pdf 可以传入单个图片路径或者多个图片路径生成 pdf,但没法插入章节信息。
故采用第二种pypdf2 ,依次生成章节封面pdf,以及章节正文pdf,在合并多个pdf
这篇博客介绍使用Python,Xpath获取所有的漫画章节路径,并下载漫画图片生成单个/多个pdf,并进行pdf合并
- 从主页,获取所有章节以及每个章节的链接(chapter.txt是所有的章节链接)
- 发现每个章节都是图片组成的漫画,获取每章包含的图片并进行下载
- 过滤没有下载到的error图片(error.txt包含所有未成功下载的图片)
- 根据多图片生成封面、正文pdf
- 多个pdf按顺序合并
1 效果图
获取所有章节,每一章节及对应图片:
章节封面+章节漫画图合并成一个pdf效果图如下:
章节封面+章节漫画图合并成多个pdf效果图如下:
2 原理
2.1 pa_mh.py获取喜欢的漫画及所有章节
- 从主页,获取所有章节以及每个章节的链接(chapter.txt是所有的章节链接)
- 发现每个章节都是图片组成的漫画,获取每章包含的图片并进行下载
- 过滤没有下载到的error图片(error.txt包含所有未成功下载的图片)
- 根据多图片生成pdf
2.2 pyImg2pdf.py根据图片生成单个/多个pdf并增加章节提示
- 生成每个章节的封面pdf(eg ch1.pdf)、每个章节的图片转正文pdf(eg: cqythll1.pdf) 【allPdf.txt记录所有按顺序要合并的文件,需要是绝对路径】
- 按顺序封面/正文pdf 进行多个pdf合并cqythll_outputall.pdf 如ch1.pdf,cqythll1.pdf,ch2.pdf,cqythll2.pdf,ch3.pdf,cqythll3.pdf…
- 生成文件过大,微读不支持导入进行,拆分合并成多个文件(拆分成3个文件,生成cqythll_output1.pdf cqythll_output2.pdf cqythll_output3.pdf )
3 源码
3.1 pa_mh.py获取喜欢的漫画及所有章节
# pa_mh.py 获取喜欢的漫画及所有章节
# 1. 从主页,获取所有章节以及每个章节的链接(chapter.txt是所有的章节链接)
# 2. 发现每个章节都是图片组成的漫画,获取每章包含的图片并进行下载
# 3. 过滤没有下载到的error图片(error.txt包含所有未成功下载的图片)
# -*- coding:utf-8 -*-
import os
from io import BytesIO
import requests
# 导入第三方库
from PIL import Image
from lxml import etree
# 下载图片
def downloadImgs(chapter, url):
# 设置请求超时(20s)
r = requests.get(url, timeout=20)
name = url.split("/")[-1]
path = 'ch/ch%s/' % (chapter)
print(path)
if not os.path.exists(path):
os.makedirs(path)
if r.status_code == requests.codes.ok:
with open('ch%s/%s' % (chapter, name), 'wb') as fin:
fin.write(r.content) # 写入图片二进制
print('正在下载第%s %s图片' % (chapter, url))
else:
r.raise_for_status() # 抛出异常
alist = []
# 获取所有章节
def getAllChapters():
# https://www.25mh.cc/html/0/7/9/
url = 'https://www.25mh.cc/html/0/7/'
print(url)
for i in range(1, 11):
url_page = url + str(i) + '/'
r = requests.get(url_page, timeout=20)
print(url_page, r)
if r.status_code == requests.codes.ok:
# print('=== status_code === ', r.status_code) # 响应码
# print('=== headers === ', r.headers) # 响应头
# print('=== Content-Type === ', r.headers.get('Content-Type')) # 获取响应头中的Content-Type字段
# 解析数据
r.encoding = 'utf-8'
# print('content: ', type(r.text), r.text)
# content = " ".join([r.rstrip() for r in f])
html = etree.HTML(r.text, etree.HTMLParser())
result = html.xpath("//*[@rel=\"chapter\"]")
print(str(i), " result:", len(result))
for j, li in enumerate(result):
print(str(i), str(j), li.attrib['href'])
alist.append(li.attrib['href'])
# r:以只读方式打开文件,从头开始读。
# rb:以二进制格式打开一个文件用于只读。
# 关于写入:
# w:打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件
# wb:以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等
# a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式,不会覆盖原有的内容。如果该文件不存在,创建新文件用于读写
# ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。不会覆盖原有的内容。如果该文件不存在,创建新文件用于读写。
with open('chapter.txt', 'a', encoding='UTF-8') as fin:
fin.writelines('\n'.join(alist))
print(len(alist), alist)
# 解析每一章节包含的图片链接,并下载
def parse_chapter(alist):
# https://www.25mh.cc/manhua/0/7/1121913.html
url = 'https://www.25mh.cc'
for i, chap in enumerate(alist):
url_chap = url + chap
print(str(i), url_chap)
r = requests.get(url_chap, timeout=20)
print(r.text)
if r.status_code == requests.codes.ok:
# 解析数据
r.encoding = 'utf-8'
print('content: ', type(r.text), r.text)
for strA in r.text.split("\n"):
if (strA.__contains__("<img src=")):
print(strA)
strc = strA.replace("var imgs = ", "").split("<img src=")
for j, img in enumerate(strc):
if (not img.__contains__(".jpg")): continue
img_path = img.replace("\\", "").replace(">", "").replace("\"", "").replace(",", "") \
.replace(";", "").replace("]", "").replace(" ", "")
print(str(j), img_path)
if (img_path.__contains__('comic')):
with open('valid.txt', 'a', encoding='UTF-8') as fin:
fin.writelines(str(i + 1))
fin.writelines('img: ' + img_path)
print('valid %s' % (str(i + 1)))
continue
downloadImgs(str(i + 1) + "_" + chap.replace(".html", "").split("/")[-1], img_path)
break
def pic_to_pdf(image_bytes: bytes) -> bytes:
"""将单个图片转换为单张PDF
:param image_bytes: 图片的bytes对象
:return: PDF的bytes对象
"""
# 将bytes对象转换为BytesIO对象
image_bytes_io = BytesIO(image_bytes)
# 从内存中读取图片
image_object = Image.open(image_bytes_io)
# 打开内存中的文件用于保存PDF
with BytesIO() as result_bytes_io:
# 将图片保存为单张PDF
image_object.save(result_bytes_io, "PDF", resolution=100.0)
# 获取内存中的文件
data = result_bytes_io.getvalue()
# 返回PDF的bytes对象
return data
# 校验未下载成功的照片,并跳过
def validError(img_dir, pdf_path):
# 支持的图片文件格式
SUPPORT_SUFFIX = ["jpg", "jpeg", "png"]
# 遍历文件夹下所有文件
for root, dirs, files in os.walk(img_dir, topdown=False):
print(root)
for i, name in enumerate(files):
if (name.__contains__(".pdf")):
source_file_path = os.path.join(root, name)
source_file_path = source_file_path.replace("\\", '/')
os.remove(source_file_path)
continue
# 提取文件的后缀名
file_suffix = os.path.splitext(name)[-1].lstrip(".").lower()
# 检测该文件格式是否受到支持
if file_suffix not in SUPPORT_SUFFIX:
continue
# 拼接出图片文件的绝对路径
source_file_path = os.path.join(root, name)
source_file_path = source_file_path.replace("\\", '/')
# 拼接出PDF文件的绝对路径
pdf_path = source_file_path.replace(".jpg", ".pdf")
target_file_path = pdf_path.replace(".pdf", root.split('/')[-1].split("_")[0].replace("ch", "") + ".pdf")
print(source_file_path, name, target_file_path)
# 将图片文件转换为PDF文件
with open(source_file_path, "rb") as source:
try:
pic_to_pdf(source.read())
# with open(target_file_path, "wb") as target:
# target.write(pic_to_pdf(source.read()))
except Exception as e:
print(e)
with open('error.txt', 'a+') as f:
f.writelines('\'' + source_file_path + "\',")
def getAllChapters2():
alist = ['/manhua/0/7/209.html', '/manhua/0/7/211.html', '/manhua/0/7/213.html', '/manhua/0/7/215.html',
'/manhua/0/7/223.html', '/manhua/0/7/225.html', '/manhua/0/7/227.html', '/manhua/0/7/229.html',
'/manhua/0/7/231.html', '/manhua/0/7/233.html', '/manhua/0/7/235.html', '/manhua/0/7/237.html',
'/manhua/0/7/239.html', '/manhua/0/7/241.html', '/manhua/0/7/243.html', '/manhua/0/7/245.html',
'/manhua/0/7/247.html', '/manhua/0/7/249.html', '/manhua/0/7/251.html', '/manhua/0/7/253.html',
'/manhua/0/7/255.html', '/manhua/0/7/257.html', '/manhua/0/7/259.html', '/manhua/0/7/261.html',
'/manhua/0/7/263.html', '/manhua/0/7/265.html', '/manhua/0/7/513.html', '/manhua/0/7/515.html',
'/manhua/0/7/517.html', '/manhua/0/7/519.html', '/manhua/0/7/521.html', '/manhua/0/7/523.html',
'/manhua/0/7/525.html', '/manhua/0/7/991.html', '/manhua/0/7/993.html', '/manhua/0/7/995.html',
'/manhua/0/7/997.html', '/manhua/0/7/999.html', '/manhua/0/7/1001.html', '/manhua/0/7/1003.html',
'/manhua/0/7/1005.html', '/manhua/0/7/1007.html', '/manhua/0/7/1009.html', '/manhua/0/7/1011.html',
'/manhua/0/7/1013.html', '/manhua/0/7/1015.html', '/manhua/0/7/1179.html', '/manhua/0/7/1181.html',
'/manhua/0/7/1183.html', '/manhua/0/7/1185.html', '/manhua/0/7/1187.html', '/manhua/0/7/1189.html',
'/manhua/0/7/1191.html', '/manhua/0/7/1193.html', '/manhua/0/7/1195.html', '/manhua/0/7/1197.html',
'/manhua/0/7/1199.html', '/manhua/0/7/1201.html', '/manhua/0/7/1203.html', '/manhua/0/7/1205.html',
'/manhua/0/7/1207.html', '/manhua/0/7/1209.html', '/manhua/0/7/1211.html', '/manhua/0/7/1213.html',
'/manhua/0/7/1215.html', '/manhua/0/7/1217.html', '/manhua/0/7/1219.html', '/manhua/0/7/1221.html',
'/manhua/0/7/1223.html', '/manhua/0/7/1225.html', '/manhua/0/7/1227.html', '/manhua/0/7/1229.html',
'/manhua/0/7/1231.html', '/manhua/0/7/1233.html', '/manhua/0/7/1235.html', '/manhua/0/7/1237.html',
'/manhua/0/7/1239.html', '/manhua/0/7/1241.html', '/manhua/0/7/1243.html', '/manhua/0/7/1245.html',
'/manhua/0/7/1247.html', '/manhua/0/7/1249.html', '/manhua/0/7/1251.html', '/manhua/0/7/1253.html',
'/manhua/0/7/1255.html', '/manhua/0/7/1257.html', '/manhua/0/7/1259.html', '/manhua/0/7/1261.html',
'/manhua/0/7/1263.html', '/manhua/0/7/1265.html', '/manhua/0/7/1267.html', '/manhua/0/7/1269.html',
'/manhua/0/7/1271.html', '/manhua/0/7/1273.html', '/manhua/0/7/1275.html', '/manhua/0/7/1277.html',
'/manhua/0/7/1279.html', '/manhua/0/7/1281.html', '/manhua/0/7/1283.html', '/manhua/0/7/1285.html',
'/manhua/0/7/1287.html', '/manhua/0/7/1289.html', '/manhua/0/7/1291.html', '/manhua/0/7/1293.html',
'/manhua/0/7/1295.html', '/manhua/0/7/1297.html', '/manhua/0/7/1299.html', '/manhua/0/7/1301.html',
'/manhua/0/7/1303.html', '/manhua/0/7/1305.html', '/manhua/0/7/1307.html', '/manhua/0/7/1309.html',
'/manhua/0/7/1311.html', '/manhua/0/7/1313.html', '/manhua/0/7/1315.html', '/manhua/0/7/1317.html',
'/manhua/0/7/1319.html', '/manhua/0/7/1321.html', '/manhua/0/7/1323.html', '/manhua/0/7/1325.html',
'/manhua/0/7/1327.html', '/manhua/0/7/1329.html', '/manhua/0/7/1331.html', '/manhua/0/7/1333.html',
'/manhua/0/7/1335.html', '/manhua/0/7/1337.html', '/manhua/0/7/1339.html', '/manhua/0/7/1341.html',
'/manhua/0/7/1343.html', '/manhua/0/7/1345.html', '/manhua/0/7/1347.html', '/manhua/0/7/1349.html',
'/manhua/0/7/1351.html', '/manhua/0/7/1353.html', '/manhua/0/7/1355.html', '/manhua/0/7/1357.html',
'/manhua/0/7/1359.html', '/manhua/0/7/1361.html', '/manhua/0/7/1363.html', '/manhua/0/7/1365.html',
'/manhua/0/7/1367.html', '/manhua/0/7/1369.html', '/manhua/0/7/1371.html', '/manhua/0/7/1373.html',
'/manhua/0/7/1375.html', '/manhua/0/7/1377.html', '/manhua/0/7/1379.html', '/manhua/0/7/1381.html',
'/manhua/0/7/1383.html', '/manhua/0/7/1385.html', '/manhua/0/7/1387.html', '/manhua/0/7/1389.html',
'/manhua/0/7/1391.html', '/manhua/0/7/1393.html', '/manhua/0/7/1395.html', '/manhua/0/7/1397.html',
'/manhua/0/7/1399.html', '/manhua/0/7/1401.html', '/manhua/0/7/1403.html', '/manhua/0/7/1405.html',
'/manhua/0/7/1407.html', '/manhua/0/7/1409.html', '/manhua/0/7/1411.html', '/manhua/0/7/1413.html',
'/manhua/0/7/1415.html', '/manhua/0/7/1417.html', '/manhua/0/7/1419.html', '/manhua/0/7/1421.html',
'/manhua/0/7/1423.html', '/manhua/0/7/1425.html', '/manhua/0/7/1427.html', '/manhua/0/7/1429.html',
'/manhua/0/7/1431.html', '/manhua/0/7/1433.html', '/manhua/0/7/1435.html', '/manhua/0/7/1437.html',
'/manhua/0/7/1439.html', '/manhua/0/7/1441.html', '/manhua/0/7/1443.html', '/manhua/0/7/1445.html',
'/manhua/0/7/1447.html', '/manhua/0/7/1449.html', '/manhua/0/7/1451.html', '/manhua/0/7/1453.html',
'/manhua/0/7/1455.html', '/manhua/0/7/1457.html', '/manhua/0/7/1459.html', '/manhua/0/7/1461.html',
'/manhua/0/7/1463.html', '/manhua/0/7/1465.html', '/manhua/0/7/1467.html', '/manhua/0/7/1469.html',
'/manhua/0/7/1471.html', '/manhua/0/7/1473.html', '/manhua/0/7/1475.html', '/manhua/0/7/1477.html',
'/manhua/0/7/1479.html', '/manhua/0/7/1481.html', '/manhua/0/7/1483.html', '/manhua/0/7/1485.html',
'/manhua/0/7/1487.html', '/manhua/0/7/1489.html', '/manhua/0/7/1491.html', '/manhua/0/7/1493.html',
'/manhua/0/7/1495.html', '/manhua/0/7/1497.html', '/manhua/0/7/1499.html', '/manhua/0/7/1501.html',
'/manhua/0/7/1503.html', '/manhua/0/7/1505.html', '/manhua/0/7/1507.html', '/manhua/0/7/1509.html',
'/manhua/0/7/1511.html', '/manhua/0/7/1513.html', '/manhua/0/7/1515.html', '/manhua/0/7/1517.html',
'/manhua/0/7/1519.html', '/manhua/0/7/1521.html', '/manhua/0/7/1523.html', '/manhua/0/7/1525.html',
'/manhua/0/7/1527.html', '/manhua/0/7/1529.html', '/manhua/0/7/1531.html', '/manhua/0/7/1533.html',
'/manhua/0/7/1535.html', '/manhua/0/7/1537.html', '/manhua/0/7/1539.html', '/manhua/0/7/1541.html',
'/manhua/0/7/1543.html', '/manhua/0/7/1545.html', '/manhua/0/7/1547.html', '/manhua/0/7/1549.html',
'/manhua/0/7/1551.html', '/manhua/0/7/1553.html', '/manhua/0/7/1555.html', '/manhua/0/7/1557.html',
'/manhua/0/7/1559.html', '/manhua/0/7/1561.html', '/manhua/0/7/1563.html', '/manhua/0/7/1565.html',
'/manhua/0/7/1567.html', '/manhua/0/7/1569.html', '/manhua/0/7/1571.html', '/manhua/0/7/1573.html',
'/manhua/0/7/1575.html', '/manhua/0/7/1577.html', '/manhua/0/7/1579.html', '/manhua/0/7/1581.html',
'/manhua/0/7/1583.html', '/manhua/0/7/1585.html', '/manhua/0/7/1587.html', '/manhua/0/7/1589.html',
'/manhua/0/7/1591.html', '/manhua/0/7/1593.html', '/manhua/0/7/1595.html', '/manhua/0/7/1597.html',
'/manhua/0/7/1599.html', '/manhua/0/7/1601.html', '/manhua/0/7/1603.html', '/manhua/0/7/1605.html',
'/manhua/0/7/1607.html', '/manhua/0/7/1609.html', '/manhua/0/7/1611.html', '/manhua/0/7/1613.html',
'/manhua/0/7/1615.html', '/manhua/0/7/1617.html', '/manhua/0/7/1687.html', '/manhua/0/7/1689.html',
'/manhua/0/7/1691.html', '/manhua/0/7/1693.html', '/manhua/0/7/1695.html', '/manhua/0/7/1697.html',
'/manhua/0/7/1699.html', '/manhua/0/7/1701.html', '/manhua/0/7/1703.html', '/manhua/0/7/1705.html',
'/manhua/0/7/1707.html', '/manhua/0/7/1709.html', '/manhua/0/7/1711.html', '/manhua/0/7/1713.html',
'/manhua/0/7/1715.html', '/manhua/0/7/1717.html', '/manhua/0/7/1719.html', '/manhua/0/7/1721.html',
'/manhua/0/7/1723.html', '/manhua/0/7/1725.html', '/manhua/0/7/1727.html', '/manhua/0/7/1729.html',
'/manhua/0/7/1731.html', '/manhua/0/7/1733.html', '/manhua/0/7/1735.html', '/manhua/0/7/1737.html',
'/manhua/0/7/1739.html', '/manhua/0/7/1741.html', '/manhua/0/7/1743.html', '/manhua/0/7/1745.html',
'/manhua/0/7/1747.html', '/manhua/0/7/1749.html', '/manhua/0/7/1751.html', '/manhua/0/7/1753.html',
'/manhua/0/7/1755.html', '/manhua/0/7/1757.html', '/manhua/0/7/1759.html', '/manhua/0/7/1761.html',
'/manhua/0/7/2029.html', '/manhua/0/7/2031.html', '/manhua/0/7/14597.html', '/manhua/0/7/30547.html',
'/manhua/0/7/34253.html', '/manhua/0/7/39757.html', '/manhua/0/7/42417.html', '/manhua/0/7/50723.html',
'/manhua/0/7/52753.html', '/manhua/0/7/57479.html', '/manhua/0/7/58195.html', '/manhua/0/7/62525.html',
'/manhua/0/7/97513.html', '/manhua/0/7/97515.html', '/manhua/0/7/101085.html', '/manhua/0/7/114537.html',
'/manhua/0/7/115757.html', '/manhua/0/7/115759.html', '/manhua/0/7/153413.html', '/manhua/0/7/153415.html',
'/manhua/0/7/153417.html', '/manhua/0/7/153419.html', '/manhua/0/7/153421.html', '/manhua/0/7/153423.html',
'/manhua/0/7/153425.html', '/manhua/0/7/153427.html', '/manhua/0/7/153429.html', '/manhua/0/7/153431.html',
'/manhua/0/7/153433.html', '/manhua/0/7/153435.html', '/manhua/0/7/153437.html', '/manhua/0/7/156243.html',
'/manhua/0/7/157147.html', '/manhua/0/7/166907.html', '/manhua/0/7/173679.html', '/manhua/0/7/174205.html',
'/manhua/0/7/179245.html', '/manhua/0/7/182009.html', '/manhua/0/7/185369.html', '/manhua/0/7/186057.html',
'/manhua/0/7/196033.html', '/manhua/0/7/196035.html', '/manhua/0/7/240687.html', '/manhua/0/7/240689.html',
'/manhua/0/7/240691.html', '/manhua/0/7/240693.html', '/manhua/0/7/240695.html', '/manhua/0/7/240697.html',
'/manhua/0/7/240699.html', '/manhua/0/7/240701.html', '/manhua/0/7/240703.html', '/manhua/0/7/240705.html',
'/manhua/0/7/240707.html', '/manhua/0/7/240709.html', '/manhua/0/7/240711.html', '/manhua/0/7/240713.html',
'/manhua/0/7/240715.html', '/manhua/0/7/240717.html', '/manhua/0/7/240719.html', '/manhua/0/7/240721.html',
'/manhua/0/7/240723.html', '/manhua/0/7/240725.html', '/manhua/0/7/240727.html', '/manhua/0/7/240729.html',
'/manhua/0/7/240731.html', '/manhua/0/7/240733.html', '/manhua/0/7/524833.html', '/manhua/0/7/1121855.html',
'/manhua/0/7/1121857.html', '/manhua/0/7/1121859.html', '/manhua/0/7/1121861.html', '/manhua/0/7/1121863.html',
'/manhua/0/7/1121865.html', '/manhua/0/7/1121867.html', '/manhua/0/7/1121869.html', '/manhua/0/7/1121871.html',
'/manhua/0/7/1121873.html', '/manhua/0/7/1121875.html', '/manhua/0/7/1121877.html', '/manhua/0/7/1121879.html',
'/manhua/0/7/1121881.html', '/manhua/0/7/1121883.html', '/manhua/0/7/1121885.html', '/manhua/0/7/1121887.html',
'/manhua/0/7/1121889.html', '/manhua/0/7/1121891.html', '/manhua/0/7/1121893.html', '/manhua/0/7/1121895.html',
'/manhua/0/7/1121897.html', '/manhua/0/7/1121899.html', '/manhua/0/7/1121901.html', '/manhua/0/7/1121903.html',
'/manhua/0/7/1121905.html', '/manhua/0/7/1121907.html', '/manhua/0/7/1121909.html', '/manhua/0/7/1121911.html',
'/manhua/0/7/1121913.html', '/manhua/0/7/1121915.html', '/manhua/0/7/1121917.html', '/manhua/0/7/1121919.html',
'/manhua/0/7/1121921.html', '/manhua/0/7/1121923.html', '/manhua/0/7/1121925.html', '/manhua/0/7/1121927.html',
'/manhua/0/7/1121929.html', '/manhua/0/7/1121931.html', '/manhua/0/7/1121933.html', '/manhua/0/7/1121935.html',
'/manhua/0/7/1121937.html', '/manhua/0/7/1121939.html', '/manhua/0/7/1121941.html', '/manhua/0/7/1121943.html',
'/manhua/0/7/1121945.html', '/manhua/0/7/1121947.html', '/manhua/0/7/1121949.html', '/manhua/0/7/1121951.html',
'/manhua/0/7/1121953.html', '/manhua/0/7/1121955.html', '/manhua/0/7/1121957.html', '/manhua/0/7/1121959.html',
'/manhua/0/7/1121961.html', '/manhua/0/7/1121963.html', '/manhua/0/7/1121965.html', '/manhua/0/7/1121967.html',
'/manhua/0/7/1121969.html', '/manhua/0/7/1121971.html', '/manhua/0/7/1121973.html', '/manhua/0/7/1121975.html',
'/manhua/0/7/1121977.html', '/manhua/0/7/1121979.html', '/manhua/0/7/1121981.html', '/manhua/0/7/1121983.html',
'/manhua/0/7/1121985.html', '/manhua/0/7/1121987.html', '/manhua/0/7/1121989.html', '/manhua/0/7/1121991.html',
'/manhua/0/7/1121993.html', '/manhua/0/7/1121995.html', '/manhua/0/7/1121997.html', '/manhua/0/7/1121999.html',
'/manhua/0/7/1122001.html', '/manhua/0/7/1122003.html', '/manhua/0/7/1122005.html', '/manhua/0/7/1122007.html',
'/manhua/0/7/1122009.html', '/manhua/0/7/1122011.html', '/manhua/0/7/1122013.html', '/manhua/0/7/1122015.html',
'/manhua/0/7/1122017.html', '/manhua/0/7/1122019.html', '/manhua/0/7/1122021.html', '/manhua/0/7/1122023.html',
'/manhua/0/7/1122025.html', '/manhua/0/7/1122027.html', '/manhua/0/7/1122029.html', '/manhua/0/7/1122031.html',
'/manhua/0/7/1122033.html', '/manhua/0/7/1122035.html', '/manhua/0/7/1122037.html', '/manhua/0/7/1122039.html',
'/manhua/0/7/1122041.html', '/manhua/0/7/1122043.html', '/manhua/0/7/1122045.html', '/manhua/0/7/1122047.html']
return alist
list = getAllChapters()
# alist = getAllChapters2()
img_all = parse_chapter(alist)
validError('ch/', 'ch2/')
3.2 pyImg2pdf.py根据图片生成单个/多个pdf并增加章节提示
# pyImg2pdf.py 根据图片生成单个/多个pdf并增加章节提示
# 1. 生成每个章节的封面pdf(eg ch1.pdf)、每个章节的图片转正文pdf(eg: cqythll1.pdf) 【allPdf.txt记录所有按顺序要合并的文件,需要是绝对路径】
# 2. 按顺序封面/正文pdf 进行多个pdf合并cqythll_outputall.pdf 如ch1.pdf,cqythll1.pdf,ch2.pdf,cqythll2.pdf,ch3.pdf,cqythll3.pdf...
# 3. 生成文件过大,微读不支持导入进行,拆分合并成多个文件(拆分成3个文件,生成cqythll_output1.pdf cqythll_output2.pdf cqythll_output3.pdf )
import img2pdf
from PyPDF2 import PdfMerger
from imutils import paths
alist = ['/manhua/0/7/209.html', '/manhua/0/7/211.html', '/manhua/0/7/213.html', '/manhua/0/7/215.html',
'/manhua/0/7/223.html', '/manhua/0/7/225.html', '/manhua/0/7/227.html', '/manhua/0/7/229.html',
'/manhua/0/7/231.html', '/manhua/0/7/233.html', '/manhua/0/7/235.html', '/manhua/0/7/237.html',
'/manhua/0/7/239.html', '/manhua/0/7/241.html', '/manhua/0/7/243.html', '/manhua/0/7/245.html',
'/manhua/0/7/247.html', '/manhua/0/7/249.html', '/manhua/0/7/251.html', '/manhua/0/7/253.html',
'/manhua/0/7/255.html', '/manhua/0/7/257.html', '/manhua/0/7/259.html', '/manhua/0/7/261.html',
'/manhua/0/7/263.html', '/manhua/0/7/265.html', '/manhua/0/7/513.html', '/manhua/0/7/515.html',
'/manhua/0/7/517.html', '/manhua/0/7/519.html', '/manhua/0/7/521.html', '/manhua/0/7/523.html',
'/manhua/0/7/525.html', '/manhua/0/7/991.html', '/manhua/0/7/993.html', '/manhua/0/7/995.html',
'/manhua/0/7/997.html', '/manhua/0/7/999.html', '/manhua/0/7/1001.html', '/manhua/0/7/1003.html',
'/manhua/0/7/1005.html', '/manhua/0/7/1007.html', '/manhua/0/7/1009.html', '/manhua/0/7/1011.html',
'/manhua/0/7/1013.html', '/manhua/0/7/1015.html', '/manhua/0/7/1179.html', '/manhua/0/7/1181.html',
'/manhua/0/7/1183.html', '/manhua/0/7/1185.html', '/manhua/0/7/1187.html', '/manhua/0/7/1189.html',
'/manhua/0/7/1191.html', '/manhua/0/7/1193.html', '/manhua/0/7/1195.html', '/manhua/0/7/1197.html',
'/manhua/0/7/1199.html', '/manhua/0/7/1201.html', '/manhua/0/7/1203.html', '/manhua/0/7/1205.html',
'/manhua/0/7/1207.html', '/manhua/0/7/1209.html', '/manhua/0/7/1211.html', '/manhua/0/7/1213.html',
'/manhua/0/7/1215.html', '/manhua/0/7/1217.html', '/manhua/0/7/1219.html', '/manhua/0/7/1221.html',
'/manhua/0/7/1223.html', '/manhua/0/7/1225.html', '/manhua/0/7/1227.html', '/manhua/0/7/1229.html',
'/manhua/0/7/1231.html', '/manhua/0/7/1233.html', '/manhua/0/7/1235.html', '/manhua/0/7/1237.html',
'/manhua/0/7/1239.html', '/manhua/0/7/1241.html', '/manhua/0/7/1243.html', '/manhua/0/7/1245.html',
'/manhua/0/7/1247.html', '/manhua/0/7/1249.html', '/manhua/0/7/1251.html', '/manhua/0/7/1253.html',
'/manhua/0/7/1255.html', '/manhua/0/7/1257.html', '/manhua/0/7/1259.html', '/manhua/0/7/1261.html',
'/manhua/0/7/1263.html', '/manhua/0/7/1265.html', '/manhua/0/7/1267.html', '/manhua/0/7/1269.html',
'/manhua/0/7/1271.html', '/manhua/0/7/1273.html', '/manhua/0/7/1275.html', '/manhua/0/7/1277.html',
'/manhua/0/7/1279.html', '/manhua/0/7/1281.html', '/manhua/0/7/1283.html', '/manhua/0/7/1285.html',
'/manhua/0/7/1287.html', '/manhua/0/7/1289.html', '/manhua/0/7/1291.html', '/manhua/0/7/1293.html',
'/manhua/0/7/1295.html', '/manhua/0/7/1297.html', '/manhua/0/7/1299.html', '/manhua/0/7/1301.html',
'/manhua/0/7/1303.html', '/manhua/0/7/1305.html', '/manhua/0/7/1307.html', '/manhua/0/7/1309.html',
'/manhua/0/7/1311.html', '/manhua/0/7/1313.html', '/manhua/0/7/1315.html', '/manhua/0/7/1317.html',
'/manhua/0/7/1319.html', '/manhua/0/7/1321.html', '/manhua/0/7/1323.html', '/manhua/0/7/1325.html',
'/manhua/0/7/1327.html', '/manhua/0/7/1329.html', '/manhua/0/7/1331.html', '/manhua/0/7/1333.html',
'/manhua/0/7/1335.html', '/manhua/0/7/1337.html', '/manhua/0/7/1339.html', '/manhua/0/7/1341.html',
'/manhua/0/7/1343.html', '/manhua/0/7/1345.html', '/manhua/0/7/1347.html', '/manhua/0/7/1349.html',
'/manhua/0/7/1351.html', '/manhua/0/7/1353.html', '/manhua/0/7/1355.html', '/manhua/0/7/1357.html',
'/manhua/0/7/1359.html', '/manhua/0/7/1361.html', '/manhua/0/7/1363.html', '/manhua/0/7/1365.html',
'/manhua/0/7/1367.html', '/manhua/0/7/1369.html', '/manhua/0/7/1371.html', '/manhua/0/7/1373.html',
'/manhua/0/7/1375.html', '/manhua/0/7/1377.html', '/manhua/0/7/1379.html', '/manhua/0/7/1381.html',
'/manhua/0/7/1383.html', '/manhua/0/7/1385.html', '/manhua/0/7/1387.html', '/manhua/0/7/1389.html',
'/manhua/0/7/1391.html', '/manhua/0/7/1393.html', '/manhua/0/7/1395.html', '/manhua/0/7/1397.html',
'/manhua/0/7/1399.html', '/manhua/0/7/1401.html', '/manhua/0/7/1403.html', '/manhua/0/7/1405.html',
'/manhua/0/7/1407.html', '/manhua/0/7/1409.html', '/manhua/0/7/1411.html', '/manhua/0/7/1413.html',
'/manhua/0/7/1415.html', '/manhua/0/7/1417.html', '/manhua/0/7/1419.html', '/manhua/0/7/1421.html',
'/manhua/0/7/1423.html', '/manhua/0/7/1425.html', '/manhua/0/7/1427.html', '/manhua/0/7/1429.html',
'/manhua/0/7/1431.html', '/manhua/0/7/1433.html', '/manhua/0/7/1435.html', '/manhua/0/7/1437.html',
'/manhua/0/7/1439.html', '/manhua/0/7/1441.html', '/manhua/0/7/1443.html', '/manhua/0/7/1445.html',
'/manhua/0/7/1447.html', '/manhua/0/7/1449.html', '/manhua/0/7/1451.html', '/manhua/0/7/1453.html',
'/manhua/0/7/1455.html', '/manhua/0/7/1457.html', '/manhua/0/7/1459.html', '/manhua/0/7/1461.html',
'/manhua/0/7/1463.html', '/manhua/0/7/1465.html', '/manhua/0/7/1467.html', '/manhua/0/7/1469.html',
'/manhua/0/7/1471.html', '/manhua/0/7/1473.html', '/manhua/0/7/1475.html', '/manhua/0/7/1477.html',
'/manhua/0/7/1479.html', '/manhua/0/7/1481.html', '/manhua/0/7/1483.html', '/manhua/0/7/1485.html',
'/manhua/0/7/1487.html', '/manhua/0/7/1489.html', '/manhua/0/7/1491.html', '/manhua/0/7/1493.html',
'/manhua/0/7/1495.html', '/manhua/0/7/1497.html', '/manhua/0/7/1499.html', '/manhua/0/7/1501.html',
'/manhua/0/7/1503.html', '/manhua/0/7/1505.html', '/manhua/0/7/1507.html', '/manhua/0/7/1509.html',
'/manhua/0/7/1511.html', '/manhua/0/7/1513.html', '/manhua/0/7/1515.html', '/manhua/0/7/1517.html',
'/manhua/0/7/1519.html', '/manhua/0/7/1521.html', '/manhua/0/7/1523.html', '/manhua/0/7/1525.html',
'/manhua/0/7/1527.html', '/manhua/0/7/1529.html', '/manhua/0/7/1531.html', '/manhua/0/7/1533.html',
'/manhua/0/7/1535.html', '/manhua/0/7/1537.html', '/manhua/0/7/1539.html', '/manhua/0/7/1541.html',
'/manhua/0/7/1543.html', '/manhua/0/7/1545.html', '/manhua/0/7/1547.html', '/manhua/0/7/1549.html',
'/manhua/0/7/1551.html', '/manhua/0/7/1553.html', '/manhua/0/7/1555.html', '/manhua/0/7/1557.html',
'/manhua/0/7/1559.html', '/manhua/0/7/1561.html', '/manhua/0/7/1563.html', '/manhua/0/7/1565.html',
'/manhua/0/7/1567.html', '/manhua/0/7/1569.html', '/manhua/0/7/1571.html', '/manhua/0/7/1573.html',
'/manhua/0/7/1575.html', '/manhua/0/7/1577.html', '/manhua/0/7/1579.html', '/manhua/0/7/1581.html',
'/manhua/0/7/1583.html', '/manhua/0/7/1585.html', '/manhua/0/7/1587.html', '/manhua/0/7/1589.html',
'/manhua/0/7/1591.html', '/manhua/0/7/1593.html', '/manhua/0/7/1595.html', '/manhua/0/7/1597.html',
'/manhua/0/7/1599.html', '/manhua/0/7/1601.html', '/manhua/0/7/1603.html', '/manhua/0/7/1605.html',
'/manhua/0/7/1607.html', '/manhua/0/7/1609.html', '/manhua/0/7/1611.html', '/manhua/0/7/1613.html',
'/manhua/0/7/1615.html', '/manhua/0/7/1617.html', '/manhua/0/7/1687.html', '/manhua/0/7/1689.html',
'/manhua/0/7/1691.html', '/manhua/0/7/1693.html', '/manhua/0/7/1695.html', '/manhua/0/7/1697.html',
'/manhua/0/7/1699.html', '/manhua/0/7/1701.html', '/manhua/0/7/1703.html', '/manhua/0/7/1705.html',
'/manhua/0/7/1707.html', '/manhua/0/7/1709.html', '/manhua/0/7/1711.html', '/manhua/0/7/1713.html',
'/manhua/0/7/1715.html', '/manhua/0/7/1717.html', '/manhua/0/7/1719.html', '/manhua/0/7/1721.html',
'/manhua/0/7/1723.html', '/manhua/0/7/1725.html', '/manhua/0/7/1727.html', '/manhua/0/7/1729.html',
'/manhua/0/7/1731.html', '/manhua/0/7/1733.html', '/manhua/0/7/1735.html', '/manhua/0/7/1737.html',
'/manhua/0/7/1739.html', '/manhua/0/7/1741.html', '/manhua/0/7/1743.html', '/manhua/0/7/1745.html',
'/manhua/0/7/1747.html', '/manhua/0/7/1749.html', '/manhua/0/7/1751.html', '/manhua/0/7/1753.html',
'/manhua/0/7/1755.html', '/manhua/0/7/1757.html', '/manhua/0/7/1759.html', '/manhua/0/7/1761.html',
'/manhua/0/7/2029.html', '/manhua/0/7/2031.html', '/manhua/0/7/14597.html', '/manhua/0/7/30547.html',
'/manhua/0/7/34253.html', '/manhua/0/7/39757.html', '/manhua/0/7/42417.html', '/manhua/0/7/50723.html',
'/manhua/0/7/52753.html', '/manhua/0/7/57479.html', '/manhua/0/7/58195.html', '/manhua/0/7/62525.html',
'/manhua/0/7/97513.html', '/manhua/0/7/97515.html', '/manhua/0/7/101085.html', '/manhua/0/7/114537.html',
'/manhua/0/7/115757.html', '/manhua/0/7/115759.html', '/manhua/0/7/153413.html', '/manhua/0/7/153415.html',
'/manhua/0/7/153417.html', '/manhua/0/7/153419.html', '/manhua/0/7/153421.html', '/manhua/0/7/153423.html',
'/manhua/0/7/153425.html', '/manhua/0/7/153427.html', '/manhua/0/7/153429.html', '/manhua/0/7/153431.html',
'/manhua/0/7/153433.html', '/manhua/0/7/153435.html', '/manhua/0/7/153437.html', '/manhua/0/7/156243.html',
'/manhua/0/7/157147.html', '/manhua/0/7/166907.html', '/manhua/0/7/173679.html', '/manhua/0/7/174205.html',
'/manhua/0/7/179245.html', '/manhua/0/7/182009.html', '/manhua/0/7/185369.html', '/manhua/0/7/186057.html',
'/manhua/0/7/196033.html', '/manhua/0/7/196035.html', '/manhua/0/7/240687.html', '/manhua/0/7/240689.html',
'/manhua/0/7/240691.html', '/manhua/0/7/240693.html', '/manhua/0/7/240695.html', '/manhua/0/7/240697.html',
'/manhua/0/7/240699.html', '/manhua/0/7/240701.html', '/manhua/0/7/240703.html', '/manhua/0/7/240705.html',
'/manhua/0/7/240707.html', '/manhua/0/7/240709.html', '/manhua/0/7/240711.html', '/manhua/0/7/240713.html',
'/manhua/0/7/240715.html', '/manhua/0/7/240717.html', '/manhua/0/7/240719.html', '/manhua/0/7/240721.html',
'/manhua/0/7/240723.html', '/manhua/0/7/240725.html', '/manhua/0/7/240727.html', '/manhua/0/7/240729.html',
'/manhua/0/7/240731.html', '/manhua/0/7/240733.html', '/manhua/0/7/524833.html', '/manhua/0/7/1121855.html',
'/manhua/0/7/1121857.html', '/manhua/0/7/1121859.html', '/manhua/0/7/1121861.html', '/manhua/0/7/1121863.html',
'/manhua/0/7/1121865.html', '/manhua/0/7/1121867.html', '/manhua/0/7/1121869.html', '/manhua/0/7/1121871.html',
'/manhua/0/7/1121873.html', '/manhua/0/7/1121875.html', '/manhua/0/7/1121877.html', '/manhua/0/7/1121879.html',
'/manhua/0/7/1121881.html', '/manhua/0/7/1121883.html', '/manhua/0/7/1121885.html', '/manhua/0/7/1121887.html',
'/manhua/0/7/1121889.html', '/manhua/0/7/1121891.html', '/manhua/0/7/1121893.html', '/manhua/0/7/1121895.html',
'/manhua/0/7/1121897.html', '/manhua/0/7/1121899.html', '/manhua/0/7/1121901.html', '/manhua/0/7/1121903.html',
'/manhua/0/7/1121905.html', '/manhua/0/7/1121907.html', '/manhua/0/7/1121909.html', '/manhua/0/7/1121911.html',
'/manhua/0/7/1121913.html', '/manhua/0/7/1121915.html', '/manhua/0/7/1121917.html', '/manhua/0/7/1121919.html',
'/manhua/0/7/1121921.html', '/manhua/0/7/1121923.html', '/manhua/0/7/1121925.html', '/manhua/0/7/1121927.html',
'/manhua/0/7/1121929.html', '/manhua/0/7/1121931.html', '/manhua/0/7/1121933.html', '/manhua/0/7/1121935.html',
'/manhua/0/7/1121937.html', '/manhua/0/7/1121939.html', '/manhua/0/7/1121941.html', '/manhua/0/7/1121943.html',
'/manhua/0/7/1121945.html', '/manhua/0/7/1121947.html', '/manhua/0/7/1121949.html', '/manhua/0/7/1121951.html',
'/manhua/0/7/1121953.html', '/manhua/0/7/1121955.html', '/manhua/0/7/1121957.html', '/manhua/0/7/1121959.html',
'/manhua/0/7/1121961.html', '/manhua/0/7/1121963.html', '/manhua/0/7/1121965.html', '/manhua/0/7/1121967.html',
'/manhua/0/7/1121969.html', '/manhua/0/7/1121971.html', '/manhua/0/7/1121973.html', '/manhua/0/7/1121975.html',
'/manhua/0/7/1121977.html', '/manhua/0/7/1121979.html', '/manhua/0/7/1121981.html', '/manhua/0/7/1121983.html',
'/manhua/0/7/1121985.html', '/manhua/0/7/1121987.html', '/manhua/0/7/1121989.html', '/manhua/0/7/1121991.html',
'/manhua/0/7/1121993.html', '/manhua/0/7/1121995.html', '/manhua/0/7/1121997.html', '/manhua/0/7/1121999.html',
'/manhua/0/7/1122001.html', '/manhua/0/7/1122003.html', '/manhua/0/7/1122005.html', '/manhua/0/7/1122007.html',
'/manhua/0/7/1122009.html', '/manhua/0/7/1122011.html', '/manhua/0/7/1122013.html', '/manhua/0/7/1122015.html',
'/manhua/0/7/1122017.html', '/manhua/0/7/1122019.html', '/manhua/0/7/1122021.html', '/manhua/0/7/1122023.html',
'/manhua/0/7/1122025.html', '/manhua/0/7/1122027.html', '/manhua/0/7/1122029.html', '/manhua/0/7/1122031.html',
'/manhua/0/7/1122033.html', '/manhua/0/7/1122035.html', '/manhua/0/7/1122037.html', '/manhua/0/7/1122039.html',
'/manhua/0/7/1122041.html', '/manhua/0/7/1122043.html', '/manhua/0/7/1122045.html', '/manhua/0/7/1122047.html']
# 章节照片按 ch/ch序号_html序号/xxx.jpg eg(第一章对应:/manhua/0/7/209.html 则地址为 ch/ch1_209/xxx.jpg)
# 生成封面pdf
def generateFmPdf(ch):
from reportlab.pdfgen import canvas
# 创建一个空白PDF文档
pdf = canvas.Canvas("ch%s.pdf" % ch)
# 设置字体和字号
pdf.setFont("Helvetica-Bold", 16)
# 在PDF文档中写入文本
pdf.drawString(100, 750, "Ch" + str(ch))
# 保存PDF文档
pdf.save()
# 合并pdf
def mergePdf(i, pdf_list):
print(str(i), pdf_list[0], pdf_list[-1])
# 将所有 PDF 合并成一个文件
merger = PdfMerger()
for file_path in pdf_list:
print(file_path)
merger.append(str(file_path))
merger.write("cqythll_output%s.pdf" % i)
path_dir = 'D:/study/python-scripts/p20231031/'
pdf_list = []
for i, img_dir in enumerate(alist):
print(img_dir)
path = 'ch/ch%s_%s' % (str(i + 1), img_dir.replace('.html', '').split('/')[-1])
imagePaths = list(paths.list_images(path))
imagePaths = [path_dir + i.replace('\\', '/') for i in imagePaths]
# 生成封面(包含章节的Ch1 pdf)
generateFmPdf(str(i + 1))
pdf_list.append('%sch%s.pdf' % (path_dir, str(i + 1)))
print(imagePaths)
if (len(imagePaths) == 0): continue
img_not_exists = ['D:/p20231031/ch/ch84_1253/168468.jpg',
'D:/p20231031/ch/ch127_1339/168809.jpg',
'D:/p20231031/ch/ch154_1393/169008.jpg',
'D:/p20231031/ch/ch159_1403/169049.jpg',
'D:/p20231031/ch/ch174_1433/169173.jpg',
'D:/p20231031/ch/ch177_1439/169195.jpg',
'D:/p20231031/ch/ch177_1439/169196.jpg',
'D:/p20231031/ch/ch177_1439/169197.jpg',
'D:/p20231031/ch/ch179_1443/169198.jpg',
'D:/p20231031/ch/ch182_1449/169230.jpg',
'D:/p20231031/ch/ch183_1451/169231.jpg',
'D:/p20231031/ch/ch183_1451/169232.jpg',
'D:/p20231031/ch/ch270_1693/169935.jpg',
'D:/p20231031/ch/ch183_1451/169232.jpg',
'D:/p20231031/ch/ch270_1693/169935.jpg',
'D:/p20231031/ch/ch331_153429/1159634.jpg',
'D:/p20231031/ch/ch363_240719/1881599.jpg']
for img_aa in img_not_exists:
if (imagePaths.__contains__(img_aa)):
imagePaths.remove(img_aa)
if (len(imagePaths) == 0): continue
# 生成正文pdf
zw_name = "cqythll%s.pdf" % str(i + 1)
with open(zw_name, "ab") as f:
pdf_list.append('%s%s' % (path_dir, zw_name))
f.write(img2pdf.convert(imagePaths))
f.close()
print(path, 'finish....')
with open('allPdf.txt', "w") as f:
f.write(','.join(pdf_list))
print(len(pdf_list))
mergePdf('all', pdf_list)
## 微读不支持导入>50M的txt以及 >300M的其他文件,那就大概计算下拆分成多个文件
# 我的文件600duoMB,所以拆3个就行
num = 3
div = len(pdf_list) // num
for zz in range(1, 4):
print(str(zz), str((zz - 1) * div), str(len(pdf_list) if zz == num else zz * div))
# 合并所有的pdf文件
mergePdf(zz, pdf_list[(zz - 1) * div: len(pdf_list) if zz == num else zz * div])