当前位置:   article > 正文

基于python fitz的pdf文件处理器--已开源

python fitz

“音符文档助手”软件操作手册

目录

1、软件介绍

2、界面展示

3、安装教程

4、操作手册

5、注意事项

6、作者鸣谢

7、代码示例

【介绍】

  1. 音符文档助手PC端是一款实现word转pdf、pdf转word、pdf合并、pdf拆分、图片转pdf、pdf转图片的pc软件;
  2. 本软件基于python开发,使用到fitz、win32api等库;

  1. 作者:TYF - a student from CQU
  2. 联系方式:3538182550@qq.com
  3. 项目已开源:gitee:https://gitee.com/TangGarlic/fileSystem

                           Github:https://github.com/TonyTang-dev/fileSystem

  1. 软件当前还存在很多bug,还需要测试解决,如果您发现了软件的bug或者体验感需要改进的地方请联系作者,发送邮件给作者说明;

  1. 注意:
    1. 本软件虽已开源,但作者不允许将源码用于违法犯罪活动;
    2. 禁止针对源码的恶意删改发布,若运用此源码进行违法犯罪活动,作者在此声明与作者本人无关
    3. 作者保证本软件不会获取用户的私人信息,不会恶意破坏用户终端;
    4. 如果出现软件卡死、闪退等问题,只能是软件本身的bug,作者开发调试不能考虑到所有的问题,此时用户可通过资源管理器直接杀掉软件进程即可(ctrl+alt+delete打开资源管理器,选择“音符文档助手”进程,点击“结束任务”即可)
    5. 软件最终解释权归作者所有

【界面】

【安装教程】

  1. 将父目录 “/音符文档助手”复制到您希望的目录下,如D:/,即可完成安装;
  2. 进入目录“/音符文档助手/”,找到文件“音符文档助手.exe”,双击即可运行软件;
  3. 为了方便您的使用,我建议您建立桌面快捷方式:
    1. 进入目录“/音符文档助手/”,找到文件“音符文档助手.exe”;
    2. 右键单击该文件,为该文件建立桌面快捷方式(右键单击->发送到->桌面快捷方式),此后双击桌面快捷方式即可启动软件;
  4. 父目录结构:

  1. 目标exe文件,双击可启动软件--建议建立桌面快捷方式

【操作手册】

操作总述:选择功能--->选择文件(可多选)-->点击开始输出--->在您选择的第一个文件目录下生成目标文件

  1. 选择文件:

2种方式:a.点击左上角File按钮;b.将文件拖动到下方文件区

    1. 点击File按钮,进入文件选择界面,若单选,点击文件->点击打开或者直接双击文件即可;若多选,按住ctrl键,依次选择文件即可;

    1. 拖动文件到文件区:文件区在面板下方,您可选择鼠标多选文件之后,直接拖放到文件区即可;

    1. 选择成功之后,面板路径区会显示您选中的文件路径;

  1. 选择功能:
    1. 界面上方是工具栏,即选择您需要的功能;
    2. 选择功能之后面板会显示您当前可进行的操作,如点击作者;
    3. 若未选择功能,面板会显示“待选择”,此时您无法进行文档操作;

  1. 更换背景:
    1. 用户可自定义中间面板的背景图片;
    2. 点击左下角的更换背景,选择后缀为.jpg/.png的图片,确定即可;
    3. 用户之后重启软件,图片依然存在;
    4. 注意:此时计算机中背景图片一旦更换了存储位置或删除或修改了文件名则背景图片失效,自动切换为默认图片,若需要,可在此修改

  1. 执行操作:本例以pdf合并为例

注意:如果你想让你的合并结果按照某种顺序,建议您这样做:复制需要合并的pdf文件到新文件夹,按照顺序重命名文件(如按1.pdf,2.pdf,3.pdf···);

这样在文件夹中计算机会按照顺序为我们排好序,直接拖入文件区即可,这样会按照顺序合并PDF。

    1. 选择功能-->“PDF合并”;

    1. 选择文件,合并当然选择多个文件,以拖动选择为例;

    1. 点击开始输出:可以看到我们选择的第一个文件路径是在桌面,因为我们默认目标文件保存的是第一个文件的路径,所以生成的文件保存到桌面,进度条显示进度;

    1. 其他操作与此类似,举一反三即可进行操作

写在最后:

注意事项:

  1. 注意我们主要是一个操作PDF文件的软件,因此选择文件时注意辨别,不要选择了非.pdf后缀的文件,如果选择了这些文件,可能会导致一些难以估计的后果,如软件卡死等情况;此时请通过计算机的资源管理器关掉我们的软件。
  2. 注意按照教程使用软件,如pdf拆分是,要求输入的格式是:“a-b”,例如“1-23”,当你输入不合法时,系统会提示您,但是我建议您按照要求输入,正确使用软件,因为作者能力有限,不能够考虑完全周到;

  1. 点击面板上的“教程”和“作者”按钮可以查看部分教程和得到软件的信息以及联系作者的方式;
  2. 当您遇到软件的一些bug或者漏洞时,很希望您能够联系作者并告知,或者您有一些好的修改意见和建议也欢迎来邮件,这将对该系统的完善作出极大贡献,而且也能够极大的提升用户体验感。
  3. 最后:当我们的软件出现卡死、闪退的情况时,我建议您通过计算机的“资源管理器”直接关闭软件进程,避免影响体验,之后重启软件即可,下面介绍资源管理器关闭软件的方法:
    1. 快捷键:ctrl+alt+delete打开控制面板,选择资源管理器选项;

    1. 找到软件进程-“音符文档助手”;

    1. 点击,选择结束任务;或者右键单击,选择结束任务即可关闭软件;

6、注意,如果当前目录下已经存在目标生成文件,系统会尽可能的在目标文件后面添加数字1,如“YF文件处理1111.pdf”,但最多添加8个1后还存在同名文件,系统判定您多次操作,会拒绝生成目标文件,此时请您先查看目录下文件决定是否留下同名文件之后再进行操作。 以及注意目标文件是生成到您选择的第一个文件目录下,请到该目录下寻找目标文件或者查看面板上的提示路径。

【最后】

  1. 感谢您使用本软件,希望这个软件能够解决您生活中的一些小问题;
  2. 本软件已开源,开源使世界更美好;
  3. 我的存在也许就是让世界更美好,感谢您的使用;
  4. 我拒绝任何人将源码作有害之用,但提倡有益的、健康的二次开发与使用;
  5. 项目、软件的最终解释权归作者所有;

附上GUI主页代码如下:---->完整代码请进入github/gitee获取:

  1. # -*- coding: utf-8 -*-
  2. import wx
  3. import win32api
  4. import sys
  5. import os
  6. import wx.lib.agw.aui as aui
  7. from wx.adv import Animation, AnimationCtrl
  8. import glob
  9. import fitz
  10. import time
  11. # 模块
  12. from word2pdf import doc2pdf
  13. from globalVar import globalVar
  14. filePath_w2p = ""
  15. class FileDrop(wx.FileDropTarget):
  16. def __init__(self, panel, statusText):
  17. wx.FileDropTarget.__init__(self)
  18. self.text = statusText
  19. self.panel = panel
  20. def OnDropFiles(self, x, y, filePath):
  21. globalVar.fileList = filePath
  22. path = ""
  23. for i in filePath:
  24. path = path+"\n"+i
  25. self.text.Label = "="*10 + "选中文件路径"+"="*10 + path
  26. return True
  27. class mainFrame(wx.Frame):
  28. '''程序主窗口类,继承自wx.Frame'''
  29. id_open = 1
  30. id_help = 2
  31. id_word2pdf = 3
  32. id_pdf2word = 4
  33. id_mergePdf = 5
  34. id_cutPdf = 6
  35. id_img2pdf = 7
  36. id_pdf2img = 8
  37. id_author = 9
  38. fileName = ""
  39. def __init__(self, parent):
  40. '''构造函数'''
  41. wx.Frame.__init__(self, parent, -1, globalVar.APP_TITLE)
  42. self.SetBackgroundColour(wx.Colour(224, 224, 224))
  43. self.SetSize((620, 400))
  44. self.SetMaxSize((620, 400))
  45. self.Center()
  46. if hasattr(sys, "frozen") and getattr(sys, "frozen") == "windows_exe":
  47. exeName = win32api.GetModuleFileName(win32api.GetModuleHandle(None))
  48. icon = wx.Icon(exeName, wx.BITMAP_TYPE_ICO)
  49. else:
  50. icon = wx.Icon(globalVar.APP_ICON, wx.BITMAP_TYPE_ICO)
  51. self.SetIcon(icon)
  52. self.tb1 = self._CreateToolBar('F')
  53. self.tb2 = self._CreateToolBar()
  54. # self.tbv = self._CreateToolBar('V')
  55. p_left = wx.Panel(self, -1)
  56. # p_left.SetBackgroundColour("#90d7ec")
  57. p_center0 = wx.Panel(self, -1)
  58. image_file = ''
  59. with open("imgPath.txt", 'r', encoding="UTF-8") as f:
  60. image_file = f.readline()
  61. if not os.path.exists(image_file):
  62. image_file = globalVar.bgimgPath
  63. to_bmp_image = wx.Image(image_file, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
  64. self.bitmap = wx.StaticBitmap(p_center0, -1, to_bmp_image, (0, 0), (400, 200))
  65. globalVar.bgimg = self.bitmap
  66. p_center1 = wx.Panel(self, -1)
  67. p_bottom = wx.Panel(self, -1)
  68. p_center0.SetBackgroundColour("White")
  69. p_bottom.SetBackgroundColour("White")
  70. image_file = 'res/addfile.png'
  71. to_bmp_image = wx.Image(image_file, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
  72. self.bitmap = wx.StaticBitmap(p_bottom, -1, to_bmp_image, (0, 0), (400, 140))
  73. statusText0 = wx.StaticText(p_left, -1, globalVar.STATUS, pos=(0, 10), size=(200, 180), style=wx.ALIGN_LEFT)
  74. # statusText1 = wx.StaticText(p_left, -1, u"当前状态:word转PDF", pos=(15, 30), size=(200, -1), style=wx.ALIGN_CENTER)
  75. # statusText2 = wx.StaticText(p_left, -1, u"当前状态:PDF转word", pos=(15, 30), size=(200, -1), style=wx.ALIGN_CENTER)
  76. # statusText3 = wx.StaticText(p_left, -1, u"当前状态:其他", pos=(15, 30), size=(200, -1), style=wx.ALIGN_CENTER)
  77. # statusText0 = wx.StaticText(p_bottom, -1, "将文件拖曳到此开始实现文件转PDF", pos=(5, 10), size=(200, 200),
  78. # style=wx.ALIGN_LEFT)
  79. filepathText0 = wx.StaticText(p_center0, -1, "", pos=(0, 21), size=(500, -1), style=wx.ALIGN_LEFT)
  80. globalVar.textDetail = filepathText0
  81. # 文件拖曳
  82. fileDrop = FileDrop(p_center0, filepathText0)
  83. p_bottom.SetDropTarget(fileDrop)
  84. btn = wx.Button(p_left, -1, u'开始输出', pos=(30, 200), size=(100, -1))
  85. btn.Bind(wx.EVT_BUTTON, self.OnSwitch)
  86. btn.SetBackgroundColour('#f47920')
  87. btn = wx.Button(p_left, -1, u'更换背景', pos=(30, 260), size=(100, -1))
  88. btn.Bind(wx.EVT_BUTTON, self.changeBg)
  89. btn.SetBackgroundColour('white')
  90. text0 = wx.StaticText(p_center0, -1, u'当前操作:' + globalVar.status, pos=(0, 0), size=(400, 20), style=wx.ALIGN_CENTER)
  91. globalVar.textStatus = text0
  92. text0.SetFont(wx.Font(10, wx.FONTFAMILY_ROMAN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))
  93. text0.SetBackgroundColour("#f36c21")
  94. text1 = wx.StaticText(p_center1, -1, u'我是第2页', pos=(40, 100), size=(200, -1), style=wx.ALIGN_LEFT)
  95. line = wx.StaticText(p_center0, -1, u'', pos=(0, 20), size=(400, 1), style=wx.ALIGN_CENTER)
  96. line.SetBackgroundColour("black")
  97. self._mgr = aui.AuiManager()
  98. self._mgr.SetManagedWindow(self)
  99. self._mgr.AddPane(self.tb1,
  100. aui.AuiPaneInfo().Name("ToolBar1").Caption(u"工具条").ToolbarPane().Top().Row(0).Position(
  101. 0).Floatable(False)
  102. )
  103. self._mgr.AddPane(self.tb2,
  104. aui.AuiPaneInfo().Name("ToolBar2").Caption(u"工具条").ToolbarPane().Top().Row(0).Position(
  105. 1).Floatable(True)
  106. )
  107. # self._mgr.AddPane(self.tbv,
  108. # aui.AuiPaneInfo().Name("ToolBarV").Caption(u"工具条").ToolbarPane().Right().Floatable(True)
  109. # )
  110. self._mgr.AddPane(p_left,
  111. aui.AuiPaneInfo().Name("LeftPanel").Left().Layer(1).MinSize((200, -1)).Caption(
  112. u"操作区").MinimizeButton(True).MaximizeButton(True).CloseButton(False)
  113. )
  114. self._mgr.AddPane(p_center0,
  115. aui.AuiPaneInfo().Name("CenterPanel0").CenterPane().Show()
  116. )
  117. self._mgr.AddPane(p_center1,
  118. aui.AuiPaneInfo().Name("CenterPanel1").CenterPane().Hide()
  119. )
  120. self._mgr.AddPane(p_bottom,
  121. aui.AuiPaneInfo().Name("BottomPanel").Bottom().MinSize((-1, 100)).Caption(
  122. u"消息区").CaptionVisible(False).Resizable(True)
  123. )
  124. self._mgr.Update()
  125. def _CreateToolBar(self, d='H'):
  126. '''创建工具栏'''
  127. bmp_open = wx.Bitmap('res/file.png', wx.BITMAP_TYPE_ANY)
  128. bmp_save = wx.Bitmap('res/pdf2img.png', wx.BITMAP_TYPE_ANY)
  129. bmp_help = wx.Bitmap('res/trans.png', wx.BITMAP_TYPE_ANY)
  130. bmp_about = wx.Bitmap('res/mine2.png', wx.BITMAP_TYPE_ANY)
  131. bmp_trans = wx.Bitmap('res/trans3.png', wx.BITMAP_TYPE_ANY)
  132. bmp_trans2 = wx.Bitmap('res/trans4.png', wx.BITMAP_TYPE_ANY)
  133. bmp_trans3 = wx.Bitmap('res/trans5.png', wx.BITMAP_TYPE_ANY)
  134. bmp_trans4 = wx.Bitmap('res/img2pdf.png', wx.BITMAP_TYPE_ANY)
  135. if d.upper() in ['V', 'VERTICAL']:
  136. tb = aui.AuiToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
  137. agwStyle=aui.AUI_TB_TEXT | aui.AUI_TB_VERTICAL)
  138. else:
  139. tb = aui.AuiToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, agwStyle=aui.AUI_TB_TEXT)
  140. tb.SetToolBitmapSize(wx.Size(16, 16))
  141. if d.upper() != 'F':
  142. tb.AddSimpleTool(self.id_mergePdf, u'PDF合并', bmp_trans2, u'合并多个PDF为一个PDF')
  143. tb.AddSimpleTool(self.id_cutPdf, u'PDF拆分', bmp_trans, u'将一个PDF拆分成多个')
  144. tb.AddSimpleTool(self.id_img2pdf, u'图片转PDF', bmp_trans3, u'将图片放到PDF文件中')
  145. tb.AddSeparator()
  146. tb.AddSimpleTool(self.id_pdf2img, u'PDF转图片', bmp_help, u'PDF每页转成一张图片')
  147. tb.AddSimpleTool(self.id_author, u'作者', bmp_about, u'关于作者')
  148. tb.Bind(wx.EVT_TOOL, self.dealFunction)
  149. else:
  150. tb.AddSimpleTool(self.id_open, u'File', bmp_open, u'打开文件')
  151. tb.AddSimpleTool(self.id_help, u'教程', bmp_help, u'使用教程')
  152. tb.AddSeparator()
  153. tb.AddSimpleTool(self.id_word2pdf, u'word转PDF', bmp_save, u'word文件转PDF文件')
  154. tb.AddSimpleTool(self.id_pdf2word, u'PDF转word', bmp_trans4, u'将PDF文件转为word文件')
  155. tb.Bind(wx.EVT_TOOL, self.dealFunction)
  156. tb.Realize()
  157. return tb
  158. def word2pdf(self):
  159. if len(globalVar.fileList) == 0:
  160. d = wx.MessageDialog(None, u"请先选中文件再进行操作哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  161. if d.ShowModal() == wx.ID_OK:
  162. pass
  163. d.Destroy()
  164. return
  165. progressMax = 100
  166. dialog = wx.ProgressDialog("处理进度", "正在处理中,请稍后···", progressMax)
  167. count = 0
  168. for i in globalVar.fileList:
  169. flag = 1
  170. result = 1
  171. if flag == 1:
  172. result = doc2pdf(i)
  173. if len(globalVar.fileList) < 3:
  174. time.sleep(1)
  175. count = count + int(100/len(globalVar.fileList))
  176. if count < 100:
  177. dialog.Update(count)
  178. dialog.Destroy()
  179. if len(globalVar.fileList) == 1:
  180. finalPath = ''
  181. for k in globalVar.fileList[0].split("\\")[:-1]:
  182. finalPath += k + "\\"
  183. globalVar.textDetail.SetLabel('目标文件保存至:' + finalPath)
  184. if result == 1:
  185. d = wx.MessageDialog(None, u"转换失败,可能已经存在文件"+i+".pdf", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  186. if d.ShowModal() == wx.ID_OK:
  187. pass
  188. d.Destroy()
  189. else:
  190. pass
  191. # d=wx.MessageDialog(None, u"转换成功", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  192. # if d.ShowModal()==wx.ID_OK:
  193. # pass
  194. # d.Destroy()
  195. if len(globalVar.fileList) != 1:
  196. finalPath = ''
  197. for k in globalVar.fileList[0].split("\\")[:-1]:
  198. finalPath += k+"\\"
  199. globalVar.textDetail.SetLabel('目标文件保存至:'+finalPath)
  200. return
  201. def pdf2word(self):
  202. if len(globalVar.fileList) == 0:
  203. d = wx.MessageDialog(None, u"请先选中文件再进行操作哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  204. if d.ShowModal() == wx.ID_OK:
  205. pass
  206. d.Destroy()
  207. return
  208. progressMax = 100
  209. dialog = wx.ProgressDialog("处理进度", "正在处理中,请稍后···", progressMax)
  210. count = 0
  211. for i in globalVar.fileList:
  212. if i[-3:] != "pdf":
  213. d = wx.MessageDialog(None, u"文件"+i+"不是pdf文件,不能转换哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  214. if d.ShowModal() == wx.ID_OK:
  215. pass
  216. d.Destroy()
  217. continue
  218. count += int(100 / len(globalVar.fileList))
  219. if count < 100:
  220. dialog.Update(count)
  221. doc = fitz.open(i)
  222. docName = i[0:-4]+".docx"
  223. resultDoc = open(docName, "wb")
  224. for page in doc:
  225. text = page.get_text().encode("utf8")
  226. resultDoc.write(text)
  227. resultDoc.close()
  228. time.sleep(1)
  229. dialog.Destroy()
  230. finalPath = ''
  231. for k in globalVar.fileList[0].split("\\")[:-1]:
  232. finalPath += k+"\\"
  233. globalVar.textDetail.SetLabel('目标文件保存至:'+finalPath)
  234. return
  235. def mergePdf(self):
  236. if len(globalVar.fileList) == 0:
  237. d = wx.MessageDialog(None, u"请先选中文件再进行操作哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  238. if d.ShowModal() == wx.ID_OK:
  239. pass
  240. d.Destroy()
  241. return
  242. path = ''
  243. for j in globalVar.fileList[0].split("\\")[:-1]:
  244. path += j+"\\"
  245. docName = "YF操作PDF文件"
  246. times = 0
  247. while os.path.exists(path+docName + "(合并).pdf") and times < 8:
  248. docName += "1"
  249. times += 1
  250. if times == 8:
  251. d = wx.MessageDialog(None, u"当前目录存在多个相似PDF,请先移除此类文件再操作", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  252. if d.ShowModal() == wx.ID_OK:
  253. pass
  254. d.Destroy()
  255. return
  256. progressMax = 100
  257. dialog = wx.ProgressDialog("处理进度", "正在处理中,请稍后···", progressMax)
  258. count = 0
  259. resultDoc = fitz.open()
  260. for i in globalVar.fileList:
  261. if i[-3:] != "pdf":
  262. d = wx.MessageDialog(None, u"文件" + i + "不是pdf文件,不能合并哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  263. if d.ShowModal() == wx.ID_OK:
  264. pass
  265. d.Destroy()
  266. continue
  267. count += int(100/len(globalVar.fileList))
  268. if count < 100:
  269. dialog.Update(count)
  270. doc = fitz.open(i)
  271. resultDoc.insert_pdf(doc)
  272. resultDoc.save(path+docName + "(合并).pdf")
  273. resultDoc.close()
  274. time.sleep(1)
  275. dialog.Destroy()
  276. finalPath = ''
  277. for k in globalVar.fileList[0].split("\\")[:-1]:
  278. finalPath += k + "\\"
  279. globalVar.textDetail.SetLabel('目标文件保存至:' + finalPath)
  280. return
  281. def cutPdf(self):
  282. if len(globalVar.fileList) == 0:
  283. d = wx.MessageDialog(None, u"请先选中文件再进行操作哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  284. if d.ShowModal() == wx.ID_OK:
  285. pass
  286. d.Destroy()
  287. return
  288. if globalVar.fileList[0][-3:] != "pdf":
  289. d = wx.MessageDialog(None, u"您当前选中的文件不是PDF文件哦,操作失败!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  290. if d.ShowModal() == wx.ID_OK:
  291. pass
  292. d.Destroy()
  293. return
  294. message = ""
  295. dlg = wx.TextEntryDialog(None, u"请按 'a-b' 的格式输入切割的起始页和结束页,如:1-23\n默认只对选中的第一个文件执行操作", u"输入提示", u"1-23")
  296. if dlg.ShowModal() == wx.ID_OK:
  297. message = dlg.GetValue() # 获取文本框中输入的值
  298. dlg.Destroy()
  299. if len(message.split("-")) != 2:
  300. d = wx.MessageDialog(None, u"您的输入不正确,按照'a-b'格式输入哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  301. if d.ShowModal() == wx.ID_OK:
  302. pass
  303. d.Destroy()
  304. return
  305. if (not message.split("-")[0].isdigit()) or (not message.split("-")[1].isdigit()):
  306. d = wx.MessageDialog(None, u"您的输入不正确,按照'a-b'格式输入哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  307. if d.ShowModal() == wx.ID_OK:
  308. pass
  309. d.Destroy()
  310. return
  311. progressMax = 100
  312. dialog = wx.ProgressDialog("处理进度", "正在处理中,请稍后···", progressMax)
  313. count = 0
  314. Doc = globalVar.fileList[0][0:-4]
  315. doc = fitz.open(globalVar.fileList[0])
  316. resultDoc = fitz.open()
  317. resultDoc.insert_pdf(doc, from_page=int(message.split("-")[0]) - 1, to_page=int(message.split("-")[0]) - 1)
  318. resultDoc.save(Doc + "(拆分).pdf")
  319. resultDoc.close()
  320. count = 100
  321. time.sleep(1)
  322. dialog.Update(count)
  323. dialog.Destroy()
  324. finalPath = ''
  325. for k in globalVar.fileList[0].split("\\")[:-1]:
  326. finalPath += k + "\\"
  327. globalVar.textDetail.SetLabel('目标文件保存至:' + finalPath)
  328. return
  329. def img2pdf(self):
  330. doc = fitz.open()
  331. if len(globalVar.fileList) == 0:
  332. d = wx.MessageDialog(None, u"请先选中文件再进行操作哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  333. if d.ShowModal() == wx.ID_OK:
  334. pass
  335. d.Destroy()
  336. return
  337. progressMax = 100
  338. dialog = wx.ProgressDialog("处理进度", "正在处理中,请稍后···", progressMax)
  339. keepGoing = True
  340. count = 0
  341. for i in globalVar.fileList:
  342. if i[-3:] != "jpg" and i[-3:] != "png":
  343. d = wx.MessageDialog(None, u"选中的图片中含有非jpg/png图片,不能加入哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  344. if d.ShowModal() == wx.ID_OK:
  345. pass
  346. d.Destroy()
  347. continue
  348. count = count+int(100/(len(globalVar.fileList)))
  349. if count < 100:
  350. dialog.Update(count)
  351. for img in sorted(glob.glob(i)):
  352. imgdoc = fitz.open(img)
  353. imgpdf = imgdoc.convert_to_pdf()
  354. imgPDF = fitz.open("pdf", imgpdf)
  355. doc.insert_pdf(imgPDF)
  356. path = ''
  357. for j in globalVar.fileList[0].split("\\")[:-1]:
  358. path += j + "\\"
  359. docName = "YF操作PDF文件"
  360. times = 0
  361. while os.path.exists(path+docName + "(img2pdf).pdf") and times < 8:
  362. docName += "1"
  363. times += 1
  364. if times == 8:
  365. d = wx.MessageDialog(None, u"当前目录存在多个相似PDF,请先移除此类文件再操作", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  366. if d.ShowModal() == wx.ID_OK:
  367. pass
  368. d.Destroy()
  369. return
  370. doc.save(path+docName+"(img2pdf).pdf")
  371. doc.close()
  372. time.sleep(1)
  373. dialog.Destroy()
  374. finalPath = ''
  375. for k in globalVar.fileList[0].split("\\")[:-1]:
  376. finalPath += k + "\\"
  377. globalVar.textDetail.SetLabel('目标文件保存至:' + finalPath)
  378. return
  379. def pdf2img(self):
  380. if len(globalVar.fileList) == 0:
  381. d = wx.MessageDialog(None, u"请先选中文件再进行操作哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  382. if d.ShowModal() == wx.ID_OK:
  383. pass
  384. d.Destroy()
  385. return
  386. if globalVar.fileList[0][-3:] != "pdf":
  387. d = wx.MessageDialog(None, u"您当前选中的文件不是PDF文件哦,操作失败!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  388. if d.ShowModal() == wx.ID_OK:
  389. pass
  390. d.Destroy()
  391. return
  392. message = ""
  393. dlg = wx.TextEntryDialog(None, u"请按 'a-b' 的格式输入生成图片的起始页和结束页,如:1-23\n默认只对选中的第一个文件执行操作", u"输入提示", u"1-23")
  394. if dlg.ShowModal() == wx.ID_OK:
  395. message = dlg.GetValue() # 获取文本框中输入的值
  396. dlg.Destroy()
  397. if len(message.split("-")) != 2:
  398. d = wx.MessageDialog(None, u"您的输入不正确,按照'a-b'格式输入哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  399. if d.ShowModal() == wx.ID_OK:
  400. pass
  401. d.Destroy()
  402. return
  403. if (not message.split("-")[0].isdigit()) or (not message.split("-")[1].isdigit()):
  404. d = wx.MessageDialog(None, u"您的输入不正确,按照'a-b'格式输入哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  405. if d.ShowModal() == wx.ID_OK:
  406. pass
  407. d.Destroy()
  408. return
  409. Doc = globalVar.fileList[0][0:-4]
  410. doc = fitz.open(globalVar.fileList[0])
  411. progressMax = 100
  412. dialog = wx.ProgressDialog("处理进度", "正在处理中,请稍后···", progressMax)
  413. count = 0
  414. for pg in range(int(message.split("-")[0]) - 1, int(message.split("-")[1])):
  415. count = count + int(100/(int(message.split("-")[1]) - int(message.split("-")[0])))
  416. if count < 100:
  417. dialog.Update(count)
  418. page = doc[pg]
  419. zoom = int(100)
  420. rotate = int(0)
  421. H = 20
  422. M = 40
  423. L = 60
  424. trans = fitz.Matrix(zoom / M, zoom / M).prerotate(rotate)
  425. pm = page.get_pixmap(matrix=trans, alpha=True)
  426. pm.save(Doc + "第%s页.png" % str(pg + 1))
  427. time.sleep(1)
  428. dialog.Destroy()
  429. finalPath = ''
  430. for k in globalVar.fileList[0].split("\\")[:-1]:
  431. finalPath += k + "\\"
  432. globalVar.textDetail.SetLabel('目标文件保存至:' + finalPath)
  433. return
  434. def openAuthor(self):
  435. globalVar.textDetail.SetLabel("作者:唐YF\n联系方式:3538182550@qq.com(邮箱)\n状态:"
  436. "项目还在进一步维护中,敬请期待\n项目:本项目已开源,欢迎访问本人代码托管仓库\n"
  437. "仓库地址:\n"
  438. "gitee: https://gitee.com/TangGarlic/fileSystem.git\n"
  439. "github: https://github.com/TonyTang-dev/fileSystem.git\n"
  440. "写在最后:感谢您使用本软件,如软件有问题或您有新需求,记得联系我")
  441. return
  442. def openFile(self):
  443. # 打开开文件对话框
  444. dlg = wx.FileDialog(self, u"选择文件", style=wx.FD_MULTIPLE)
  445. if dlg.ShowModal() == wx.ID_OK:
  446. # print(dlg.GetPath()) # 文件夹路径
  447. filePath_w2p = dlg.GetPaths()
  448. globalVar.fileList.clear()
  449. globalVar.fileList = filePath_w2p
  450. path = ""
  451. for i in filePath_w2p:
  452. path = path + "\n" + i
  453. globalVar.textDetail.Label = "=" * 10 + "选中文件路径" + "=" * 10 + path
  454. dlg.Destroy()
  455. return
  456. def openHelp(self):
  457. globalVar.textDetail.SetLabel("0、安装:将文件夹放到电脑中,为“音符文档助手.exe”建快捷方式即可\n"
  458. "1、首先在上方工具栏选择您需要进行的操作,状态栏会提示您当前状态\n"
  459. "2、若是对文件的操作,先选择文件,拖动文件到下方/点击File打开均可\n"
  460. "3、确定好文件之后点击左下角“开始输出”接口开始输出\n"
  461. "4、word转pdf功能目前需要电脑中已安装有office套件/wps\n"
  462. "5、选择功能-->选择文件-->点击转换"
  463. "注意:\n"
  464. "a. 拖动文件时可多个文件一起选中拖动到下方文件框\n"
  465. "b. 本软件不获取您的个人信息,如有卡顿指定是软件有bug,不必惊慌\n"
  466. "c. 如果您的一些操作导致软件卡死/闪退,那就是软件有问题--联系作者\n"
  467. "d. 如有疑问,请查看软件文件夹目录下的“音符文档助手使用手册.pdf”\n"
  468. "e. 如有需求或疑问请联系作者(点击“作者”可见/3538182550@qq.com)")
  469. return
  470. def dealFunction(self, event):
  471. index = event.GetId()
  472. if globalVar.operationId == 2 or globalVar.operationId == 9:
  473. globalVar.textDetail.SetLabel("")
  474. globalVar.fileList.clear()
  475. globalVar.operationId = index
  476. # id_open = 1 id_help = 2 id_word2pdf = 3 id_pdf2word = 4
  477. # id_mergePdf = 5 id_cutPdf = 6 id_img2pdf = 7 id_pdf2img = 8 id_author = 9
  478. if index == 1:
  479. globalVar.status = "打开本地文件"
  480. globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  481. self.openFile()
  482. elif index == 2:
  483. globalVar.status = "使用教程"
  484. globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  485. self.openHelp()
  486. elif index == 3:
  487. globalVar.status = "word转pdf"
  488. globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  489. # self.word2pdf()
  490. elif index == 4:
  491. globalVar.status = "pdf转word"
  492. globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  493. # self.pdf2word()
  494. elif index == 5:
  495. globalVar.status = "合并pdf"
  496. globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  497. # self.mergePdf()
  498. elif index == 6:
  499. globalVar.status = "打开本地文件"
  500. globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  501. # self.cutPdf()
  502. elif index == 7:
  503. globalVar.status = "图片转pdf"
  504. globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  505. # self.img2pdf()
  506. elif index == 8:
  507. globalVar.status = "pdf转图片"
  508. globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  509. # self.pdf2img()
  510. elif index == 9:
  511. globalVar.status = "关于作者"
  512. globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  513. self.openAuthor()
  514. def OnSwitch(self, evt):
  515. # path = filepathText0.Label.split("\n")[1] # 获得文件路径
  516. #
  517. # if path == "":
  518. # d = wx.MessageDialog(None, u"请先选择文件再点击转换哦", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  519. # if d.ShowModal() == wx.ID_OK:
  520. # pass
  521. # d.Destroy()
  522. # return
  523. # statusText0 = wx.StaticText(panel, -1, "转换中···", pos=(80, 72), size=(72, -1), style=wx.ALIGN_CENTER)
  524. # statusText0.SetBackgroundColour("White")
  525. # animation = AnimationCtrl(panel, -1, Animation('res/5.gif'), pos=(80, 90)) # 创建一个动画
  526. # animation.Play() # 播放动图
  527. # mainFrame(None).word2PDF(path) # 开始转换
  528. # animation.Stop()
  529. # statusText0.Show(0)
  530. # animation.Destroy()
  531. index = globalVar.operationId
  532. # if index == 1:
  533. # # globalVar.status = "打开本地文件"
  534. # # globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  535. # self.openFile()
  536. # elif index == 2:
  537. # globalVar.status = "使用教程"
  538. # globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  539. # self.openHelp()
  540. if index == 0:
  541. globalVar.textStatus.SetLabel("当前操作:待选择")
  542. print("1")
  543. elif index == 3:
  544. # globalVar.status = "word转pdf"
  545. # globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  546. self.word2pdf()
  547. elif index == 4:
  548. # globalVar.status = "pdf转word"
  549. # globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  550. self.pdf2word()
  551. elif index == 5:
  552. # globalVar.status = "合并pdf"
  553. # globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  554. self.mergePdf()
  555. elif index == 6:
  556. # globalVar.status = "打开本地文件"
  557. # globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  558. self.cutPdf()
  559. elif index == 7:
  560. # globalVar.status = "图片转pdf"
  561. # globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  562. self.img2pdf()
  563. elif index == 8:
  564. # globalVar.status = "pdf转图片"
  565. # globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  566. self.pdf2img()
  567. # elif index == 9:
  568. # globalVar.status = "关于作者"
  569. # globalVar.textStatus.SetLabel("当前操作:"+globalVar.status)
  570. # self.openAuthor()
  571. # globalVar.textDetail.SetLabel('')
  572. globalVar.fileList.clear()
  573. def changeBg(self, evt):
  574. # 打开开文件对话框
  575. dlg = wx.FileDialog(self, u"选择文件", style=wx.FD_OPEN)
  576. if dlg.ShowModal() == wx.ID_OK:
  577. # print(dlg.GetPath()) # 文件夹路径
  578. imgPath = dlg.GetPath()
  579. if imgPath[-3:] != "jpg" and imgPath[-3:] != "png":
  580. d = wx.MessageDialog(None, u"请选择jpg/png图片才行哦!", u"提示", wx.YES_NO | wx.ICON_QUESTION)
  581. if d.ShowModal() == wx.ID_OK:
  582. d.Destroy()
  583. dlg.Destroy()
  584. return
  585. with open("imgPath.txt", "w+", encoding="UTF-8") as f:
  586. f.write(imgPath)
  587. img = wx.Image(imgPath, wx.BITMAP_TYPE_ANY).Rescale(400, 200).ConvertToBitmap()
  588. globalVar.bgimg.SetBitmap(wx.BitmapFromImage(img))
  589. dlg.Destroy()
  590. return
  591. class mainApp(wx.App):
  592. def OnInit(self):
  593. self.SetAppName(globalVar.APP_TITLE)
  594. self.Frame = mainFrame(None)
  595. self.Frame.Show()
  596. return True
  597. if __name__ == "__main__":
  598. app = mainApp()
  599. app.MainLoop()

最后的最后,请你相信,没有到不了的明天,今天的困难和不顺终将烟消云散,我们的明天依然美丽,因为每个人的一生都是一次美丽的远行。

==========================================================

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号