整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          一個(gè)支持將html轉(zhuǎn)為PDF、圖片,且支持PDF加水

          一個(gè)支持將html轉(zhuǎn)為PDF、圖片,且支持PDF加水印的項(xiàng)目

          信首發(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)目特性如下:

          • 使用 chrome 內(nèi)核保證高質(zhì)量將 HTML 轉(zhuǎn)為 pdf / 圖片。
          • 簡(jiǎn)易部署 (提供 docker 鏡像,Dockerfile 以及 k8s yaml 配置文件)。
          • 支持豐富的轉(zhuǎn)換參數(shù)。
          • 轉(zhuǎn)為 pdf 和圖片支持自定義大小。
          • 無狀態(tài)服務(wù)支持。

          安裝和使用步驟如下:

          開源項(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 圖像處理庫(kù)

          PIL(Python Imaging Library) 是 Python 平臺(tái)的圖像處理標(biāo)準(zhǔn)庫(kù)。不過 PIL 暫不支持 Python3,可以用 Pillow 代替,API是相同的。

          安裝 PIL 庫(kù)

          如果你安裝了 pip 的話可以直接輸入 pip install PIL 命令安裝 Pillow。

          或者在 PyCharm 中打開 [File] >> [settings] >> [project github] >> [project interpreter] 添加標(biāo)準(zhǔn)庫(kù):

          PIL 使用方法

          圖片處理過程

          圖片轉(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)
          

          轉(zhuǎn)換效果

          理化老師在日常教學(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í)別率低


          主站蜘蛛池模板: 无码精品人妻一区二区三区影院 | 在线精品国产一区二区三区| 波多野结衣电影区一区二区三区 | 精品一区二区三区无码免费视频| 麻豆一区二区在我观看| 日韩av片无码一区二区三区不卡 | 国产成人一区二区三区电影网站| 日韩人妻无码一区二区三区久久99 | 久久青草国产精品一区| 日韩电影在线观看第一区| 亚洲无圣光一区二区| 色妞AV永久一区二区国产AV| 美女视频一区二区三区| 中文字幕无线码一区二区 | 国产日韩AV免费无码一区二区三区| 精品无码AV一区二区三区不卡 | 国产乱码伦精品一区二区三区麻豆| 精品无码成人片一区二区98| 中文字幕乱码一区二区免费| 福利片福利一区二区三区| 无码一区二区三区AV免费| 亚洲国产国产综合一区首页| 一区二区三区免费看| 国产一区二区精品久久91| 精品国产一区AV天美传媒| 无码精品人妻一区二区三区免费看| 中文字幕一区在线| 无码AV动漫精品一区二区免费| 国产精品一区二区毛卡片 | 国产视频一区二区在线播放| 人妻无码一区二区三区四区| 国产一区二区在线观看麻豆| 亚洲乱色熟女一区二区三区蜜臀| 久久精品亚洲一区二区三区浴池| 久久99精品国产一区二区三区| 在线视频一区二区三区三区不卡 | 国产亚洲欧洲Aⅴ综合一区| 一区二区三区杨幂在线观看| 国产高清一区二区三区视频| 韩国精品福利一区二区三区| 无码少妇一区二区三区芒果|