使用Python,Xpath获取所有的漫画章节路径,并下载漫画图片生成单个/多个pdf,并进行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])

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛一枚~

您的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值