📄 poppler.ksh
字号:
#!/bin/ksh## (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:# -PDKSH on Zenwalk 4.8, 5.2# -Korn93 on Slamd12##-------------------------------------------------------------------------------------------------# 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/.gtk4korn || $CFG -nt $HOME/.gtk4korn ]]; then print "# Embedded GTK functions for KornShell" > $HOME/.gtk4korn while read LINE do if [[ $LINE == +(FUNCTION_NAME*) ]]; then TMP=${LINE#*= } print "function ${TMP%%,*}" >> $HOME/.gtk4korn print "{\nprint -p ${TMP%%,*} \$@" >> $HOME/.gtk4korn print "read -p GTK\n}" >> $HOME/.gtk4korn fi done < $CFGfi# Declare global variablestypeset GTK NULL="NULL"unset CFG PIPE LINE# 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}#-------------------------------------------------------------------------------------------------# Include the generated '.gtk4korn'-file in the shellscript to use embedded GTK functions. $HOME/.gtk4korn# Start GTK-servergtk-server -stdin |&# 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 "'KornShell 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 + -