使用 Python 提取 13 中 office 文件内嵌图片,预算 2-3k - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
albertofwb
V2EX    外包

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

  •  
  •   albertofwb 2023-06-05 16:01:14 +08:00 989 次点击
    这是一个创建于 949 天前的主题,其中的信息可能已经有所发展或是发生改变。

    vx: do-you-enjoy-coding

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

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

    报价: 2000-3000 工期: 7 天

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

    dream10201
        1
    dream10201  
       2023-06-05 16:28:08 +08:00
    前两天才写了个从 excel 中提取 pdf
    albertofwb
        2
    albertofwb  
    OP
       2023-06-05 16:33:59 +08:00
    @dream10201 要不要试试
    dream10201
        3
    dream10201  
       2023-06-05 17:10:39 +08:00
    @albertofwb 不用了,兴趣不大,谢谢!
    nolog
        4
    nolog  
       2023-06-05 17:15:53 +08:00
    为什么会有依赖大小限制?
    albertofwb
        5
    albertofwb  
    OP
       2023-06-05 17:37:34 +08:00
    @nolog 这只是本体软件一个很小的部分,太大的话,影响总体加载速度
    Alias4ck
        6
    Alias4ck  
       2023-06-05 20:57:56 +08:00   1
    纯属好奇, 看了一下 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
        7
    Alias4ck  
       2023-06-06 01:25:28 +08:00
    简单的写了个 demo,应该可以
    albertofwb
        8
    albertofwb  
    OP
       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
        9
    Alias4ck  
       2023-06-06 09:16:48 +08:00   1
    @albertofwb 基本原理应该就是这样从 binary stream 里面匹配 signature 了,大差不差,用 re 去匹配只是其中实现的一种方式, 如果觉得 python olefile 库写的不好,用 rust/c 实现吧 毕竟 ole file 结构摆在那里了

    随便做了个 research
    https://gist.github.com/noahlias/9c90aab66e22977b4a02fa17cb6a809
    albertofwb
        10
    albertofwb  
    OP
       2023-06-26 15:42:43 +08:00
    该外包已经完成
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2690 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 12:28 PVG 20:28 LAX 04:28 JFK 07:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86