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

时间:2018-11-02 10:36:17

标签: python python-3.x pdf urllib glob

好的,所以我正在开发漫画(日本漫画)下载器。日语漫画可以在线获取,但是您只能阅读它们,如果要下载它们,则必须通过右键单击等等来开始保存图像文件。

因此,我正在开发另一种漫画下载器,它将下载您指定的漫画的所有章节,然后将其转换为pdf。

我已经完成了下载图像的代码,并且可以很好地工作,但是问题出在pdf转换部分。

这是我的代码

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

因此,关于如何解决此错误的任何建议:

raise RuntimeError('FPDF error: '+msg) RuntimeError: FPDF error: Unsupported image type: chapter_1_romance_dawn

1 个答案:

答案 0 :(得分:0)

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

由于图像列表路径错误,将发生错误。
您正在将jpg存储在文件夹(章名)中。
您要做的只是为FPDF提供正确的路径。

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

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相同的顺序   火柴)。

因此,您可以将文件名(在本例中为数字)用作排序键。

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

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

注意:代码已更新。