如何使用Python脚本从Vitalsource电子书制作单个pdf文件

时间:2019-07-25 09:36:29

标签: python

运行python3脚本时出现错误,该脚本应该获取Vitalsource电子书页面的屏幕截图,然后将其转换为pdf文件。

我在下面尝试了建议的解决方案(@Balderman提供),但是它不起作用。但是,请注意,我是一名新手,正在学习python。 我可能已经做了一些事情。 请告知。

我的python脚本(app2.py)代码:

import argparse
import os
import tempfile

import autopy
import img2pdf


def screenshot(top_left, right_bottom, next_page, total_page):
    rect_size = (right_bottom[0] - top_left[0], right_bottom[1] - top_left[1])
    images = []
    temp_dir = tempfile.mkdtemp()
    for i in range(total_page):
        page_num = "{}".format(i).zfill(len(str(total_page)))
        file_name = os.path.join(temp_dir, 'book-page-{}.png'.format(page_num))
        images.append(file_name)

        autopy.mouse.move(*next_page)
        autopy.mouse.click(delay=1)
        autopy.bitmap.capture_screen((top_left, rect_size)).save(file_name)

    return images


def image2pdf(images):
    with open("book.pdf", "wb") as f:
        f.write(img2pdf.convert(images))


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Take book screenshots.')
    parser.add_argument('top_left', type=str)
    parser.add_argument('right_bottom', type=str)
    parser.add_argument('next_button', type=str)
    parser.add_argument('total_page', type=int)

    args = parser.parse_args()

    top_left = tuple(map(lambda x: int(x), args.top_left.split(',')))
    right_bottom = tuple(map(lambda x: int(x), args.right_bottom.split(',')))
    next_button = tuple(map(lambda x: int(x), args.next_button.split(',')))
    total_page = args.total_page

    print("Take book screenshot at {} {} and next at {} with {} pages".format(
        top_left, right_bottom, next_button, total_page
    ))

    images = screenshot(top_left, right_bottom, next_button, total_page)
    image2pdf(images)

    print("Done, book saved in book.pdf.")

@Balderman建议的解决方案:

python code.py 12,34 34,67 12,99 12

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Take screenshots.')
    parser.add_argument('top_left', type=str)
    parser.add_argument('right_bottom', type=str)
    parser.add_argument('next_button', type=str)
    parser.add_argument('total_page', type=int)

    args = parser.parse_args()
    top_left = tuple(map(lambda x: int(x), args.top_left.split(',')))
    right_bottom = tuple(map(lambda x: int(x), args.right_bottom.split(',')))
    next_button = tuple(map(lambda x: int(x), args.next_button.split(',')))
    total_page = args.total_page

    print("Take screenshot at {} {} and next at {} with {} pages".format(
        top_left, right_bottom, next_button, total_page
    ))

    print(args)

预期结果: 从Vitalsourcesafe以pdf格式打印整个电子书(1200页),以pdf格式,这一次只能打印2页。

我收到的错误消息:

usage: app2.py [-h] top_left right_bottom next_button total_page
app2.py: error: the following arguments are required: top_left, right_bottom, next_button, total_page

1 个答案:

答案 0 :(得分:0)

我也一直看起来很疯狂,发现了复杂的python脚本可以用pdf打印机打印或做屏幕截图,但是它对我不起作用,我也懒得调试它们的脚本。

我在Windows 10中做了一些简单得多的事情,希望它对您有用,或者至少可以激发您获得自己的解决方案。

法律免责声明:此解决方案的使用必须遵守VitalSource在https://support.vitalsource.com/hc/en-us/articles/204612518上规定的条款。简而言之,这意味着不得进行商业用途或发行,而只能用于个人用途。如果您决定大规模分发,则后果自负。

在以下说明中,我假设您已经安装了python 3.x,并且您知道要使用pip。

  1. 安装 ShareX 来处理屏幕截图(我们不需要重新发明轮子):https://getsharex.com/
  2. 配置它以使用快捷键F3捕获最后一个屏幕截图区域(只要其他应用程序不占用任何键,并且您修改了python脚本,任何键都是有效的): My configuration: Hotkey settigs
  3. 配置“捕获后任务” My configuration: After capture tasks
  4. 安装 VitalSource书架Install Bookshelf on Windows 10
  5. 使用VitalSource书架打开您的书,并禁用“视图”菜单中所有可以显示的图像的面板。将其配置为仅显示一页。
  6. 选择一个页面并点按空格键,每次点击都应跳到下一页。
  7. 安装自动依赖

pip install autopy 8.确保您的书已经打开并且第一页可见。 9.手动制作第一个屏幕截图。尝试使用ShareX提供的放大镜完美地调整区域。对屏幕截图满意后,请将其删除(以避免重复)。 10.运行以下 python脚本,并快速更改为VitalSource Bookshelf应用程序(使用Alt + Tab):

import autopy

if __name__ == "__main__":
    while True:
        autopy.key.tap(autopy.key.Code.F3,None,1)      
        autopy.key.tap(autopy.key.Code.SPACE,None,1)
  1. 什么都不做。您应该看到页面如何自动前进。
  2. 过一会儿,一旦看到书的最后一页,请停止脚本并检查ShareX目标文件夹中的屏幕截图。
  3. 如果需要,删除最后一页的重复屏幕截图。
  4. 选择所有图像,然后右键单击“打印”。选择 Microsoft Print to PDF (Microsoft打印为PDF),然后将您的书以pdf格式带水印!