python-Excelファイルを画像として保存し、透かしを付けてみます
8064 ワード
python-Excelファイルを画像として保存し、透かしを付けてみます
シーン:excelのchartをピクチャに生成するのではなく、テーブル全体をピクチャに生成します.
1.準備
現在、既存の方法は検索できません.自分で1つ書いてみるしかありません.考えは2つあります. Pythonのピクチャ処理ライブラリ 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で
上記のコードを使用してエラーを報告します.情報は次のとおりです.
私はExcelを大量に生成する必要があるので、この方法は私に合わないと思ってスキップしました.
2.2 Pythonで既製htmlテンプレートを編集し、必要な情報を修正します.
3.HTMLファイルの修正
ここでは
3.1符号化トランスコード問題に遭遇
私のHTMLファイルのエンコードは「gb 2312」で、これはExcel 2010がエクスポートしたデフォルトのエンコードです.私はPythonでこのファイルを開けてずっと間違っています!
前後10時間も振り回された!ずっとdecode encode!実は全然この問題ではありません!問題はただ:決して中国語のファイル名とパスがないでください!自分の愚かさに驚いた.そうすれば、この文に合わせます.
ほぼ終わりました.
3.2 beautifulsoupを使用してWebページを変更する
治療を放棄して、たとえホームページの文字列を修正する方法があっても、xpathの位置決めをサポートしていないため、私が修正しなければならない要素を見つけるのは難しいことに気づきました.だから私は文字列の
4.Googleブラウザのスクリーンショットの制御
code:ブラウザウィンドウを調整してスクリーンショットのサイズを制御すると、効果は悪くありません.現在知られている欠点は、呼び出されたときのメモリ使用の問題がまだ調整されていないことであり、 このようにすると、中国語のパスや画像を保存してもできないことがあります.前のコーデックと関係があるかもしれません.
シーン:excelのchartをピクチャに生成するのではなく、テーブル全体をピクチャに生成します.
1.準備
現在、既存の方法は検索できません.自分で1つ書いてみるしかありません.考えは2つあります.
PIL
を介して、Excel内の情報をピクチャに逐次書き込む.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テンプレートを編集し、必要な情報を修正します.
selenium3
、chromedriver
、対応する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のピクチャを直接生成し、リソースを節約することができることである.