увеличить RuntimeError ('Ошибка FPDF:' + msg) RuntimeError: Ошибка FPDF: Неподдерживаемый тип изображения: chapter_1_romance_dawn - PullRequest
0 голосов
/ 02 ноября 2018

Хорошо, я работаю над загрузчиком манги (японских комиксов). Японские комиксы доступны онлайн, но вы можете только прочитать их, если вы хотите загрузить их, вы должны начать сохранять файлы изображений, щелкнув правой кнопкой мыши по бла-бла-бла ...

Итак, я работал над альтернативным загрузчиком манги, который скачает все главы манги, как вы указали, а затем преобразует их в 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 голосов
/ 02 ноября 2018

Прежде всего, это очень хорошая идея.

Ошибка возникает из-за неправильного пути к списку изображений.
Вы сохраняете jpgs в папке (имя главы).
Все, что вам нужно сделать, это указать правильный путь к FPDF.

Я создал набор, чтобы избежать дублирования. Затем я удалил папку «images» и «icon» -> может быть, вы будете их использовать?

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") ...
Это будет работать :)

EDIT:

glob.glob вернет список файлов не в правильном порядке.

Ссылка: здесь

Вероятно, он вообще не сортируется и использует порядок, в котором записи появляются в файловой системе, то есть той, которую вы получаете при использовании ls -U. (В хотя бы на моей машине это выдает тот же порядок, что и глобус листинга Матчи).

Для этого вы можете использовать имя файла (в нашем случае это число) в качестве ключа сортировки.

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

затем добавьте imageList.sort(key=sortKeyFunc) в цикл.

ПРИМЕЧАНИЕ. Код обновлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...