python-Excelファイルを画像として保存し、透かしを付けてみます

8064 ワード

python-Excelファイルを画像として保存し、透かしを付けてみます
シーン:excelのchartをピクチャに生成するのではなく、テーブル全体をピクチャに生成します.
1.準備
現在、既存の方法は検索できません.自分で1つ書いてみるしかありません.考えは2つあります.
  • Pythonのピクチャ処理ライブラリPILを介して、Excel内の情報をピクチャに逐次書き込む.
  • 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:\Foo\Bar.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ファイルのエンコードは「gb 2312」で、これはExcel 2010がエクスポートしたデフォルトのエンコードです.私は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を使用してWebページを変更する
    治療を放棄して、たとえホームページの文字列を修正する方法があっても、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)
    
  • ブラウザウィンドウを調整してスクリーンショットのサイズを制御すると、効果は悪くありません.現在知られている欠点は、呼び出されたときのメモリ使用の問題がまだ調整されていないことであり、alphaチャネル値240のピクチャを直接生成し、リソースを節約することができることである.
  • このようにすると、中国語のパスや画像を保存してもできないことがあります.前のコーデックと関係があるかもしれません.