📄 poppler.bash
字号:
#!/bin/bash## (c) Peter van Eerten 2008, GPL license## Using the Poppler library with GTK-server. Reading the pages in a PDF document.## Homepage of the Poppler library: http://poppler.freedesktop.org/## Tested with:# -GNU bash, version 3.1.17(2)-release (i486-slackware-linux-gnu)##-------------------------------------------------------------------------------------------------# Pipe filename must be unique for your applicationPIPE="/tmp/gtk.bash.\$$"# Find GTK-server configfile firstif [[ -f gtk-server.cfg ]]; then CFG=gtk-server.cfgelif [[ -f /etc/gtk-server.cfg ]]; then CFG=/etc/gtk-server.cfgelif [[ -f /usr/local/etc/gtk-server.cfg ]]; then CFG=/usr/local/etc/gtk-server.cfgelse echo "No GTK-server configfile found! Please install GTK-server..." exit 1fi# Now create global functionnames from GTK APIif [[ ! -f $HOME/.gtk4bash || $CFG -nt $HOME/.gtk4bash ]]; then echo "#!/bin/bash" > $HOME/.gtk4bash echo "gtk-server -fifo=$PIPE &" >> $HOME/.gtk4bash echo "while [ ! -p $PIPE ]; do continue; done" >> $HOME/.gtk4bash while read LINE do if [[ $LINE = FUNCTION_NAME* ]]; then LINE=${LINE#*= } printf "\nfunction ${LINE%%,*}\n" >> $HOME/.gtk4bash printf "{\n/bin/echo ${LINE%%,*} \$@ > $PIPE" >> $HOME/.gtk4bash printf "\nread GTK < $PIPE\n}\n" >> $HOME/.gtk4bash fi done < $CFGfi# Declare global variablesdeclare GTK NULL="NULL"unset CFG PIPE LINE# Include the generated file to use embedded GTK functions. ${HOME}/.gtk4bash# Assignment functionfunction define() { $2 $3 $4 $5 $6 $7 $8 $9; eval $1="\"$GTK\""; }#-------------------------------------------------------------------------------------------------function PDF_Display{if [[ -n $DOC && $DOC != "0" ]]then let PNR=$NR-1 # Get the page define PAGE poppler_document_get_page $DOC $PNR # Free current pixbuf g_object_unref $PIX # Get the size of the page define SIZE poppler_page_get_size $PAGE 0 0 define X lrint ${SIZE% *} define Y lrint ${SIZE#* } # Get zoom factor define ZOOM gtk_combo_box_get_active $COMBO ((ZOOM+=1)) # Define new pixbuf let X=$X*$ZOOM let Y=$Y*$ZOOM define PIX gdk_pixbuf_new 0 0 8 $X $Y gtk_image_set_from_pixbuf $IMAGE $PIX poppler_page_render_to_pixbuf $PAGE 0 0 $X $Y $ZOOM 0 $PIXfi}#-------------------------------------------------------------------------------------------------# Check availability of Poppler library firstdefine AVAIL gtk_server_require "libpoppler-glib.so"if [[ $AVAIL != "ok" ]]then echo "Install the poppler libraries from http://poppler.freedesktop.org first, then run this demo again." gtk_server_exit exitfi# Define GUIgtk_init $NULL $NULLdefine WINDOW gtk_window_new 0gtk_window_set_title $WINDOW "'Bash PDF Reader'"gtk_window_set_position $WINDOW 1# Create the pixbufdefine PIX gdk_pixbuf_new 0 0 8 700 700 # Create widget to display imagedefine IMAGE gtk_image_newgtk_image_set_from_pixbuf $IMAGE $PIXdefine EBOX gtk_event_box_newgtk_container_add $EBOX $IMAGEdefine SW gtk_scrolled_window_new $NULL $NULLgtk_widget_set_size_request $SW 300 300gtk_scrolled_window_set_policy $SW 1 1gtk_scrolled_window_set_shadow_type $SW 1gtk_scrolled_window_add_with_viewport $SW $EBOX# Connect scroll eventgtk_server_connect_after $EBOX "scroll-event" "scroll-event" 1# Separatordefine SEP gtk_hseparator_new# Open buttondefine OPEN gtk_button_new_from_stock "gtk-open"# Spin button - no floats in PDKSHdefine COMBO gtk_combo_box_new_textgtk_combo_box_append_text $COMBO "'zoom 1x'"gtk_combo_box_append_text $COMBO "'zoom 2x'"gtk_combo_box_append_text $COMBO "'zoom 3x'"gtk_combo_box_append_text $COMBO "'zoom 4x'"gtk_combo_box_append_text $COMBO "'zoom 5x'"gtk_combo_box_set_active $COMBO 1# Page numberdefine BW gtk_button_newdefine BW_PIC gtk_image_new_from_stock "gtk-go-back" 4gtk_widget_set_size_request $BW 40 30gtk_container_add $BW $BW_PICdefine FRAME gtk_frame_newlet NR=0define LABEL gtk_label_new "' $NR of 0 pages '"gtk_container_add $FRAME $LABELdefine FW gtk_button_newdefine FW_PIC gtk_image_new_from_stock "gtk-go-forward" 4gtk_widget_set_size_request $FW 40 30gtk_container_add $FW $FW_PIC# Exit buttondefine EXIT gtk_button_new_from_stock "gtk-quit"# Now arrange widgets on window using boxesdefine HBOX gtk_hbox_new 0 0gtk_box_pack_start $HBOX $OPEN 0 0 1gtk_box_pack_start $HBOX $COMBO 0 0 1gtk_box_pack_start $HBOX $BW 0 0 1gtk_box_pack_start $HBOX $FRAME 0 0 1gtk_box_pack_start $HBOX $FW 0 0 1gtk_box_pack_end $HBOX $EXIT 0 0 1define VBOX gtk_vbox_new 0 0gtk_box_pack_start $VBOX $SW 1 1 1gtk_box_pack_start $VBOX $SEP 0 0 1gtk_box_pack_end $VBOX $HBOX 0 0 1gtk_container_add $WINDOW $VBOX# Create file open dialogdefine FILEDIALOG gtk_window_new 0gtk_window_set_title $FILEDIALOG "'Open PDF file'"gtk_window_set_icon_name $FILEDIALOG "harddrive"gtk_window_set_transient_for $FILEDIALOG $WINDOWgtk_window_set_position $FILEDIALOG 4gtk_window_set_default_size $FILEDIALOG 600 500define SELECTOR gtk_file_chooser_widget_new 0define FILTER gtk_file_filter_newgtk_file_filter_set_name $FILTER "'PDF files (*.pdf)'"gtk_file_filter_add_pattern $FILTER "'*.pdf'"gtk_file_chooser_add_filter $SELECTOR $FILTERdefine OKFILE gtk_button_new_from_stock "gtk-open"define CANFILE gtk_button_new_from_stock "gtk-cancel"# Arrange widgets on windowdefine VBOXFILE gtk_vbox_new 0 0define HBOXFILE gtk_hbox_new 0 0gtk_box_pack_end $HBOXFILE $OKFILE 0 0 1gtk_box_pack_end $HBOXFILE $CANFILE 0 0 1gtk_box_pack_start $VBOXFILE $SELECTOR 1 1 1gtk_box_pack_start $VBOXFILE $HBOXFILE 0 0 1gtk_container_add $FILEDIALOG $VBOXFILE# Redefine the g_object_get callgtk_server_redefine "g_object_get NONE NONE 4 WIDGET STRING PTR_DOUBLE NULL"# Show all widgetsgtk_widget_show_all $WINDOW# Mainloopwhile [[ $EVENT != $EXIT && $EVENT != $WINDOW ]]do define EVENT gtk_server_callback "wait" case $EVENT in $OPEN) let NR=1 gtk_widget_show_all $FILEDIALOG;; $FILEDIALOG) gtk_widget_hide $FILEDIALOG;; $OKFILE) define FILE gtk_file_chooser_get_filename $SELECTOR gtk_widget_hide $FILEDIALOG define DOC poppler_document_new_from_file "'file://localhost$FILE'" $NULL $NULL if [[ $DOC != "0" ]] then PDF_Display # Scroll up define ADJ gtk_scrolled_window_get_vadjustment $SW gtk_adjustment_set_value $ADJ 0 define AMOUNT poppler_document_get_n_pages $DOC gtk_label_set_text $LABEL "' $NR of $AMOUNT pages '" gtk_window_set_title $WINDOW "'KornShell PDF Reader - ${FILE##*/}'" fi;; $CANFILE) gtk_widget_hide $FILEDIALOG;; $COMBO) PDF_Display;; $BW) if [[ -n $DOC && $DOC != "0" ]] then define AMOUNT poppler_document_get_n_pages $DOC ((NR-=1)) if [[ $NR -lt 1 ]] then let NR=$AMOUNT fi gtk_label_set_text $LABEL "' $NR of $AMOUNT pages '" PDF_Display # Scroll up define ADJ gtk_scrolled_window_get_vadjustment $SW gtk_adjustment_set_value $ADJ 0 fi;; $FW) if [[ -n $DOC && $DOC != "0" ]] then define AMOUNT poppler_document_get_n_pages $DOC ((NR+=1)) if [[ $NR -gt $AMOUNT ]] then NR=1 fi gtk_label_set_text $LABEL "' $NR of $AMOUNT pages '" PDF_Display # Scroll up define ADJ gtk_scrolled_window_get_vadjustment $SW gtk_adjustment_set_value $ADJ 0 fi;; "scroll-event") if [[ -n $DOC && $DOC != "0" ]] then # First get current value of slider define ADJ gtk_scrolled_window_get_vadjustment $SW define VAL gtk_adjustment_get_value $ADJ define VAL lrint $VAL # Now get current maximum possible value define UPPER g_object_get $ADJ "upper" 0 0 define UPPER lrint ${UPPER} # Also get page size define PSIZE g_object_get $ADJ "page-size" 0 0 define PSIZE lrint ${PSIZE} # Calculate limitation of Adjustment (see GTK doc) let DIFF=$UPPER-$PSIZE define AMOUNT poppler_document_get_n_pages $DOC define MOUSE gtk_server_mouse 3 if [[ $MOUSE = "1" ]] then if [[ $VAL -ge $DIFF ]] then ((NR+=1)) if [[ $NR -gt $AMOUNT ]] then NR=1 fi gtk_label_set_text $LABEL "' $NR of $AMOUNT pages '" PDF_Display # Scroll up gtk_adjustment_set_value $ADJ 0 fi fi if [[ $MOUSE = "0" ]] then if [[ $VAL -le 0 ]] then ((NR-=1)) if [[ $NR -lt 1 ]] then let NR=$AMOUNT fi gtk_label_set_text $LABEL "' $NR of $AMOUNT pages '" PDF_Display # Scroll down gtk_adjustment_set_value $ADJ $UPPER fi fi fi;; esac # Refresh Pixmap to GtkImage widget gtk_widget_queue_draw $IMAGEdone# Exit GTKgtk_server_exit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -