pyhon制作word、excel、ppt转pdf转换器大作战
很久很久沒有寫博客了。倒不是技術(shù)退步了,相反,這些年我從javascript開始,把主流語言基本都摸了個(gè)遍。然而編程的很多東西,用進(jìn)廢退,只要很短的一段時(shí)間不用就會(huì)遺忘很多。所以有些東西忙的時(shí)候沒有及時(shí)記下來,一段時(shí)間后就寫不出來了。
記得很久很久以前,大概是2011年左右的暑假,我接觸到了gamemaker,那時(shí)我很想做出屬于自己的游戲。于是我就是從那個(gè)時(shí)候開始學(xué)習(xí)編程。由于我并不是讀計(jì)算機(jī)類的本科,所以一開始入門對(duì)我來說是很困難。甚至于在大四的時(shí)候,由于沉迷于學(xué)習(xí)unity導(dǎo)致參加各種社招都失敗,一度有輕生的念頭。以前總想著也許我做出一個(gè)很好玩的游戲除了自娛自樂之外更重要的是還可以哄自己喜歡的師妹開心,最后換來的不過是那個(gè)師妹的一句“不是我說你自作多情,你憑什么覺得我會(huì)喜歡你?”而已。
如今我已經(jīng)早就不再從事編程的工作了,所以也斷更了很久很久。倒不是我就不再熱愛游戲,也談不上是生活所迫,只是說編程過度傷身而我的身體受不了不得不放棄而已。我覺得這代人既是幸運(yùn)的,也是悲哀的。幸運(yùn)的是我們生活在一個(gè)不愁吃喝,科技進(jìn)步的黃金年代,只要自己愿意努力就可以學(xué)有所成、學(xué)有所獲。悲哀的則是我們的身體跟不上我們的科技發(fā)展的步伐。有時(shí)候我在想,如果人體不怕熬夜,不會(huì)脫發(fā),不怕各種各樣因?yàn)椴涣忌盍?xí)慣導(dǎo)致的身體問題,不會(huì)因?yàn)樯眢w衰老導(dǎo)致記憶力和理解力下降,擁有數(shù)百年的壽命供我們研究學(xué)習(xí),那該有多好多好。那才是真正的由人類的必然王國飛躍到自由王國的白金時(shí)代。可惜我們不是出生在那樣的時(shí)代,我們也只能受制于生理的緊箍咒過日子了。
這次寫一個(gè)word轉(zhuǎn)pdf的轉(zhuǎn)換器,是為了一個(gè)姑娘。早就過了三十而立的我,依舊是異性絕緣體。不是什么其他原因,就是外貌問題而已。單位有個(gè)姑娘叫我?guī)退纯措娔X問題,她說她需要把word文檔和pdf合并成新的pdf文檔,也就是要把word轉(zhuǎn)pdf,再把多個(gè)pdf合并。網(wǎng)上的一些工具都不太好用,所以叫我能不能幫她解決。這姑娘應(yīng)該說是我長(zhǎng)這么大看過的第二好看的姑娘,屬于夢(mèng)中情人的那種。我之前晚上找她的時(shí)候,不管是七點(diǎn)還是十一點(diǎn)她都是固定地回復(fù)“我要去洗澡了”,我當(dāng)然看得出她不過是利用我?guī)退鉀Q問題而已,是不可能真的喜歡我的。然而我還是愿意這么一做,倒不是說什么沒人格,而是對(duì)我來說,有個(gè)姑娘愿意對(duì)我笑笑都早已經(jīng)是奢望了,更何況還是自己心儀的女孩呢?
如果我能回到以前沒有學(xué)習(xí)編程的時(shí)候,我肯定會(huì)放棄這些曲折的彎路,轉(zhuǎn)而去研究諸如繪畫音樂之類的藝術(shù)。因?yàn)檠芯砍绦蚨嗔巳菀滓桓?#xff0c;這是最不討女孩子喜歡的。而且,現(xiàn)實(shí)是長(zhǎng)得丑的人是不適合去學(xué)習(xí)編程的,長(zhǎng)得丑本身就有點(diǎn)難救了,要是又丑又禿又木,那么就注孤生了。以中國的性別比例來看,未來注孤生的男性肯定多如牛毛,這大概是人類歷史上為數(shù)不多見的大規(guī)模社會(huì)淘汰了——往大了說,很多丑的都被淘汰了,國人的平均長(zhǎng)相是會(huì)提高的嘛。
好了,不扯了,開始說正經(jīng)內(nèi)容了:
首先自然是安裝python了。我這次做了兩個(gè)版本,一個(gè)是xp的,一個(gè)是win7的。目前xp上面最高支持3.4.4。先說說在win7上面怎么搞,我用的是win7 64位的電腦。
下載python3.7:https://www.python.org/downloads/release/python-370/
下載里面的Windows x86-64 executable installer,如果是32位就是Windows x86 executable installer,安裝的時(shí)候注意盡量安裝不要有中文路徑,我直接安裝在C盤。python3會(huì)自帶pip等工具,注意這些比較重要,現(xiàn)在的安裝包都是默認(rèn)會(huì)裝上去的,不要自己隨便去掉它們。
安裝完畢之后是添加環(huán)境變量,這個(gè)比較簡(jiǎn)單,右擊我的電腦 → 屬性 → 高級(jí)系統(tǒng)設(shè)置 → 高級(jí) → 環(huán)境變量,在下方的系統(tǒng)變量那里的path里面添加上python目錄就行了,我的是C:\python37。
然后是安裝一些依賴。打開C:\python37\Scripts,在這個(gè)目錄按住shift然后右擊就可以“在此處打開命令窗口”
然后就是pip install pywin32,等它安裝完畢。
然后是pip install comtypes
然后pip install PyPDF2
然后就是安裝tkinter的擴(kuò)展tkinterDnD了。為什么用tkinter呢,因?yàn)閴蚝?jiǎn)單啊,如果只是寫小東西的話盡量不要搞太復(fù)雜的UI,什么PyQt之類的,搞小程序還是算了吧。那這個(gè)tkinterDnD又是什么鬼?是這樣,因?yàn)閠kinter太過簡(jiǎn)單,連拖拽文件這種功能都實(shí)現(xiàn)不了,于是就只能使用外部擴(kuò)展了。其實(shí)有一個(gè)叫windnd的東西,但是bug多,不好用,還是算了。dnd就是drag and drop的縮寫,英文就是“拖和放”的意思。
下面插一張本次程序的實(shí)現(xiàn)圖,由于給妹子用的肯定是傻瓜式的軟件,所以就這樣了。肯定有人注意到下面有“上移”和“下移”的按鈕,直接通過拖拽在白框里面調(diào)整待合并的office或者pdf文件不就可以了嗎,何必多此一舉?是這樣,因?yàn)閠kinter比較弱雞,這種上下拖拽移位看似簡(jiǎn)單的功能并不好實(shí)現(xiàn)。類似的功能換到html和javascript上面那就是so easy的事啊。(所以以后如果再有什么其他需要,我肯定用golang和gowalk了,只不過是因?yàn)樨潏Dpython的便捷,同時(shí)又因?yàn)榘姹締栴}用不了aardio才出此下策而已。)因?yàn)榻o妹子用的東西永遠(yuǎn)是越直觀越簡(jiǎn)單越好,所以我就不添加設(shè)定合并后文件路徑的功能了,直接把合并文件放到桌面去就好了。
tkdnd2.8?https://sourceforge.net/projects/tkdnd/
TkinterDnD2?http://sourceforge.net/projects/tkinterdnd/files/
sourceforge上面有這兩個(gè)東西,有時(shí)候需要科學(xué)上網(wǎng),實(shí)在不行的話就用我上傳的好了。注意,tkdnd2.8有一個(gè)是64位的版本,如果系統(tǒng)是64位的請(qǐng)用64位的版本。
下載完畢之后是解壓,然后把tkdnd2.8文件夾復(fù)制到python安裝位置文件夾下面的tcl文件夾里面去,把TkinterDnD2-0.3里面的TkinterDnD文件夾復(fù)制到python安裝位置文件夾的Lib文件夾里面去。(TkinterDnD2-0.3里面有幾個(gè)demo可供學(xué)習(xí),請(qǐng)讀者自己看)
該安裝的安裝好了,接著就是擼代碼了,我這里就直接把代碼貼出來了:
# -*- coding: utf-8 -*-import os import platform import time import comtypes.client import win32com.client from TkinterDnD2 import * import tkinter.messagebox as Messagebox try:from Tkinter import *from ScrolledText import ScrolledText except ImportError:from tkinter import *from tkinter.scrolledtext import ScrolledTextfrom PyPDF2 import PdfFileReader, PdfFileWriterimport winreg def get_desktop():key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders')return winreg.QueryValueEx(key, "Desktop")[0]def moveup():if len(listbox.curselection()) and listbox.curselection()[0]>0:pos = listbox.curselection()[0]text = listbox.get(pos)listbox.delete(pos)listbox.insert(pos-1,text)listbox.selection_clear("end")listbox.selection_set(pos-1)def movedown():if len(listbox.curselection()) and listbox.curselection()[0]<listbox.size()-1:pos = listbox.curselection()[0]text = listbox.get(pos)listbox.delete(pos)listbox.insert(pos+1,text)listbox.selection_clear("end")listbox.selection_set(pos+1)def convert():allpdf = []waitfordelete = []for p in range(listbox.size()):tmp = listbox.get(p)if str.endswith(tmp,".pdf") or str.endswith(tmp, ".PDF"):allpdf.append(tmp)elif str.endswith(tmp,".doc") or str.endswith(tmp, ".docx") or str.endswith(tmp, ".wps") or str.endswith(tmp,".DOC") or str.endswith(tmp, ".DOCX") or str.endswith(tmp, ".WPS"):# word轉(zhuǎn)化為pdfword = win32com.client.DispatchEx("Word.Application")#word = comtypes.client.CreateObject("Word.Application")word.Visible = 0newpdf = word.Documents.Open(tmp)newpdf.SaveAs(tmp+".pdf", FileFormat=17)newpdf.Close()#word.quit()word.Quit()allpdf.append(tmp+".pdf")waitfordelete.append(tmp+".pdf")elif str.endswith(tmp,".ppt") or str.endswith(tmp, ".pptx") or str.endswith(tmp,".PPT") or str.endswith(tmp, ".PPTX"):# ppt轉(zhuǎn)化為pdfppt = win32com.client.DispatchEx("Powerpoint.Application")#ppt = comtypes.client.CreateObject("Powerpoint.Application")ppt.Visible = 1 #ppt在轉(zhuǎn)換的時(shí)候必須可視,不然會(huì)異常,原因不明newpdf = ppt.Presentations.Open(tmp)newpdf.SaveAs(tmp+".pdf", FileFormat=32)newpdf.Close()#ppt.quit()ppt.Quit()allpdf.append(tmp+".pdf")waitfordelete.append(tmp+".pdf")elif str.endswith(tmp,".xls") or str.endswith(tmp, ".xlsx") or str.endswith(tmp,".XLS") or str.endswith(tmp, ".XLSX"):# excel轉(zhuǎn)化為pdf#excel = comtypes.client.CreateObject("Excel.Application")excel=win32com.client.DispatchEx("Excel.Application")excel.Visible = 0books = excel.Workbooks.Open(tmp)books.ExportAsFixedFormat(0, tmp+".pdf",1,0)books.Close()excel.Quit()allpdf.append(tmp+".pdf")waitfordelete.append(tmp+".pdf")else:pass#獲取文本框里面的文件名outfile = en2.get()if not str.endswith(outfile,".pdf") and not str.endswith(outfile,".PDF"):outfile += ".pdf"outdir = get_desktop()output = PdfFileWriter()outputPages = 0fuckinput = []if len(allpdf):for pdf_file in allpdf:#print("路徑:%s"%pdf_file)# 讀取源PDF文件inputopener = open(pdf_file, "rb")input = PdfFileReader(inputopener)fuckinput.append(inputopener)# 獲得源PDF文件中頁面總數(shù)pageCount = input.getNumPages()outputPages += pageCount#print("頁數(shù):%d"%pageCount)# 分別將page添加到輸出output中for iPage in range(pageCount):output.addPage(input.getPage(iPage))#print("合并后的總頁數(shù):%d."%outputPages)# 寫入到目標(biāo)PDF文件outputStream = open(os.path.join(outdir, outfile), "wb")output.write(outputStream)outputStream.close()for fuck in fuckinput:fuck.close()for k in waitfordelete:#print(k)os.remove(k) #將所有非pdf格式的office文件臨時(shí)生成的pdf緩存文件刪去Messagebox.showinfo('成功通知','合并完成!')else:Messagebox.showinfo('失敗通知','沒有可以合并的PDF文件!')def deleteline():listbox.delete(ACTIVE)root = TkinterDnD.Tk() root.withdraw() root.resizable(width=False, height=False) root.title('PDF文件轉(zhuǎn)換與合并工具 for xc') #xc就是我喜歡的妹子的名字拼音首字母縮寫root.grid_rowconfigure(1, weight=1, minsize=300,) root.grid_columnconfigure(0, weight=1, minsize=500)Label(root, text='請(qǐng)把想要合并的word、excel、ppt、pdf文檔拖拽到下方:').grid(row=0, column=0, padx=10, pady=5) buttonbox = Frame(root) buttonbox.grid(row=3, column=0, columnspan=2, pady=5) Button(buttonbox, text='上移選中的行', command=moveup).pack(side=LEFT, padx=5) Button(buttonbox, text='下移選中的行', command=movedown).pack(side=LEFT, padx=5) Button(buttonbox, text='刪除選中的行', command=deleteline).pack(side=LEFT, padx=5) Button(buttonbox, text='開始轉(zhuǎn)換', command=convert).pack(side=LEFT, padx=5) Button(buttonbox, text='退出', command=root.quit).pack(side=LEFT, padx=5)listbox = Listbox(root, name='dnd_demo_listbox',selectmode='BROWSE', width=1, height=1) listbox.grid(row=1, column=0, padx=30, pady=30, sticky='news') #listbox.insert(END, os.path.abspath(__file__))labelframe = Frame(root) labelframe.grid(row=2, column=0, columnspan=2, pady=5) en1 = Entry(labelframe,bd=0,width=12,fg="#ff0000") en1.pack(side=LEFT, padx=5) en1.insert(0,"合并后文件名:") en1.config(state="disabled") en2 = Entry(labelframe) en2.pack(side=LEFT, padx=5) en2.insert(0,"最新合并文件")# make the Label a drop target:def drop_enter(event):event.widget.focus_force()#print('Entering %s' % event.widget)return event.actiondef drop_position(event):#print('Position: x %d, y %d' %(event.x_root, event.y_root))return event.actiondef drop_leave(event):#print('Leaving %s' % event.widget)return event.actiondef drop(event):if event.data:#print('Dropped data:\n', event.data)if event.widget == listbox:files = listbox.tk.splitlist(event.data)for f in files:if os.path.exists(f):dr = Truefor p in range(listbox.size()):if f == listbox.get(p):dr = Falsebreakif dr:#print('Dropped file: "%s"' % f)listbox.insert('end', f)else:print('Not dropping file "%s": file does not exist.' % f)elif event.widget == text:# calculate the mouse pointer's text indexbd = text['bd'] + text['highlightthickness']x = event.x_root - text.winfo_rootx() - bdy = event.y_root - text.winfo_rooty() - bdindex = text.index('@%d,%d' % (x,y))text.insert(index, event.data)else:print('Error: reported event.widget not known')return event.actionlistbox.drop_target_register(DND_FILES, DND_TEXT) listbox.dnd_bind('<<DropEnter>>', drop_enter) listbox.dnd_bind('<<DropPosition>>', drop_position) listbox.dnd_bind('<<DropLeave>>', drop_leave) listbox.dnd_bind('<<Drop>>', drop)# make the Label a drag source:def drag_init(event):#data = listbox['text']#return (COPY, DND_TEXT, data)passdef drag_end(event):passlistbox.drag_source_register(DND_TEXT) listbox.dnd_bind('<<DragInitCmd>>', drag_init) listbox.dnd_bind('<<DragEndCmd>>', drag_end)root.update() sw = root.winfo_screenwidth() #tkinter自帶的獲取屏幕寬度 sh = root.winfo_screenheight()#獲取屏幕高度 ww = root.winfo_width()#獲取程序窗口寬度 wh = root.winfo_height()#獲取程序窗口高度,注意,在調(diào)用獲取程序窗口寬高之前要先刷新,即調(diào)用root.update(),否則得到的是初始值,即0,0x = (sw-ww)/2 y = (sh-wh)/2 root.geometry("%dx%d+%d+%d" %(ww,wh,x,y)) root.iconbitmap(os.getcwd()+"\\xc.ico") root.update_idletasks() root.deiconify() root.mainloop()代碼里面最后面的root.iconbitmap(os.getcwd()+"\\xc.ico")是用來添加圖標(biāo)的,我把圖標(biāo)放在了和py文件同目錄位置,圖標(biāo)文件可以自己找,也可以用Photoshop處理png格式之后再用網(wǎng)上的在線轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換。(xc是妹子姓名拼音首字母)
因?yàn)槊米雍芟矚g周杰倫,所以我就準(zhǔn)備做個(gè)周杰倫的圖標(biāo),當(dāng)然,真人肯定是不行的,因?yàn)閳D標(biāo)畢竟太小了,所以我就在網(wǎng)上找了一張q版圖片:
我覺得第二個(gè)不錯(cuò),就用ps把第二個(gè)處理成png:
然后就是在線轉(zhuǎn)ico:http://ico.duduxuexi.com/? ?(這類網(wǎng)站很多,隨便找一個(gè)就好)
寫完了自然是要打包了,我用的是pyinstaller,直接pip install pyintaller安裝的pyinstaller版本是有問題的,會(huì)導(dǎo)致各種bug,所以這里我要用的是:
pip install?https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz
安裝完成之后就是用pyinstaller來打包了。
我用的指令是這個(gè),每個(gè)斷開的地方都是一個(gè)空格的位置,注意是一個(gè)。
pyinstaller --add-data C:\python37\tcl\tkdnd2.8;tkdnd -w -F -i C:\Users\Acer\Desktop\xcproject\xc.ico C:\Users\Acer\Desktop\xcproject\xc.py
這里解釋一下,如果直接寫pyinstaller -F xxx.py就是打包指定路徑的.py文件,加上-w就是打包的時(shí)候不要出現(xiàn)console,就是你們說的那個(gè)黑黑的控制臺(tái)。在-F和xxx.py中間加上-i xxx.ico就是指定你打包后的圖標(biāo)的位置。因?yàn)閠kdnd2.8是手工放進(jìn)去的,有一些電腦的pyinstaller會(huì)識(shí)別不到這個(gè)module,導(dǎo)致打包失敗,所以在-w之前要加上 --add-data xxx\tcl\tkdnd2.8;tkdnd 注意這里的單詞add前面是兩個(gè)減號(hào)而不是一個(gè),而后面xxx\xxx\tkdnd2.8是一個(gè)路徑,路徑后面用英文的分號(hào)隔開,后面即是包名tkdnd,注意不要弄成中文的分號(hào)。
打包完畢之后要把剛剛的ico放在exe同個(gè)文件夾里面,因?yàn)槿绻环胚M(jìn)去的話,語句root.iconbitmap(os.getcwd()+"\\xc.ico")讀取的時(shí)候會(huì)讀取不到。肯定會(huì)有人說為什么還要放這個(gè),剛剛不是已經(jīng)指定路徑打包了嗎?是這樣,剛剛pyinstaller指定路徑打包進(jìn)去的是exe顯示在桌面上的圖標(biāo),而我的代碼指定的則是程序UI界面上的圖標(biāo)和任務(wù)欄上的圖標(biāo),我截個(gè)圖說明一下吧:
直接把一個(gè)exe和ico一起發(fā)給妹子肯定是不行的,到時(shí)候妹子肯定會(huì)問為什么多出一個(gè)。所以需要在網(wǎng)上找一些文件打包器打包成一個(gè)單獨(dú)的exe,我用的是http://www.pc0359.cn/downinfo/91554.html?,如果以后鏈接失效了就到我上傳的文件里面找吧。
一切就緒,接著就是測(cè)試了。win7 64位的程序在同樣的win7 64位上面運(yùn)行正常,未在win8、win10上面測(cè)試,不清楚怎樣,在xp上面自然是無法運(yùn)行的。因?yàn)檫@個(gè)程序需要調(diào)用到系統(tǒng)裝的office,所以如果一個(gè)電腦同時(shí)裝了好幾個(gè)版本的office就容易運(yùn)行錯(cuò)誤。而且office2003也不能用于轉(zhuǎn)換docx、pptx等高版本,即使是安裝了07兼容包也一樣。而且但凡是安裝了任何綠色版office的一般都會(huì)運(yùn)行失敗,使用office365也容易出問題。最容易處理的方法就是把所有office卸載干凈(網(wǎng)上有office卸載清理工具,可以卸載得比較干凈),然后安裝wps,安裝wps之后一般不會(huì)出問題。而且word文檔還有一種wps格式,安裝之后同樣可以將這種格式轉(zhuǎn)換為pdf。
接下來說說在xp上面怎么搞。肯定有人會(huì)跳出來說都什么年代了誰還用這些破玩意兒。我只能說兄dei你還是too young啊, sometimes naive,很多公司和企業(yè)、機(jī)關(guān)單位因?yàn)榉N種原因都會(huì)保留他們很多落后的系統(tǒng),所以在天朝,目前xp還是相當(dāng)普及的。在xp上面只能安裝到python3.4.4,https://www.python.org/downloads/release/python-344/
安裝完之后以類似的方法設(shè)置路徑,然后pip安裝pywin32 comtypes 和PyPDF2,不過因?yàn)楦甙姹镜膒ywin32沒辦法在低版本的python3.4和xp電腦上用,所以這個(gè)時(shí)候就不能直接通過pip來安裝pywin32了,而是去下載pywin32-219.win32-py3.4.exe,這個(gè)文件在CSDN上面就有得下載。
xp上面的pyinstaller也不能用高版本的,所以是:pip install?https://github.com/pyinstaller/pyinstaller/releases/download/v3.5/PyInstaller-3.5.tar.gz
如果覺得pip太慢,就用迅雷下載下來手動(dòng)安裝吧,如何手動(dòng)安裝python的包,百度一下就會(huì)了。
其他操作和上面win7的類似,就不再重復(fù)了。不過需要注意的是,pyinstaller里面的任何路徑的名稱都不能含有空格隔開,不然會(huì)導(dǎo)致識(shí)別錯(cuò)誤。我一開始在一臺(tái)xp電腦上把要打包的東西放在桌面,然后發(fā)現(xiàn)一直打包失敗,原來是因?yàn)閤p的桌面放在一個(gè)叫做Document and Settings的文件夾里面,這個(gè)地方有兩個(gè)空格隔開,別瞎折騰了,肯定打包不過的,換個(gè)路徑就好了。
在程序里面,調(diào)用windows的word或者excel、powerpoint有兩種方法,一種是使用pywin32附帶的win32com,另一種是使用comtypes,注意如果是用win32com的話,word.Quit()里面的quit首字母是大寫的,而如果是用comtypes的話則必須是小寫的。其實(shí)這兩個(gè)沒有太大的區(qū)別,在win7上面都正常,但是到了xp上面comtypes.client.CreatObject語句經(jīng)常抽風(fēng),換成win32com.clinet.DispatchEx就沒有這個(gè)問題。
word = win32com.client.DispatchEx("Word.Application")
#word = comtypes.client.CreateObject("Word.Application")
最后是處理ppt里面有句?ppt.Visible = 1 ,ppt轉(zhuǎn)換成pdf需要在可見的情況下才可以轉(zhuǎn),比較麻煩,不能像word和excel一樣不需要打開就可以在后臺(tái)轉(zhuǎn)換,具體原因不明確,我在外網(wǎng)的stackoverflow上面也查不到什么回答,只能作罷。
由于xp的版本也可以在win7 32位系統(tǒng)上面使用,所以我就不再另行裝虛擬機(jī)去弄一個(gè)win7 32位的版本了,有興趣的朋友可以自行嘗試。
到此為止,程序算是搞定了。如果讀者參考我的這篇東西寫東西出現(xiàn)了一些問題,那么請(qǐng)先自己百度谷歌吧,我寫這個(gè)也沒有問什么人,碰到問題都是自己想自己查搞定,只有自己折騰才能快速提高嘛,而且說實(shí)話我現(xiàn)在很忙,很少上csdn了,有時(shí)候?qū)嵲跊]時(shí)間幫其他人解答問題。
最后的最后,我把程序給妹子之后,妹子只是說了一句“好棒呀謝謝你哈”,然后就又說去洗澡了。第二天,我看到她的朋友圈發(fā)的是某酒店的圖片,一切都明白了。我默默的點(diǎn)開手機(jī),刪掉了她的全部聯(lián)系方式。
再見了xc。相信我這次不需要像大學(xué)那樣傷心兩年,只需要傷心兩個(gè)月就會(huì)好的。我要繼續(xù)備考我的司法考試了。
?
總結(jié)
以上是生活随笔為你收集整理的pyhon制作word、excel、ppt转pdf转换器大作战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简易boundbox碰撞检测
- 下一篇: CTF 大小写字母转换 try lowe