I updated the PDF Booklet project and removed Python 2 dependencies so that it will run under Ubuntu 22.04.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

183 lines
6.0 KiB

2 years ago
  1. #!/usr/bin/python
  2. # coding: utf-8 -*-
  3. # version 3.0.3
  4. import os, sys
  5. from gi.repository import Gtk, Gio
  6. from pdfbooklet.PyPDF2_G import PdfFileReader
  7. def alert(message, type = 0) :
  8. dialog = Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING,
  9. Gtk.ButtonsType.CLOSE , message)
  10. dialog.run()
  11. dialog.destroy()
  12. class Chooser:
  13. def __init__(self,
  14. inputFiles_a = None,
  15. share_path_u = "",
  16. mru_dir = ""):
  17. self.inputFiles_a = inputFiles_a
  18. self.chooser1 = Gtk.Builder()
  19. self.chooser1.add_from_file(os.path.join(share_path_u, 'data/chooser_dialog.glade'))
  20. self.chooser1.connect_signals(self)
  21. self.chooser = self.chooser1.get_object("filechooserdialog1")
  22. # treeview
  23. self.treeview1 = self.chooser1.get_object("treeview1")
  24. # create a TreeStore with one string column to use as the model
  25. #self.treestore = self.treeview1.get_model()
  26. self.treestore = Gtk.ListStore(str,int)
  27. self.cell = Gtk.CellRendererText()
  28. # set the model for TreeView
  29. self.treeview1.set_model(self.treestore)
  30. self.tvcolumn = Gtk.TreeViewColumn(_('Filename'))
  31. self.treeview1.append_column(self.tvcolumn)
  32. # add the cell to the tvcolumn and allow it to expand
  33. self.tvcolumn.pack_start(self.cell, True)
  34. # set the cell "text" attribute to column 0 - retrieve text
  35. # from that column in treestore
  36. self.tvcolumn.add_attribute(self.cell, 'text', 0)
  37. ## self.tvcolumn = Gtk.TreeViewColumn(_('Pages'))
  38. ## self.treeview1.append_column(self.tvcolumn)
  39. ## self.tvcolumn.pack_start(self.cell, True)
  40. ## self.tvcolumn.add_attribute(self.cell, 'text', 1)
  41. # Allow drag and drop reordering of rows
  42. self.treeview1.set_reorderable(True)
  43. # load files in parameter list
  44. for key in self.inputFiles_a :
  45. self.treestore.append([self.inputFiles_a[key], 0])
  46. old_dir = ""
  47. old_name = ""
  48. chooser = self.chooser1.get_object("filechooserdialog1")
  49. chooser.set_current_folder(mru_dir)
  50. chooser.set_select_multiple(True)
  51. filter_all = Gtk.FileFilter()
  52. filter_all.set_name(_('All files'))
  53. filter_all.add_pattern('*')
  54. chooser.add_filter(filter_all)
  55. filter_pdf = Gtk.FileFilter()
  56. filter_pdf.set_name(_('PDF files'))
  57. filter_pdf.add_mime_type('application/pdf')
  58. filter_pdf.add_pattern('*.pdf')
  59. chooser.add_filter(filter_pdf)
  60. chooser.set_filter(filter_pdf)
  61. response = chooser.run()
  62. def chooserClose(self, widget) :
  63. self.chooser.destroy()
  64. def chooserOK(self, widget) :
  65. self.treestore.clear()
  66. self.genFilesArray()
  67. self.chooser.destroy()
  68. def pdf_remove(self, widget) :
  69. selection = self.treeview1.get_selection()
  70. #sel = selection.get_selected_rows()
  71. model, iter0 = selection.get_selected()
  72. model.remove(iter0)
  73. def pdf_up(self, widget) :
  74. selection = self.treeview1.get_selection()
  75. model, iter0 = selection.get_selected()
  76. string = model.get_string_from_iter(iter0)
  77. newpos = int(string) - 1
  78. if newpos < 0 : newpos = 0
  79. newpos = model.get_iter_from_string(str(newpos))
  80. model.move_before(iter0, newpos)
  81. def pdf_down(self, widget) :
  82. selection = self.treeview1.get_selection()
  83. model, iter0 = selection.get_selected()
  84. model.move_after(iter0, model.iter_next(iter0))
  85. # clears the list and open a file
  86. def pdf_open(self,widget) :
  87. self.treestore.clear()
  88. self.add_file("")
  89. def add_file(self, widget):
  90. for filename in self.chooser.get_filenames():
  91. if os.path.isfile(filename):
  92. # FIXME
  93. ## f = Gio.File(filename)
  94. ## f_info = f.query_info('standard::content-type')
  95. ## mime_type = f_info.get_content_type()
  96. mime_type = ".pdf"
  97. if mime_type == 'application/pdf' or mime_type == '.pdf':
  98. self.loadPdfFile(filename)
  99. else :
  100. print(_('File type not supported!'))
  101. else:
  102. print(_('File %s does not exist') % filename)
  103. def loadPdfFile(self,filename) :
  104. pdfFile = PdfFileReader(open(filename, "rb"))
  105. numpages = pdfFile.getNumPages()
  106. self.treestore.append([filename, numpages])
  107. # regenerate the array of files (easier to use than the treestore)
  108. def genFilesArray(self, dummy = "") :
  109. inputFiles_a = {}
  110. selectedFiles1 = self.chooser.get_filenames()
  111. # eliminate directories
  112. selectedFiles = []
  113. for file_u in selectedFiles1 :
  114. if os.path.isdir(file_u) :
  115. alert(_("You have chosen a directory, it is not supported"))
  116. else :
  117. # FIXME
  118. ## f = gio.File(filename)
  119. ## f_info = f.query_info('standard::content-type')
  120. ## mime_type = f_info.get_content_type()
  121. ## if mime_type == 'application/pdf' or mime_type == '.pdf':
  122. ## self.loadPdfFile(filename)
  123. ## else :
  124. ## print(_('File type not supported!'))
  125. selectedFiles.append(file_u)
  126. if len(selectedFiles) == 0 :
  127. print(_('Closed, no files selected'))
  128. return
  129. size_i = len(self.treestore)
  130. if size_i == 0 : # nothing in the list
  131. for i in range(len(selectedFiles)) :
  132. inputFiles_a[i + 1] = selectedFiles[i]
  133. else : # use the list
  134. for i in range(size_i) :
  135. iter0 = self.treestore.get_iter(i)
  136. filename_s = self.treestore.get_value(iter0,0)
  137. inputFiles_a[i + 1] = filename_s
  138. self.inputFiles_a = inputFiles_a