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



当我运行我的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建议的解决方案:

蟒蛇 code.py 12,3434,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打印出完整的电子书(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

我也一直看起来很疯狂,找到了复杂的 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 脚本,任何键都是有效的): 我的配置:热键设置
  3. 配置"捕获后任务" 我的配置:捕获后任务
  4. 安装
  5. VitalSource 书架:在 Windows 10 上安装 Bookshelf
  6. 使用VitalSource书架打开您的书,并在"视图"菜单中禁用所有面板,以使图像尽可能大。将其配置为仅显示一页。
  7. 选择一个页面并点击空格键,每次点击它都应该转到下一页。
  8. 安装自动依赖项

点子安装自动 8.确保你的书打开并且第一页可见。 9.手动执行第一个屏幕截图。尝试使用 ShareX 提供的放大镜完美调整区域。对屏幕截图感到满意后,将其删除(以避免重复)。 10. 运行以下python 脚本并快速切换到 VitalSource 书架应用程序(使用 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打印到 PDF,瞧,您的书是没有水印的 pdf!

最新更新