下载「下载受限的飞书PDF文档」,通解3种不同资源类型的飞书域名
*本文提及的“应用及影刀代码生成专家提示词”获取规则和方式放到文末了,自取~
直接进入本期分享主题!

目前知道的"飞书PDF文档"主要有3种资源类型,其对应的域名地址格式如下:
飞书文件(file附件):https://*.feishu.cn/file/*
飞书文档(Word类型):https://*.feishu.cn/docx/*
飞书知识库(Wiki页面):https://*.feishu.cn/wiki/*
这3种类型的PDF文件都可以用今天分享的思路提取到,提取思路也同样适用于PPT文件。

开发这个应用,一开始是为了提取“飞书文件(file附件)”类型的PDF文件,看了下开发者模式中元素面板下的html代码,发现属于懒加载页面,
页面图片地址格式虽说不是常规的https,也不是blob格式,而是base64加密过的,但是好在获取的图片是高清的,使用“懒加载页面的常规处理方式”就能解决。

我使用“数据量长度固定”和“数据量长度不固定”两种方式都完美实现了。随后又想起平时遇到的其他2种资源类型,索性就一起看看
结果发现这两种资源类型所在页面获取到的图片地址,打开都是模糊缩略图,根本不适用于之前的方案,出于通用性考虑,只能另想它法了~

后面盯着页面屏幕反应过来,这些页面底部都有个"演示模式"啊!在这个模式下,不管什么页面,都是高清的!那我直接配合“网页截图”指令就可以获取到!

按这个思路,我跑通了下面这个成品应用,从获取单个页面截图到最终合并成 PDF,每一步都清晰明了:
获取已打开网页,自动识别到不同资源类型飞书PDF文档
自动获取文档标题,创建同名本地文件夹;
获取PDF最大页数,来确定后续翻页次数;
定位演示模式按钮并进入该模式;
For循环:鼠标翻页逐个截图,并保存到本地文件夹中
最后所有图片自动合并成完整PDF
下面来看更具体的应用案例介绍~
一、应用/功能介绍
这个应用主要就是帮你把下载受限的飞书 PDF 文档搞下来,而且是高清的。不管是纯 PDF 文件还是内嵌于飞书文档中的 PDF,都能搞定。
目前支持的具体功能点:
支持自动判断传入的文档资源类型,并采用对应Xpath表达式
支持自动获取文档标题,移除非法字符,创建本地同名文件夹
支持智能识别PDF总页数,精准控制翻页
基于飞书演示模式获取高清图片,支持按页面出现顺序命名
支持按图片命名作为排序依据,将图片合并为完整PDF文件
二、效果视频演示
下面是应用实际运行演示(所用案例一共31个页面,运行耗时约2分钟)
上方演示视频中飞书PDF文档案例的最终文件,高清大图,且没有任何缺失

三、全流程指令代码
1. 主流程/流程参数配置


2. Python模块包
这次代码生成也是用到了上篇分享提到的"影刀RPA代码生成专家提示词",简单跟着AI的引导明确需求,一次就跑通了,爽!!


⚠️这里代码会提示你安装pillow这个图像处理库,但是你去安装时会发现,界面虽然显示安装成功但是你在"模块管理"窗口下是看不到的,

这是因为在影刀RPA中已经预装了这个库,不需要额外安装即可使用(“魔法指令告诉我的😃”)

3. Python代码
(1)clean_feishu_title_illegal_chars.py
import re
from xbot import print
def combined_feishu_title_cleaner(original_title: str) -> str:
"""
清理飞书标题中的非法字符和空格,确保标题符合飞书文档命名规范。
Args:
original_title (str): 原始标题,例如: "飞书 文档: 我的<项目>?"
Returns:
str: 清理后的标题,例如: "飞书文档我的项目"
Raises:
ValueError: 如果输入不是字符串或清理后的标题为空
"""
# 检查输入有效性
if not isinstance(original_title, str):
raise ValueError("输入的标题必须是字符串类型")
if not original_title.strip():
raise ValueError("输入的标题不能为空")
# 使用正则表达式同时移除非法字符和空格
illegal_pattern = r'[/:*?"<>|/:*?"<>|s]'
cleaned_title = re.sub(illegal_pattern, '', original_title)
# 删除 .pdf 后缀(如果存在)
if cleaned_title.lower().endswith('.pdf'):
cleaned_title = cleaned_title[:-4] # 移除最后4个字符
# 检查清理后的标题是否为空
if not cleaned_title:
raise ValueError("清理后的标题为空,请检查原始标题内容")
return cleaned_title
def main(args):
"""影刀RPA流程调用入口"""
try:
# 从流程变量获取原始标题
original_title = args.get("original_title", "")
# 执行标题清理
cleaned_title = combined_feishu_title_cleaner(original_title)
# 输出结果到流程变量
return {"cleaned_title": cleaned_title}
except Exception as e:
print(f"标题清理失败: {str(e)}")
return {"error": str(e)}
(2)merge_images_to_pdf.py
# 使用此指令前,请确保安装必要的Python库:
# pip install Pillow
from PIL import Image
import os
import re
from typing import *
try:
from xbot.app.logging import trace as print
except:
from xbot import print
def merge_images_to_pdf(folder_path: str, output_pdf_path: str) -> bool:
"""
title: 图片合并为PDF
description: 将指定文件夹中的所有图片按文件名数字顺序合并成一个PDF文件,每张图片占一页
inputs:
- folder_path (str): 包含图片的文件夹路径,eg: "C:/images"
- output_pdf_path (str): 输出PDF文件的保存路径,eg: "C:/output.pdf"
outputs:
- success (bool): 处理成功返回True,失败返回False,eg: True
"""
# 1. 定义支持的图片格式
supported_formats = {'.jpg', '.jpeg', '.png', '.webp'}
# 2. 获取文件夹中所有图片文件
image_files = []
for filename in os.listdir(folder_path):
file_ext = os.path.splitext(filename)[1].lower()
if file_ext in supported_formats:
image_files.append(filename)
# 3. 按文件名中的数字进行排序
def extract_number(filename):
numbers = re.findall(r'd+', filename)
return int(numbers[0]) if numbers else 0
image_files.sort(key=extract_number)
# 4. 如果没有找到图片文件,返回False
if not image_files:
print("文件夹中没有找到支持的图片文件")
return False
# 5. 打开所有图片并转换为RGB格式
images = []
for filename in image_files:
file_path = os.path.join(folder_path, filename)
try:
img = Image.open(file_path)
# 转换为RGB格式(PDF需要RGB格式)
if img.mode != 'RGB':
img = img.convert('RGB')
images.append(img)
print(f"已加载图片: {filename}")
except Exception as e:
print(f"无法打开图片 {filename}: {e}")
continue
# 6. 将图片保存为PDF文件
if images:
try:
# 第一张图片作为主图片,其余作为附加页面
images[0].save(
output_pdf_path,
format='PDF',
save_all=True,
append_images=images[1:] if len(images) > 1 else []
)
print(f"PDF文件已成功保存到: {output_pdf_path}")
print(f"共处理了 {len(images)} 张图片")
return True
except Exception as e:
print(f"保存PDF文件时出错: {e}")
return False
else:
print("没有成功加载任何图片")
return False
四、如何获取应用
1. 使用须知
(1)你的飞书账号至少应拥有对该PDF文档的"基础访问阅读"权限;
(2)该应用基于影刀RPA开发,请确保电脑端已正确下载影刀RPA应用并登录账号;
*作者实测使用的是Win 11系统
*影刀RPA官网:https://www.yingdao.com/product/
(3)该应用为基于Edge浏览器开发的网页自动化应用,在正式运行应用前,请先确保Edge浏览器打开该飞书网页,并且定位到第1页的位置(*默认第1页);

2. 获取应用
3. 开始运行
(1)找到刚获取的应用,点击"运行";
(2)在弹出的对话框中输入飞书文档链接,回车或点击"确定" ;
(3)静默等待程序运行完成,中途不要干预;
(4)在飞书PDF文档标题同名的桌面文件夹查看所有图片文件及合并后的PDF文档;

以上。对该应用有任何疑问的铁铁,可以评论区留言交流哈,我们下期分享见~
-END-
爱练字的96年ISTJ型互联网人/信息整合怪/工具人/影刀高级认证工程师。
专注分享:RPA&AI自动化场景提效方案、效率软件安利、实用技能。"所有的生产要素都可以被构建,只有认知是壁垒",欢迎関注 @掌心向暖
推荐阅读:
掌心向暖:影刀RPA | Win端没有"上传文件"指令? 多少有点离谱了刀刀
那些拥有上千浏览器书签/收藏夹的电脑用户,是怎么管理书签的?
不会编程的我开发了一款近900行指令的自动化RPA应用,完美解决98%以上复制受限的飞书文档!!
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
