項目遇到一個問題,一段文字鞍盗,要生成在一個圖片上需了。文字多少,不知道般甲,可能有中英文混合肋乍,也有換行。但是沒有文字大小變化啥的敷存。目標墓造,要實現(xiàn)像word一樣的自動換行和分段。
難點如下:
1锚烦,PIL是不支持類似CSS一樣標簽的觅闽,如果想用簡單的類似CSS一樣東西搞定,我試過了涮俄,不行
2蛉拙,文章有換行,期望顯示出來每行前面空兩個字
3禽拔,文字里會有漢字刘离、英文和數(shù)字組成,要保證每行差不多一樣長睹栖。
話不多說硫惕,先上一個代碼片段,如何安裝PIL以及引入包啥的這里就不多說了野来,先上一段代碼
insert = "垚紇"http://定義一個第一段空兩個漢字的占位符恼除,隨便找的兩個字
font_body = data["body"]//取到正式內容
font_body_tmp = font_body
i = 0
font_content = []//定義一個列表,用來裝分好行的數(shù)據(jù)
font_content_str = ""
fontnum = 17//每行字數(shù)
n = 0
addstep = 0
for item in font_body_tmp://循環(huán)正文里面的每一個字
addstr = insert + item
insert = ""
i += 1 + addstep
addstep = 0
if (item == "\n")://遇到回車曼氛,直接跳行
i = fontnum
addstr = ""
n = 1
insert = "垚紇"
addstep = 2
font_content_str += addstr
if (i % fontnum == 0)://到了切斷分行時候了
cop = re.compile("[^a-z^A-Z^0-9]")
coptmp = cop.sub("", font_content_str)
addnum = int((len(coptmp)) / 2)//這里檢查了這一行里有多少英文和數(shù)字豁辉,由于是半角,所以增加幾個字填充一下
if (addnum == 0 or n == 1)://準備放入正式數(shù)據(jù)
font_content.append(font_content_str)
font_content_str = ""
n = 0
else://這行里有英文和數(shù)字舀患,再補幾個字
i -= addnum
n = 1
font_content.append(font_content_str)//成品的每一行列表
這里大概思路是這樣的:
把文本內容按照每行多少個字切斷徽级,拼裝程列表,但是如果遇到回車聊浅,就直接切斷了餐抢,但是文章第一行和切斷后的第一行现使,都需要兩個字填充一下,作為空兩格的占位旷痕。如果這行里有英文和數(shù)字碳锈,查一下多少個,2個算一個字欺抗,這樣一行就不足預設的了售碳,那么再補幾個字進來,最終切片完成绞呈。下面代碼是貼到圖片上的代碼片段:
style_2 = ImageFont.truetype("/code/fonts/SOURCEHANSANSCN-REGULAR.OTF", 60)//設定字體
draw = ImageDraw.Draw(layer)//畫布圖層
fontstarth, step = 286, 90//設定Y軸位置贸人,以及每一行空多少位置
for font_item in font_content://循環(huán)內容列表
if (len(font_item) > 2 and font_item[0] == "垚" and font_item[1] == "紇")://判斷是否為新段落
font_item = font_item[2:]//去掉占位符
addpix = 110//整行前移
else://是尾行
addpix = 0//不移動
draw.text((53 + addpix, fontstarth), font_item, (255, 255, 255), font=style_2)//逐行貼圖
fontstarth += step//Y軸位置下移
代碼不多,但是非常繞人报强,上一張測試圖灸姊,文字內容如下:
油坊橋主臥求合租,18023452647560要求abc干凈衛(wèi)生秉溉,男女不限力惯,1500232345656745付三押一。\n周末聯(lián)系召嘶。油坊橋主臥求合租父晶,要求干凈衛(wèi)生,\n男女不限弄跌,1500付三押一甲喝。周末聯(lián)系。油坊橋主臥求合租铛只,要求干凈衛(wèi)生埠胖,\n男女不限,1500付三押一淳玩。