Next: bash

Pages

Showing posts with label bash. Show all posts
Showing posts with label bash. Show all posts

Bash GUI for QPDF (using Python)


 

Step 1: Create a python program called mergePDF.py

import PySimpleGUIQt as sg
import sys
import os 

arg = sys.argv[1:] 

current_working_directory = os.getcwd() + "/undefined.pdf"
current_working_directory = "/home/max/Scrivania" + "/undefined.pdf"


class Listbox(sg.Listbox):

    def dragEnterEvent(self, e):
        e.accept()

    def dragMoveEvent(self, e):
        e.accept()

    def dropEvent(self, e):
        data = window['LISTBOX'].get_list_values()
        items = [str(v).replace("PySide2.QtCore.QUrl('file://", "").replace("')", "") for v in e.mimeData().urls()]
        for x in items:
          if (x[-4:].upper() != '.PDF'): items.remove(x)        
        data.extend(items)
        window['LISTBOX'].update(data)
        window.refresh()

    def enable_drop(self):
        self.Widget.setAcceptDrops(True)
        self.Widget.dragEnterEvent = self.dragEnterEvent
        self.Widget.dragMoveEvent = self.dragMoveEvent
        self.Widget.dropEvent = self.dropEvent
        
file_list_column = [
     [ 
        Listbox(arg, size=(50, 10), enable_events=True, key='LISTBOX', select_mode="single"), 
     ],
     [
        sg.Input(default_text=current_working_directory, key='FOLDER')
     ],       
]

image_button_move_column = [  
   [sg.Button("Up")],
   [sg.Button("Down")],
   [sg.Button("Delete")],  
]
       

image_button_action_column = [
   [
      sg.Button("Merge")
   ],
]

layout = [
   [
        sg.Column(file_list_column),
        sg.VSeperator(),
        sg.Column(image_button_move_column),
        sg.VSeperator(),
        sg.Column(image_button_action_column),
   ]
]   

window = sg.Window("pdfMerge V1.0", layout, finalize=True, resizable=False)
window['LISTBOX'].enable_drop()

def retreive_elem_selected(element):
    if element['LISTBOX']: 
       item = element['LISTBOX'][0]
    else: item = ""    
    return item      


def manage_up(item, mylist):
    if item:
       pos = mylist.index(item)
       newpos = pos-1
       if newpos>-1:
          mylist.insert(
             newpos,
             mylist.pop(pos)
            )  
    return mylist
       
def manage_down(item, mylist):
    if item:
       pos = mylist.index(item)
       newpos = pos+1
       mylist.insert(
             newpos,
             mylist.pop(pos)
            )  
    return mylist       
       

def manage_delete(item, mylist):
    if item:
       mylist.remove(item)
    return mylist 
    
def manage_merge(mylist,myfile):
    if myfile:
       str1 = " ".join(str("\""+x+"\"") for x in mylist) 
       os.system("qpdf --empty --pages "+ str1 + " -- " + myfile)  
    else: sg.popup('','The output field is empty') 
    
while True:

    event, values = window.read()
    
    item_selected = retreive_elem_selected(values)
    mylist = window['LISTBOX'].get_list_values()
    
    if event == sg.WINDOW_CLOSED:
       break
        
    if event == 'Merge':
       manage_merge(mylist,window['FOLDER'].get())    
       
    if event == 'Up':
       window['LISTBOX'].update(manage_up(item_selected,mylist))
       window['LISTBOX'].set_value(item_selected)
             
    if event == 'Down':
       window['LISTBOX'].update(manage_down(item_selected,mylist))
       window['LISTBOX'].set_value(item_selected)
       
    if event == 'Delete': 
       if item_selected:
          pos = mylist.index(item_selected)
          window['LISTBOX'].update(manage_delete(item_selected,mylist))
          mylist = window['LISTBOX'].get_list_values()
          if mylist:
             if pos < len(mylist): 
                window['LISTBOX'].set_value(mylist[pos])
             else: window['LISTBOX'].set_value(mylist[-1:])                    

   
    
window.close()
  
Step 2:  create a bash file mergePDF.sh to run the mergePDF.py

#!/bin/bash
python3 /home/max/batfile/Py/mergePDF.py "$@"
  
where /home/max/batfile/Py/ is the path where your python file is stored

Step 3:  create a link of mergePDF.sh file into scripts folder
    in my case into /home/max/.local/share/nautilus/scripts
  

GUI for SECurity

Create a file called security.sh under ~/myscript directory
 
#!/bin/bash

unsecAction()
{
  retValue=$(zenity --password   --title="SECurity")
  
  case $? in
      0)
		 	password=$(echo $retValue | cut -d'|' -f1) 
		 	~/bin/security $fileSec $password
			;;
	  1)
            endmenu
            ;;
     -1)
		    endmenu
		   ;;
  esac  
	  
   
}

secAction()
{
  retValue=$(zenity --forms --title="SECurity" --text="Add a security password" --add-password="Password" --add-password="Re-password" )
  
  case $? in
      0)
		 	password1=$(echo $retValue | cut -d'|' -f1)
		 	password2=$(echo $retValue | cut -d'|' -f2) 
		 	
		 	if [ $password1 == $password2 ]
            then         
              ~/bin/security $fileSec $password1           
            else
              zenity --info --text="Different Passwords" 
              secAction       
            fi		 	
			;;
	  1)
            endmenu
            ;;
     -1)
		    endmenu
		   ;;
  esac  
	  
   
}

endmenu() {
  echo "Bye bye."
  exit 0;
}


mainmenu() 
{
 declare -i count
 count=0
 
 IFS=$(echo -en "\n\b")
 read -ra files <<< "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" 
   
 for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
 do
     let count++
 done
 
 
 
 if [ $count -gt 1 ]
 then
   zenity --info --text="Select only one file"
 else
 
   if [ -f $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ]
   then
       ext="${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS##*.}"
       fileSec=$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
       
       if [ $ext == "sec" ]
       then         
         unsecAction           
       else
        secAction        
       fi
	      
   else
	   zenity --info --text="Select a file. It's a directory"   
   fi 
 fi
}

mainmenu

create a link of security.sh file called SECurity
and move it under ~/.local/share/nautilus/scripts

run the command 

chmod +x ~/myscript/security.sh
chmod +x ~/.local/share/nautilus/scripts/SECurity

Now when you open the context menu you will see:




Now download this file (security) from  here   
and put under ~/bin directory

then run the command:

chmod +x ~/bin/security

Bash GUI for QPDF

 
#!/bin/bash

endmenu() {
  echo "Bye bye."
  exit 0;
}

getDestinationFile() 
{
   retValue=$(zenity --file-selection  --save --file-filter='PDF files (pdf) | *.pdf' --title="Select a PDF file (Destination)")
 
	case $? in
		0)
		    destinationPDFFile=$retValue
		    ;;
	esac
}

getOriginFiles() 
{
   retValue=$(zenity --file-selection  --multiple --file-filter='PDF files (pdf) | *.pdf' --title="Select a PDF files to merge")
 
	case $? in
		0)
		    originPDFFiles=$retValue
		    ;;
	esac
}

showOriginFiles()
{
   declare -i index
   index=1
   mylistFiles=()
   tmpmylistFiles=()
   IFS='|' 
   
   read -ra files <<< "$originPDFFiles"  
   for file in "${files[@]}";
   do
 	 tmpmylistFiles+=("$file" ) 
   done
   
   readarray -t tmpmylistFiles < <(printf '%s\n' "${tmpmylistFiles[@]}" | sort)
      
   for file in "${tmpmylistFiles[@]}";
   do
 	 mylistFiles+=("$index" "$file" )
	 let index++
   done    
   
   retValue=$(zenity --list  --hide-header --height=400 --width=700  --title='Files To Merge' --column=ID --column=Files  "${mylistFiles[@]}" ) 
   echo $retValue
 
}

mergeFiles()
{
   mylistFiles=()
   IFS='|'
   continua=1
   
   if [ -z "${destinationPDFFile}" ]; then   
     zenity --info --text="No destination file selected."
     continua=0
   fi
   
   if [ $continua == 1 ]; then 
	   if [ -z "${originPDFFiles}" ]; then   
		 zenity --info --text="No select files to merge."
		 continua=0
	   fi   
   fi
   
   if [ $continua == 1 ]; then
   
	   read -ra files <<< "$originPDFFiles"  
	   for file in "${files[@]}";
	   do
	   echo $file
		 mylistFiles+=("$file" ) 
		 let index++
	   done  
	   
	   readarray -t mylistFiles < <(printf '%s\n' "${mylistFiles[@]}" | sort)
	   
	   qpdf --empty --pages "${mylistFiles[@]}" -- "${destinationPDFFile}"
   fi   
}

mainmenu() 
{
	choice=$(zenity --height=250 --list  --hide-header --text "Select action" --ok-label="Select" --cancel-label="Exit" \
	                --title "Main Menu - Merge file" --radiolist  --column="ID" --column="Action" \
	                1 "File Destination" 2 "Add Files To Merge" 3 "View Files To Merge" 4 "Merge" )

	case $choice in
		     "File Destination")
								getDestinationFile
								mainmenu
		            			;;
		     "Add Files To Merge") 
								getOriginFiles
								mainmenu
		            			;;
		     "View Files To Merge")
							   showOriginFiles                   		     
							   mainmenu
		           			   ;; 
		     "Merge")
		                       mergeFiles
		                       mainmenu
		           	           ;;
	esac

}




mainmenu