首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引发RuntimeError('FPDF错误:'+msg) RuntimeError: FPDF错误:不支持的图像类型: chapter_1_romance_dawn

引发RuntimeError('FPDF错误:'+msg) RuntimeError: FPDF错误:不支持的图像类型: chapter_1_romance_dawn
EN

Stack Overflow用户
提问于 2018-11-02 10:36:17
回答 1查看 1.3K关注 0票数 1

好的,所以我正在做一个漫画(日本漫画)下载器。日本漫画在线提供,但你只能阅读,如果你想下载,你必须开始保存图片文件,右击blah之类的.

因此,我正在工作的另一个漫画下载器,将下载所有章节的漫画指定,然后转换成pdf。

我已经完成了下载图像的代码和它的工作相当好,但问题是在pdf-转换部分。

这是我的密码

代码语言:javascript
复制
import requests
import urllib
import glob
from bs4 import BeautifulSoup
import os
from fpdf import FPDF

def download_image(url, path):
    r = requests.get(url, stream=True)
    if r.status_code == 200:
        with open(path, 'wb') as f:
            for chunk in r:
                f.write(chunk)


start_chapter = int(input("Enter Starting Chapter: "))
end_chapter = int(input("Enter Ending Chapter: "))

chapters = range(start_chapter, end_chapter + 1)
chapter_list = []

for chapter in chapters:
    chapter_list.append("https://manganelo.com/chapter/read_one_piece_manga_online_free4/chapter_" + str(chapter))

for URL in chapter_list:
    r = requests.get(URL)

    soup = BeautifulSoup(r.text, 'html.parser')
    images = soup.findAll('img')
    for i in images:
        url = i.attrs["src"]
        os.makedirs(url.split('/')[-2], exist_ok=True)
        download_image(url, os.path.join(url.split('/')[-2], url.split('/')[-1]))

pdf = FPDF()
imageList = glob.glob("*")
for image in imageList:
    pdf.add_page()
    pdf.image(image, 10, 10, 200, 300)
pdf.output("One Piece Chapter", "F")

因此,对于如何修复此错误,有任何建议:

代码语言:javascript
复制
raise RuntimeError('FPDF error: '+msg) RuntimeError: FPDF error: Unsupported image type: chapter_1_romance_dawn
EN

回答 1

Stack Overflow用户

发布于 2018-11-02 12:28:45

首先,这是一个非常好的主意。

错误将发生,因为图像列表路径是错误的。

您正在将jpgs存储在文件夹中(章节名)。

所有你必须做的就是给出正确的路径到FPDF。

我创建了一个集合以避免重复。然后我删除了“图像”和“图标”文件夹->,也许你会使用它们?

代码语言:javascript
复制
cchapter = set()
for URL in chapter_list:
    r = requests.get(URL)

    soup = BeautifulSoup(r.text, 'html.parser')
    images = soup.findAll('img')

    for i in images:
        url = i.attrs["src"]
        cchapter.add(url.split('/')[-2])
        os.makedirs(url.split('/')[-2], exist_ok=True)
        download_image(url, os.path.join(url.split('/')[-2], url.split('/')[-1]))

cchapter.remove('images')
cchapter.remove('icons')
chapterlist = list(cchapter)
print(chapterlist[0])

def sortKeyFunc(s):
    return int(os.path.basename(s)[:-4])

for chap in chapterlist:
    pdf = FPDF()
    imageList = glob.glob(chap + "/*.jpg")
    imageList.sort(key=sortKeyFunc)
    for image in imageList:
        pdf.add_page()
        pdf.image(image, 10, 10, 200, 300)
    pdf.output(chap + ".pdf", "F")

最后,我添加了一个循环为每个文件夹创建一个pdf ..。

然后将PDF命名为章节名称..。

你也错过了你的分机(“.pdf”).

这会管用的。:)

编辑:

glob.glob将以不正确的顺序返回文件列表。

参考资料:here

它可能根本没有排序,并且使用文件系统中条目的出现顺序,即在使用ls -U时得到的条目。(至少在我的机器上,这会产生与列表glob匹配相同的顺序)。

因此,您可以使用文件名(在我们的例子中作为一个数字)作为一个排序键。

代码语言:javascript
复制
def sortKeyFunc(s):
    return int(os.path.basename(s)[:-4])

然后在循环中添加imageList.sort(key=sortKeyFunc)

注意:代码更新了.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53116930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档