【内附PDF资料】Python实现下载图片并生产PDF文件
打开微信扫一扫,关注微信公众号【数据与算法联盟】
转载请注明出处:http://blog.****.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer
背景
2018AICon大会中的一些PPT,官方没有提供完整的PDF文件,而是一张张图片,不方便下载和后续阅读,这里使用Python爬取相关演讲的图片,并生产PDF文件
下载函数
创建下载图片函数,使用的是Python的urllib库,代码如下
# 下载图片
def save_img(img_url,file_path="./img/"):
if not os.path.exists(file_path):
print("保存图片的文件不存在,创建该目录")
os.mkdir(file_path)
# 图片后缀
file_suffix = os.path.splitext(img_url)[1]
file_name = str ( int(img_url.split("-")[1].split(".")[0]) )
# 拼接图片名(包含路径)
filename = '{}{}{}'.format(file_path,file_name,file_suffix)
# urllib
urllib.request.urlretrieve(img_url, filename=filename)
生成PDF函数
创建图片生成PDF文件的函数,使用的是Python的reportlab库,代码如下
# 生成pdf
def convert_img_to_pdf(img_path,pdf_path):
pages = 0
(w, h) = landscape(portrait(A4))
can = canvas.Canvas(pdf_path, pagesize=landscape(portrait(A4)))
# 获取img_path下文件,并进行排序
files = os.listdir(img_path)
files.sort(key=lambda x: int(x[:-4]))
# 遍历每个文件
for f_name in files:
# 拼装成完整的file路径
file_path = img_path + os.sep + str(f_name)
can.drawImage(file_path, 0, 0, w, h)
can.showPage()
pages = pages + 1
can.save()
需要注意的是,pagesize不能直接指定值portrait(A4),因为一张图片会完整的嵌套在一页A4纸张上,极其不美观,这里需要将A4的大小进行转置,pagesize=landscape(portrait(A4))
定义要生成的PDF相关信息
_list = (
{
"pdf_name": "FFM及DeepFFM模型在推荐系统的探索及实践.pdf",
"img_path": "./img_1/",
"page": 52,
"id": "3670025915"
},{
"pdf_name": "知乎推荐系统的实践及重构之路.pdf",
"img_path": "./img_2/",
"page": 38,
"id": "4291192513"
},{
"pdf_name": "深度树匹配——下一代推荐技术的探索和实践.pdf",
"img_path": "./img_3/",
"page": 33,
"id": "3621355867"
},{
"pdf_name": "基于知识的搜索推荐技术及应用.pdf",
"img_path": "./img_4/",
"page": 31,
"id": "436657700"
},{
"pdf_name": "瓜子二手车个性化推荐的挑战与应对.pdf",
"img_path": "./img_5/",
"page": 40,
"id": "1433077746"
},{
"pdf_name": "机器学习在苏宁搜索平台中的实践.pdf",
"img_path": "./img_6/",
"page": 55,
"id": "1155556309"
}
)
生成PDF
遍历要生成PDF的每个信息
for one in _list:
print(one)
for i in range(1,one["page"]+1):
img_path = one["img_path"]
pdf_path = one["pdf_name"]
if i < 10:
img_url = "https://static001.geekbang.org/con/37/pdf/" + one["id"] + "/image/page-00" + str(i) + ".jpg"
else:
img_url = "https://static001.geekbang.org/con/37/pdf/" + one["id"] + "/image/page-0" + str(i) + ".jpg"
print(img_url)
# 下载图片
save_img(img_url,img_path)
# 合成pdf
convert_img_to_pdf(img_path, pdf_path)
print("Image转PDF完成!")
最终生成的结果如下
PDF文件资料获取方式:百度网盘
链接:https://pan.baidu.com/s/1MC_bH2x5jjsP1LvBB5cZCA
提取码:58zq