使用Python,Xpath获取所有的漫画章节路径,并下载漫画图片生成单个/多个pdf,并进行pdf合并

news2024/11/19 8:22:59

使用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合并

  1. 从主页,获取所有章节以及每个章节的链接(chapter.txt是所有的章节链接)
  2. 发现每个章节都是图片组成的漫画,获取每章包含的图片并进行下载
  3. 过滤没有下载到的error图片(error.txt包含所有未成功下载的图片)
  4. 根据多图片生成封面、正文pdf
  5. 多个pdf按顺序合并

1 效果图

获取所有章节,每一章节及对应图片:
在这里插入图片描述
章节封面+章节漫画图合并成一个pdf效果图如下:

在这里插入图片描述

章节封面+章节漫画图合并成多个pdf效果图如下:
在这里插入图片描述

2 原理

2.1 pa_mh.py获取喜欢的漫画及所有章节

  1. 从主页,获取所有章节以及每个章节的链接(chapter.txt是所有的章节链接)
  2. 发现每个章节都是图片组成的漫画,获取每章包含的图片并进行下载
  3. 过滤没有下载到的error图片(error.txt包含所有未成功下载的图片)
  4. 根据多图片生成pdf

2.2 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 )

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])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1095194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOV7量化第一步: 准备模型

1. 准备模型 手动/自动插入QDQ节点 1.1 准备容器 准备容器的时候有可能出现共享内存的问题, 这里在启动容器的时候设置一下, # 增加了里面的共享内存 docker run --gpus all -it --shm-size64g --name env_pyt_1.12 -v $(pwd):/app nvcr.io/nvidia/pytorch:22.03-py3 美式的…

浏览器本地存储之Cookie和webStorage

浏览器本地存储主要包括 Cookie 和 Web Storage 两种机制。它们都是用来在客户端存储数据&#xff0c;以便在浏览器会话之间保持信息或在同一会话中的页面之间共享信息。 一、Cookie 1.1 概念 cookie是客户端与服务器端进行会话使用的一个能够在浏览器本地化存储的技术。简言…

【Hyper-V】Windows的Hyper-V管理器创建的虚拟机上怎么复制粘贴文件

在hyper-V 管理器中创建的虚拟机里面&#xff0c;发现它是不能直接复制粘贴文件的&#xff0c;那只能粘贴纯文本内容&#xff0c;也就是模拟输入内容&#xff0c;这是虚拟系统是被隔离的&#xff0c;也带来不便之处&#xff0c;要怎么解决这个限制呢。 例如&#xff0c;打开一…

Frame Buffer设备驱动 (ili9488 3.5寸tft屏)

Frame Buffer设备驱动 Frame Buffer设备ili9488介绍驱动编写代码编写ili9488.c设备树修改测试ili9488代码分析 LCD资料下载 Frame Buffer设备 在早期的输出显示设备中&#xff0c;大部分为CRT显示器&#xff0c;随着技术的不断发展&#xff0c;现在大部分使用的是液晶显示器。这…

RabbitMQ死信队列原理与项目代码示例

1、产生死信消息的原因 当在消费消息时&#xff0c;如果队列里的消息出现以下情况&#xff0c;那么该消息将成为一条死信消息&#xff1a; 当一条消息被使用 channel.basicNack方法 或 channel.basicReject方法所nack响应 &#xff0c;并且此时requeue 属性被设置为false。 消…

使用Elasticsearch来进行简单的DDL搜索数据

说明&#xff1a;Elasticsearch提供了多种多样的搜索方式来满足不同使用场景的需求&#xff0c;我们可以使用Elasticsearch来进行各种复制的查询&#xff0c;进行数据的检索。 1.1 精准查询 用来查询索引中某个类型为keyword的文本字段&#xff0c;类似于SQL的“”查询。 创…

Python学习基础笔记六十七——格式化字符串

Printf-Style String Formatting: Printf风格字符串格式化 salary input(请输入薪资&#xff1a;)# 计算出缴税额&#xff0c;存入变量tax tax int(salary) *25/100 # 转化为字符串&#xff0c;方便下面的字符串拼接 taxStr str(tax) # 计算出税后工资&#xff0c;存入变…

Linux基础—1

1、命令行 1) 重要快捷键 按键作用Tab命令补全Ctrl强行终止当前程序Ctrld键盘输入结束或退出终端Ctrls暂停当前程序&#xff0c;暂停后按下任意键恢复运行Ctrlz将当前程序放到后台运行&#xff0c;恢复到前台为命令fgCtrla将光标移至输入行头&#xff0c;相当于Home键Ctrle将…

计算机操作系统-第六天

目录 1、操作系统的体系结构&#xff08;简要了解&#xff09; 操作系统的内核&#xff1a; 操作系统的体系结构 关于微内核的相关理解&#xff1a; 本节思维导图&#xff1a; 1、操作系统的体系结构&#xff08;简要了解&#xff09; 操作系统的内核&#xff1a; 内核是…

整理总结提高抖音小店商品转化率的五大策略

要提高抖音小店的商品转化率&#xff0c;即将浏览者转化为实际购买者&#xff0c;四川不若与众整理了需要注意的以下几个关键因素。 首先&#xff0c;优化商品页面设计。商品页面是消费者获取产品信息和决策的关键环节。商家应确保商品页面简洁清晰&#xff0c;配备高质量的产品…

Pytest+Allure生成可添加附件的测试报告

#测试套件层级 allure.feature("测试PecExplorer") #重试次数&#xff0c;粒度为用例&#xff0c;建议用例设计可重复性高 pytest.mark.flaky(reruns3) class TestPecExplorer:#功能模块层级allure.story("登录界面")#测试用例层级allure.title("Test…

C语言程序设计 三四节课堂笔记

C语言程序设计 三四节课堂笔记 C语言程序设计 三四节课堂笔记3.0 程序编写顺序&#xff08;了解&#xff09;3.1 C语言的特点3.2 认识C程序1. C程序的基本框架2. C语言程序的结构特点3. C程序的开发过程 C语言程序设计 第四节课4.1 开发环境dev-C的使用1. 如何将英文界面调整为…

Spring-Java

Spring&#xff1a; 图片出处&#xff1a;b站黑马 ssm学习截图 是一个大家族 &#xff0c;是一套完整的开发生态圈。可以利用这个spring全家桶快速构建企业级开发环境。 Spring Freamwork 是其他框架的基础 Springbot 使用了注解开发 SpringCloud 分布式 云服务 Sprin…

Leetcode—88.合并两个有序数组【简单】

2023每日刷题&#xff08;一&#xff09; Leetcode—88.合并两个有序数组 题解 因为这两个数组已经排好序&#xff0c;我们可以把两个指针分别放在两个数组的末尾&#xff0c;即 nums1 的m − 1 位和 nums2 的 n − 1 位。每次将较大的那个数字复制到 nums1 的后边&#xff0…

计算机操作系统面试题自用

什么是操作系统&#xff1a; 操作系统是管理硬件和软件的一种应用程序。操作系统是运行在计算机上最重要的一种软件 操作系统的主要功能 解释一下操作系统的主要目的是什么 操作系统是一种软件&#xff0c;它的主要目的有三种 1 管理计算机资源&#xff0c;这些资源包括 C…

LangChain结合milvus向量数据库以及GPT3.5结合做知识库问答之一 --->milvus的docker compose安装

https://github.com/milvus-io/milvus/releaseshttps://github.com/milvus-io/milvus/releases 以下步骤均在Linux环境中进行&#xff1a; 将milvus-standalone-docker-compose.yml下载到本地。 1、新建一个目录milvus 2、将milvus-standalone-docker-compose.yml放到milvu…

UWB承启定位基站

UWB承启定位基站 随着我们使用UWB做超高精度的定位项目越来越多&#xff0c;我们发现之前的定位基站完全站在二维或三维的角度去设计还是存在对应的缺陷&#xff0c;这个时候需要在很短的距离内安装多一个基站&#xff0c;对于用户来说&#xff0c;会觉得设备变多了&#xff0…

05在IDEA中配置Maven的基本信息

配置Maven信息 配置Maven家目录 每次创建Project工程后都需要设置Maven家目录位置&#xff0c;否则IDEA将使用内置的Maven核心程序和使用默认的本地仓库位置 一般我们配置了Maven家目录后IDEA就会自动识别到conf/settings.xml配置文件和配置文件指定的本地仓库位置创建新的P…

Java中的栈(Stack)为什么要采用先进后出

Java虚拟机栈 Java虚拟机栈是描述Java方法运行过程的内存模型。 当一个方法即将被运行时&#xff0c;Java虚拟机栈首先会在Java虚拟机栈中为该方法创建一块“栈帧”&#xff0c;栈帧中包含局部变量表(基本数据类型变量、引用类型的变量、returnAddress类型的变量)、操作数栈、…

小谈设计模式(29)—访问者模式

小谈设计模式&#xff08;29&#xff09;—访问者模式 专栏介绍专栏地址专栏介绍 访问者模式角色分析访问者被访问者 优缺点分析优点将数据结构与算法分离增加新的操作很容易增加新的数据结构很困难4 缺点增加新的数据结构比较困难增加新的操作会导致访问者类的数量增加34 总结…