信首發(fā)于微信公眾號(hào)「GitHub精選」,歡迎大家關(guān)注。
大家好,我是章魚貓。
今天給大家推薦的這個(gè)開源項(xiàng)目是來自于讀者的投稿,我超級(jí)喜歡這個(gè)開源項(xiàng)目。尤其是做小程序開發(fā)的時(shí)候,經(jīng)常遇到將內(nèi)容生成圖片分享到朋友圈。這個(gè)開源項(xiàng)目就能夠解決你的問題,可以將 html 轉(zhuǎn)為圖片,還可以轉(zhuǎn)為 PDF ,還支持加水印。
這個(gè)開源項(xiàng)目就是:Doctron,它是基于 Docker、無狀態(tài)、簡(jiǎn)單、快速、高質(zhì)量的文檔轉(zhuǎn)換服務(wù)。目前支持將 html 轉(zhuǎn)為 pdf、圖片 (使用 chrome (Chromium) 瀏覽器內(nèi)核,保證轉(zhuǎn)換質(zhì)量)。支持 PDF 添加水印。
作者認(rèn)為目前開源界沒有較好的服務(wù)器端 HTML 轉(zhuǎn) PDF、圖片的工具,像 wkhtmltopdf、dompdf、mpdf 等這些比較出名的轉(zhuǎn)換工具,對(duì)一些簡(jiǎn)單 CSS 樣式的 HTML 轉(zhuǎn)換能做到不失真,對(duì)一些有復(fù)雜 CSS 樣式的 HTML 不能做到所見即所得。Doctron 使用 chrome 內(nèi)核恰巧彌補(bǔ)了這些缺點(diǎn)。
開源項(xiàng)目作者還提供了體驗(yàn)網(wǎng)站:
您可以打開下面的鏈接在線體驗(yàn)轉(zhuǎn)換質(zhì)量,由于服務(wù)器配置較低,以及網(wǎng)絡(luò)原因,轉(zhuǎn)換可能會(huì)慢一點(diǎn),實(shí)際部署到服務(wù)器速度會(huì)不一樣。
項(xiàng)目體驗(yàn)地址:http://doctron.lampnick.com/
開源項(xiàng)目特性如下:
安裝和使用步驟如下:
開源項(xiàng)目地址:https://github.com/lampnick/doctron
開源項(xiàng)目作者:lampnick
公眾號(hào):「GitHub 精選」,值得你關(guān)注,每天都分享開源項(xiàng)目,挖掘開源的價(jià)值。
迎點(diǎn)擊右上角關(guān)注小編,除了分享技術(shù)文章之外還有很多福利,私信學(xué)習(xí)資料可以領(lǐng)取包括不限于Python實(shí)戰(zhàn)演練、PDF電子文檔、面試集錦、學(xué)習(xí)資料等。
將圖片的每個(gè)像素用文字代替,最后生成一個(gè)HTML文檔,在瀏覽器中可以顯示出圖像,只不過圖像全是由文字組成的。
實(shí)現(xiàn)這樣的效果并不復(fù)雜,只不過是用標(biāo)簽代替像素而已,接下來我會(huì)演示如何用 PIL/Pillow 庫(kù)去實(shí)現(xiàn)這樣的效果。
PIL(Python Imaging Library) 是 Python 平臺(tái)的圖像處理標(biāo)準(zhǔn)庫(kù)。不過 PIL 暫不支持 Python3,可以用 Pillow 代替,API是相同的。
如果你安裝了 pip 的話可以直接輸入 pip install PIL 命令安裝 Pillow。
或者在 PyCharm 中打開 [File] >> [settings] >> [project github] >> [project interpreter] 添加標(biāo)準(zhǔn)庫(kù):
圖片處理過程
圖片轉(zhuǎn)換成網(wǎng)頁(yè)的過程,可以分成五個(gè)步驟。首先要選擇一個(gè)合適的HTML模板,控制好字體的大小和字符間的間距。
然后通過 Python 的 網(wǎng)絡(luò)訪問模塊,根據(jù)URL獲取圖片。接著使用 PIL 模塊載入二進(jìn)制圖片,將圖片壓縮到合適的尺寸。
遍歷圖片的每一個(gè)像素,得到該像素的顏色值,應(yīng)用到HTML的標(biāo)簽上。最后把字符串信息輸出到文件中,生成HTML文檔。
定制模板
大括號(hào)代表一個(gè)占位符,最后會(huì)被替換成實(shí)際內(nèi)容,雙大括號(hào)中的內(nèi)容則不會(huì)被替換。
獲取圖片
通過 URL 得到 byte 數(shù)組形式的圖片。
from urllib import request url='https://pic.cnblogs.com/avatar/875028/20160405220401.png' binary=request.urlopen(url).read()
處理圖片
byte 類型的 圖片需要通過 BytesIO 轉(zhuǎn)換為 string 類型,才能被 PIL 處理。
from PIL import Image from io import BytesIO img=Image.open(BytesIO(binary)) img.thumbnail((100, 100)) # 圖片壓縮
生成HTML
使用<font>標(biāo)簽包裹文字,并根據(jù)相應(yīng)像素的RGB值,設(shè)置<font>標(biāo)簽的color屬性。
piexl=img.load() # 獲取像素信息 width, height=img.size # 獲取圖像尺寸 body, word='', '博客園' font='<font color="{color}">{word}</font>' for y in range(height): for x in range(width): r, g, b=piexl[x, y] # 獲取像素RGB值 body +=font.format( color='#{:02x}{:02x}{:02x}'.format(r, g, b), word=word[((y * width + x) % len(word))] ) body +='\n<br />\n'
導(dǎo)出網(wǎng)頁(yè)
向HTML模板中填充處理完成的數(shù)據(jù),使用文件流將字符串以u(píng)tf8格式輸出到文檔。
html=TEMPLATE.format(title=word, body=body) fo=open('index.html', 'w', encoding='utf8') fo.write(html) fo.close()
img2html
wo把上面五個(gè)步驟封裝了起來,這樣一來就可以很方便的調(diào)用了。
from io import BytesIO from PIL import Image from PIL import ImageFilter from urllib import request TEMPLATE=''' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{title}</title> <style> body {{ line-height: 1em; letter-spacing: 0; font-size: 0.6rem; background: black; text-align: center; min-width: {size}em; }} </style> </head> <body> {body} </body> </html> ''' class Converter(object): def __init__(self, word='田', size=100): self.word, self.size=word, size self.font='<font color="{color}">{word}</font>' # 讀取url內(nèi)容 def __network(self, url): return request.urlopen(url).read() # 處理圖片信息 def __handle(self, binary): img=Image.open(BytesIO(binary)) # 打開制圖片 img.thumbnail((self.size, self.size)) # 壓縮圖片 img.filter(ImageFilter.DETAIL) # 圖片增強(qiáng) return img # 分析圖片像素 def __analysis(self, img): body='' piexls=img.load() width, height=img.size for y in range(height): for x in range(width): r, g, b=piexls[x, y] body +=self.font.format( color='#{:02x}{:02x}{:02x}'.format(r, g, b), word=self.word[((y * width + x) % len(self.word))] ) body +='\n<br />\n' return body # 寫入文件內(nèi)容 def __writefile(self, file, str): fo=open(file, 'w', encoding='utf8') try: fo.write(str) except IOError: raise Exception finally: fo.close() # 生成html文檔 def buildDOC(self, url, output): try: binary=self.__network(url) img=self.__handle(binary) html=TEMPLATE.format( title=self.word, body=self.__analysis(img), size=self.size ) # 向模板中填充數(shù)據(jù) self.__writefile(output, html) except Exception as err: print('Error:', err) return False else: print('Successful!') return True
導(dǎo)入 img2html.Converter,調(diào)用 buildDOC(url, out) 方法
程序會(huì)在當(dāng)前目錄生成 index.html 文件,需要用瀏覽器打開后才可以看到效果。
from img2html import Converter conv=Converter('卷福', 120) url='http://www.sznews.com/ent/images/attachement/jpg/site3/20140215/001e4f9d7bf91469078115.jpg' out='index.html' conv.buildDOC(url, out)
理化老師在日常教學(xué)中,經(jīng)常要撰寫各種公式,但由于公式并非簡(jiǎn)單的字符,并不能直接在Word中輸入,所以輸入那些非常見的公式,對(duì)老師們來說是個(gè)讓人頭痛的難題。不過我們可以借助Mathpix快速將手寫的公式掃描識(shí)別,再通過LaTeX編輯處理,最后再導(dǎo)入大家常用的Office軟件中。
快速識(shí)別數(shù)理化公式
Mathpix可以到mathpix.com下載(支持Windows、蘋果及Linux),安裝啟動(dòng)后就可以使用它的OCR識(shí)別功能了。由于Mathpix使用的是在線識(shí)別的方式,因此在使用過程中請(qǐng)確保本機(jī)聯(lián)網(wǎng)。
首先將需要輸入的公式寫在普通的白紙上,為了識(shí)別更為準(zhǔn)確,書寫時(shí)一定要注意公式的規(guī)范、工整,字體清晰。然后使用微信拍攝傳輸?shù)诫娔X上,在電腦微信端打開書寫的公式圖片(圖1)。
圖1 截圖識(shí)別
此時(shí)按下Ctrl+Alt+M組合鍵進(jìn)行截圖,Mathpix即會(huì)快速識(shí)別,并自動(dòng)輸出可編輯的公式。
精確修正識(shí)別誤差
Mathpix對(duì)手寫公式的識(shí)別還有絲許誤差,如本例中的平均速度V的上劃線以及“t/2”都沒有正確識(shí)別(圖2)。
圖2 查看識(shí)別結(jié)果
不過Mathpix的識(shí)別結(jié)果是可以編輯的LaTeX語法,我們可以直接雙擊下方的命令,然后在編輯窗口進(jìn)行修改。熟悉LaTeX語法朋友可以看到,公式中的各種位置的字符是通過可以編輯的語法命令組成的。比如我們要將V更改為平均速度,那么只要在t字母之前輸入“\overline{V}”代
對(duì)于“1/2t”的修改,按提示將原來語法中的t更改為“{\frac{t}{2}}”,這樣就可以獲得準(zhǔn)確的公式了。完成上述的修改后點(diǎn)擊“Copy Png”,將當(dāng)前公式復(fù)制為圖片并粘貼到Word等軟件中即可使用了(圖4)。
圖4 復(fù)制圖片到Word中
平時(shí)很多公式,老師們是通過互聯(lián)網(wǎng)的搜索獲取的,我們同樣可以在打開的網(wǎng)頁(yè)中直接進(jìn)行截取并識(shí)別,然后在Mathpix中進(jìn)行精確修改,從而將網(wǎng)上的圖片公式快速轉(zhuǎn)化為可編輯的公式了(圖5)。
圖5 識(shí)別網(wǎng)頁(yè)公式
直接手工輸入公式
既然Mathpix的公式實(shí)際是由命令代碼組成的,那么我們直接編輯代碼也可以生成各種想要的公式。同時(shí)按下Ctrl+Alt+M組合鍵激活Mathpix,接著在其編輯窗口輸入自己需要生成的公式代碼,主窗口上方即可顯示相應(yīng)的公式了(圖6)。LATEX數(shù)學(xué)公式基本語法可以打開www.cnblogs.com/houkai/p/3399646.html查看,大家可以根據(jù)其中的介紹自己“寫”出各種需要的格式。
圖6 輸入代碼生成公式
小提示:
★除了對(duì)公式進(jìn)行識(shí)別外,Mathpix還可以對(duì)其他外文語言進(jìn)行識(shí)別。比如一些無法編輯的英文PDF文檔,或者某些圖片上的文字需要轉(zhuǎn)化為可編輯的文字。同上打開PDF文檔后按下Ctrl+Alt+M組合鍵激活截圖,截取PDF或者圖片上的英文語句后就會(huì)自動(dòng)轉(zhuǎn)化為可以編輯的文本,按提示將其復(fù)制到記事本或者Word中進(jìn)行編輯即可,同樣對(duì)于其他我們無法識(shí)別的語言文本,如某些圖片上的法語、德語,使用Mathpix進(jìn)行識(shí)別后復(fù)制到百度翻譯進(jìn)行翻譯即可(圖7)。
圖7 識(shí)別英文語句
通過上述介紹可以知道,Mathpix是通過掃描圖片公式變?yōu)榭删庉嫷腖ATEX語法實(shí)現(xiàn)公式的編輯和輸入的,它和Word里的插入公式不同。在Word里我們只能輸入有限、系統(tǒng)預(yù)置的公式,并且只能進(jìn)行簡(jiǎn)單的編輯。雖然Word還提供一個(gè)手寫輸入公式的方法讓我們實(shí)現(xiàn)自定義輸入,但是和Mathpix相比,識(shí)別率更低,顯然無法和直接可以編輯的LATEX語法相比,強(qiáng)烈建議經(jīng)常需要輸入公式的教師們使用Mathpix進(jìn)行公式的識(shí)別和輸入(圖8)。
圖8 Word中手寫輸入公式識(shí)別率低
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。