zoukankan      html  css  js  c++  java
  • python-尝试将Excel文件保存为图片并加上水印

    python-尝试将Excel文件保存为图片并加上水印

    场景:并不是将 excel 的 chart 生成图片,而是将整个表格内容生成图片。

    1. 准备工作

    目前搜索不到已有的方法,只能自己尝试写一个,想法有两个:

    1. 通过 Python 的图片处理库PIL,将 Excel 内信息逐写到图片上;

    2. 通过另存为 HTML 文件,利用Phantomjs的截图工具,截取到 HTML 。比较曲折的方法,但可能更容易上手。

    我选择了后者,虽然每一步都不太熟练,但是先逐个击破吧!

    2. Excel to HTML

    2.1 尝试直接另存为 HTML 不成功

    这一步参考 [How do I save Excel Sheet as HTML in Python?
    ]https://stackoverflow.com/questions/19631511/how-do-i-save-excel-sheet-as-html-in-python
    需要先在 excel 里编辑好一个,再运行如下代码:

    from win32com.client import Dispatch
    
    xl = Dispatch('Excel.Application')
    xl.Workbooks.Open('C:FooBar.xlsx')
    #xl.Visible = True -- optional
    xl.Application.Run("SaveHTML")
    xl.Workbooks.Close
    

    使用上面的代码报错,信息如下:

    com_error: (-2147352567, '发生意外。', (0, 'Microsoft Excel', '无法运行“SaveHTML”宏。可能是因为该宏在此工作簿中不可用,或者所有的宏都被禁用。', 'xlmain11.chm', 0, -2146827284), None)
    

    我因为需要大量生成 Excel,觉得这个方法不太适合我,就跳过了。

    2.2 使用 Python 编辑现成的 html 模板,再修改自己需要的信息。

    需要用到selenium3chromedriver和对应的 Chrome 版本。https://www.cnblogs.com/technologylife/p/5829944.html
    一个简短的截图程序:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    chrome_options = Options()
    chrome_options.add_argument('--headless') #无界面
    chrome_options.add_argument('--disable-gpu')
    
    br = webdriver.Chrome(chrome_options=chrome_options) #实例化浏览器
    br.set_window_size(1024,700) #设置窗口大小
    
    br.get('F:/file.htm')
    br.get_screenshot_as_file("F:\file.png")
    
    br.quit() #退出很重要
    

    3. 修改 HTML 文件

    这里需要本地打开一个html文件,修改后再用浏览器打开。

    3.1 遇到编码转码问题

    我的HTML文件编码是’gb2312’,这是Excel2010导出的默认编码。我用Python打开这个文件一直报错!

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 4: ordinal not in range
    

    前后折腾了10个小时!一直在decode encode!其实根本不是这个问题!问题只是:
    千万不要有中文文件名和路径!
    都被自己的愚蠢惊到了。只要做到这样,再配合这句:

    #打开
    data = open("F://ktd.htm","r").read().decode("gb2312","ignore")
    #保存
    f = open('F:/data.htm','w')
    f.write(data.encode("gb2312","ignore"))
    f.close()
    

    基本就搞定了。

    3.2 使用beautifulsoup修改网页

    弃疗,即使有修改网页字符串的方式,我也发现太难找到我需要修改的元素,因为它不支持xpath定位。因此我直接用字符串的replace方式。

    4. 控制Google浏览器截图

    code:

    # -*- coding: utf-8 -*-
    """
    Created on Tue Jan 30 21:00:45 2018
    
    @author: xglc
    """
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from PIL import Image
    
    chrome_options = Options()
    #chrome_options.add_argument('--headless') #无头
    #chrome_options.add_argument('--disable-gpu')
    
    br = webdriver.Chrome(chrome_options=chrome_options)
    br.set_window_size(950,830)
    
    def _pic(name):
    
        br.get('F:/zqht/%s.htm'%name)
        # 截取当前窗口,并指定截图图片的保存位置
        path = 'F:/ktd/new/%s.png'%(name) 
        br.get_screenshot_as_file(path)   
        _sy(path) 
    
    #    br.quit()
    def _sy(path):
        lp = Image.open(path)  
        tp = Image.open('F:/work/zq/zqz.gif')  #水印
    
    #    rgba_image = lp.convert('RGBA')
    #    rgba_watermark = tp.convert('RGBA')
        img = tp.convert('RGBA') 
        r, g, b, alpha = img.split()  
        alpha = alpha.point(lambda i: i>0 and 240)  
        img.putalpha(alpha)  
    
        image_x, image_y = lp.size
        watermark_x, watermark_y = tp.size
    
        # 水印位置  mask是通道值,240+ 是透明效果
        lp.paste(img, (image_x - watermark_x, image_y - watermark_y),mask = alpha)
        print ('保存图片') 
        lp.save('F:/lala.png',"PNG") 
    
    if __name__ == '__main__':
        name = 'bgs'
        _pic(name)
    
    1. 通过调整浏览器窗口来控制截图大小,效果还不错。目前已知缺陷是,还没协调好被调用时候的内存使用问题,可能直接生成一个alpha通道值为240的图片,更节省资源。

    2. 这么一搞,有时候保存个中文路径或者图片也做不到了。可能跟前面的编解码有关。

  • 相关阅读:
    go 从入门到精通(二)基本数据类型和操作符
    python爬虫番外篇(一)进程,线程的初步了解
    Go从入门到精通(一)go语言初识
    python爬虫从入门到放弃(九)之 实例爬取上海高级人民法院网开庭公告数据
    python爬虫从入门到放弃(八)之 Selenium库的使用
    python爬虫从入门到放弃(七)之 PyQuery库的使用
    python爬虫从入门到放弃(六)之 BeautifulSoup库的使用
    python爬虫从入门到放弃(五)之 正则的基本使用
    python爬虫从入门到放弃(三)之 Urllib库的基本使用
    openstack网络基本概念(转)
  • 原文地址:https://www.cnblogs.com/aubucuo/p/html2png.html
Copyright © 2011-2022 走看看