使用 Python 提取 13 中 office 文件内嵌图片,预算 2-3k

2023-06-05 16:01:14 +08:00
 albertofwb

vx: do-you-enjoy-coding

项目地址: https://github.com/albertofwb/embed_files

合作方式:fork 后在自己的 repo 开发,然后我会将项目改为 private 需要你将自己的项目也改为 private 然后给我读写权限

报价: 2000-3000 工期: 7 天

请合理评估本项目难度,总共 13 种文件类型,如能力有限,只能提供部分格式的支持,按照百分比支付佣金

852 次点击
所在节点    外包
10 条回复
dream10201
2023-06-05 16:28:08 +08:00
前两天才写了个从 excel 中提取 pdf
albertofwb
2023-06-05 16:33:59 +08:00
@dream10201 要不要试试
dream10201
2023-06-05 17:10:39 +08:00
@albertofwb 不用了,兴趣不大,谢谢!
nolog
2023-06-05 17:15:53 +08:00
为什么会有依赖大小限制?
albertofwb
2023-06-05 17:37:34 +08:00
@nolog 这只是本体软件一个很小的部分,太大的话,影响总体加载速度
Alias4ck
2023-06-05 20:57:56 +08:00
纯属好奇, 看了一下 OLE 格式 从中二进制流数据解析图片出来挺麻烦的

虽然市面上有几种库,但是基本没这个功能,大部分是打包 zip,去找后缀名,这种方式对 ppt 可以,word 这种就不生效了( https://github.com/surajForDD/AttachmentsExtractor/)

也有用 C 写( https://github.com/inflex/ripOLE)的,但是他做的也不完整只写了 png signature 的
其他类型的没有

python 也有相关的,但库很久没人维护了 https://github.com/decalage2/oletools
解析图片也有人提过相关的 issue( https://github.com/decalage2/oletools/issues/457)

总的来说,流程应该挺复杂,而且你给的文件格式有的不是 Composite Document File V2 Document.
Alias4ck
2023-06-06 01:25:28 +08:00
简单的写了个 demo,应该可以
albertofwb
2023-06-06 09:01:45 +08:00
oletools 这个我在 python 里用过,效果不理想。
你截图中的成功我使用 re 匹配 signature 也能做到
```python
def fetch_img_regex(buf: bytes):
# ref https://chujian521.github.io/blog/2018/07/31/%E5%B8%B8%E8%A7%81%E5%9B%BE%E7%89%87%E6%A0%BC%E5%BC%8F%E5%88%86%E6%9E%90%E6%80%BB%E7%BB%93/
pattern_map = {
b'\xff\xd8\xff\xe0.*\xff\xd9': 'jpg',
b'\x89\x50\x4e\x47\x0D\x0A\x1A\x0A.*\x00\x00\x00\x00\x49\x45\x4E\x44....': 'png'
}
# FIXME: the re pattern can only find one matched items
# then there has more than one images it merge them into single one and the file can not being parsed
for pattern, suffix in pattern_map.items():
data = re.findall(pattern, buf, re.DOTALL)
if len(data) > 0:
return data, suffix
raise NoImgContainedException()
```
https://imgur.com/a/QX51prW

@Alias4ck
Alias4ck
2023-06-06 09:16:48 +08:00
@albertofwb 基本原理应该就是这样从 binary stream 里面匹配 signature 了,大差不差,用 re 去匹配只是其中实现的一种方式, 如果觉得 python olefile 库写的不好,用 rust/c 实现吧 毕竟 ole file 结构摆在那里了

🫤随便做了个 research
https://gist.github.com/noahlias/9c90aab66e322977b4a02fa17cb6a809
albertofwb
2023-06-26 15:42:43 +08:00
该外包已经完成

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/945970

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX