From a4c270c44fc240050e7a385a7750661ca90c5763 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 14:55:59 +0800 Subject: [PATCH 01/19] Fix the poppler problem --- src/gpdfx | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/gpdfx b/src/gpdfx index 8e194bc..97e443f 100755 --- a/src/gpdfx +++ b/src/gpdfx @@ -25,14 +25,17 @@ # # Further information about the GNU GPL is available at: # http://www.gnu.org/copyleft/gpl.ja.html -import pygtk -pygtk.require('2.0') -import gtk -import poppler + +import gi +from gi import pygtkcompat +pygtkcompat.enable() +pygtkcompat.enable_gtk(version='3.0') +from gi.repository import Gtk as gtk +gi.require_version('Poppler', '0.18') +from gi.repository import Poppler import sys, os import cairo - class Poprender(object): def __init__(self): self.fn = os.path.expanduser(sys.argv[1]) @@ -41,7 +44,7 @@ class Poprender(object): uri = "file://" + self.fn try: - self.document = poppler.document_new_from_file (uri, None) + self.document = Poppler.Document.new_from_file (uri, None) except: sys.exit(1) @@ -60,7 +63,8 @@ class Poprender(object): self.win.connect("delete-event", gtk.main_quit) adjust = gtk.Adjustment(1, 1, self.n_pages, 1, 5) - page_selector = gtk.SpinButton(adjust, 0, 0); + page_selector = gtk.SpinButton() + page_selector.set_adjustment(adjust) page_selector.connect("value-changed", self.on_changed) lab = gtk.Label('Page') @@ -74,7 +78,8 @@ class Poprender(object): hbox.pack_start(page_selector, False, False, 0) adjust = gtk.Adjustment(100, 25, 400, 25, 100) - scale_selector = gtk.SpinButton(adjust, 0, 0); + scale_selector = gtk.SpinButton() + scale_selector.set_adjustment(adjust) scale_selector.connect("value-changed", self.on_scale_changed) lab = gtk.Label('Zoom/%') @@ -96,7 +101,7 @@ class Poprender(object): self.dwg = gtk.DrawingArea() self.dwg.set_size_request(int(self.width), int(self.height)) - self.dwg.connect("expose-event", self.on_expose) + self.dwg.connect("draw", self.on_expose) self.sw.connect("button-press-event", self.on_btn_down) self.sw.connect("button-release-event", self.on_btn_up) @@ -114,6 +119,12 @@ class Poprender(object): self.win.add(vbox) self.win.show_all() + self.sel_x=0 + self.sel2_x=0 + self.sel_y=0 + self.sel2_y=0 + self.btn_down=False + def sel_pos_clip(self): if self.sel_x>self.width: self.sel_x=self.width @@ -140,18 +151,21 @@ class Poprender(object): self.sel2_y=event.y/self.scale self.sel_pos_clip() self.sel = True + self.btn_down = True def on_btn_up(self, widget, event): self.sel2_x=event.x/self.scale self.sel2_y=event.y/self.scale self.sel_pos_clip() self.dwg.queue_draw() + self.btn_down = False def on_mouse_move(self, widget, event): - self.sel2_x=event.x/self.scale - self.sel2_y=event.y/self.scale - self.sel_pos_clip() - self.dwg.queue_draw() + if self.btn_down: + self.sel2_x=event.x/self.scale + self.sel2_y=event.y/self.scale + self.sel_pos_clip() + self.dwg.queue_draw() def on_changed(self, widget): self.n_page = widget.get_value_as_int() @@ -236,7 +250,7 @@ if __name__ == '__main__': pop = Poprender() pop.main() else: - print "Usage:" - print os.path.basename(sys.argv[0]) + " filename.pdf" + print("Usage:") + print(os.path.basename(sys.argv[0]) + " filename.pdf") except KeyboardInterrupt: __name__ From dbe2e24fb789e8da194b7dd0deea1cb975a44639 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 15:38:32 +0800 Subject: [PATCH 02/19] Port to GTK+3 --- src/gpdfx | 61 +++++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/src/gpdfx b/src/gpdfx index 97e443f..2b743ec 100755 --- a/src/gpdfx +++ b/src/gpdfx @@ -6,6 +6,8 @@ # v2[Goldschmidt]: Use expanduser, expandvars. Use self.fn instead of fn. # v3[Lehner]: Use self.fn in argument of exportPdf. # +# Copyright (C) 2016 Yishi Lin +# # All programs in this directory and subdirectories are published under the GNU # General Public License as described below. # @@ -27,12 +29,9 @@ # http://www.gnu.org/copyleft/gpl.ja.html import gi -from gi import pygtkcompat -pygtkcompat.enable() -pygtkcompat.enable_gtk(version='3.0') -from gi.repository import Gtk as gtk +gi.require_version('Gtk', '3.0') gi.require_version('Poppler', '0.18') -from gi.repository import Poppler +from gi.repository import Poppler, Gtk, Gdk import sys, os import cairo @@ -42,7 +41,7 @@ class Poprender(object): self.fn = os.path.expandvars(self.fn) self.fn = os.path.abspath(self.fn) uri = "file://" + self.fn - + try: self.document = Poppler.Document.new_from_file (uri, None) except: @@ -57,49 +56,49 @@ class Poprender(object): self.scale = 1 self.sel = False - self.win = gtk.Window(gtk.WINDOW_TOPLEVEL) + self.win = Gtk.Window() self.win.set_default_size(600, 600) self.win.set_title(self.fn) - self.win.connect("delete-event", gtk.main_quit) + self.win.connect("delete-event", Gtk.main_quit) - adjust = gtk.Adjustment(1, 1, self.n_pages, 1, 5) - page_selector = gtk.SpinButton() + adjust = Gtk.Adjustment(1, 1, self.n_pages, 1, 5) + page_selector = Gtk.SpinButton() page_selector.set_adjustment(adjust) page_selector.connect("value-changed", self.on_changed) - lab = gtk.Label('Page') + lab = Gtk.Label('Page') - hbox = gtk.HBox(False, 0) + hbox = Gtk.HBox(False, 0) - vbox = gtk.VBox(False, 0) + vbox = Gtk.VBox(False, 0) vbox.pack_start(hbox, False, False, 0) hbox.pack_start(lab, False, False, 4) hbox.pack_start(page_selector, False, False, 0) - adjust = gtk.Adjustment(100, 25, 400, 25, 100) - scale_selector = gtk.SpinButton() + adjust = Gtk.Adjustment(100, 25, 400, 25, 100) + scale_selector = Gtk.SpinButton() scale_selector.set_adjustment(adjust) scale_selector.connect("value-changed", self.on_scale_changed) - lab = gtk.Label('Zoom/%') + lab = Gtk.Label('Zoom/%') hbox.pack_start(lab, False, False, 4) hbox.pack_start(scale_selector, False, False, 0) - b_scan_fonts = gtk.Button('Selection to PDF') + b_scan_fonts = Gtk.Button('Selection to PDF') b_scan_fonts.connect("clicked", self.on_export) - b_clear_sel = gtk.Button('Clear Selection') + b_clear_sel = Gtk.Button('Clear Selection') b_clear_sel.connect("clicked", self.on_clear_sel) hbox.pack_start(b_clear_sel, False, False, 4) hbox.pack_start(b_scan_fonts, False, False, 0) - self.sw = gtk.ScrolledWindow() - self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + self.sw = Gtk.ScrolledWindow() + self.sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - self.dwg = gtk.DrawingArea() + self.dwg = Gtk.DrawingArea() self.dwg.set_size_request(int(self.width), int(self.height)) self.dwg.connect("draw", self.on_expose) @@ -107,12 +106,12 @@ class Poprender(object): self.sw.connect("button-release-event", self.on_btn_up) self.sw.connect("motion-notify-event", self.on_mouse_move) - eventbox = gtk.EventBox() + eventbox = Gtk.EventBox() eventbox.add(self.dwg) self.sw.add_with_viewport(eventbox) - self.dwg.modify_bg(gtk.STATE_NORMAL, - gtk.gdk.Color(50000,50000,50000)) + self.dwg.modify_bg(Gtk.StateFlags.NORMAL, + Gdk.Color(50000,50000,50000)) vbox.pack_start(self.sw, True, True, 0) @@ -199,7 +198,7 @@ class Poprender(object): cr.fill() def on_expose(self, widget, event): - cr = widget.window.cairo_create() + cr = widget.get_property('window').cairo_create() self.cr_draw(cr,self.width,self.height,self.scale) def on_clear_sel(self, widget): @@ -219,13 +218,13 @@ class Poprender(object): self.sel_y=self.sel2_y self.sel2_y=tmp - ch = gtk.FileChooserDialog("Filename for selection PDF",None, - gtk.FILE_CHOOSER_ACTION_SAVE, - (gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN,gtk.RESPONSE_OK)) + ch = Gtk.FileChooserDialog("Filename for selection PDF",None, + Gtk.FileChooserAction.SAVE, + (Gtk.STOCK_CANCEL,Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN,Gtk.ResponseType.OK)) ch.set_do_overwrite_confirmation(True) fnout = None - if ch.run() == gtk.RESPONSE_OK: + if ch.run() == Gtk.ResponseType.OK: fnout = ch.get_filename() ch.destroy() @@ -236,7 +235,7 @@ class Poprender(object): self.height-self.sel2_y) def main(self): - gtk.main() + Gtk.main() def exportPdf(fn,fnout,npage,left,top,right,bottom): From 674e53617930ddf2d9cf2102b65d8d29f7e2ec79 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 16:31:56 +0800 Subject: [PATCH 03/19] Remove clear botton --- src/gpdfx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/gpdfx b/src/gpdfx index 2b743ec..5db7a19 100755 --- a/src/gpdfx +++ b/src/gpdfx @@ -89,10 +89,6 @@ class Poprender(object): b_scan_fonts = Gtk.Button('Selection to PDF') b_scan_fonts.connect("clicked", self.on_export) - b_clear_sel = Gtk.Button('Clear Selection') - b_clear_sel.connect("clicked", self.on_clear_sel) - - hbox.pack_start(b_clear_sel, False, False, 4) hbox.pack_start(b_scan_fonts, False, False, 0) self.sw = Gtk.ScrolledWindow() @@ -201,10 +197,6 @@ class Poprender(object): cr = widget.get_property('window').cairo_create() self.cr_draw(cr,self.width,self.height,self.scale) - def on_clear_sel(self, widget): - self.sel = False - self.dwg.queue_draw() - def on_export(self, widget): if self.sel: From d38a081ffb0f0fa3ceef8e4992a9c5104de4349f Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 17:42:30 +0800 Subject: [PATCH 04/19] Add auto fit page size --- src/gpdfx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/gpdfx b/src/gpdfx index 5db7a19..d4bbad6 100755 --- a/src/gpdfx +++ b/src/gpdfx @@ -86,6 +86,10 @@ class Poprender(object): hbox.pack_start(lab, False, False, 4) hbox.pack_start(scale_selector, False, False, 0) + b_auto_fig = Gtk.Button('Auto Fit') + b_auto_fig.connect("clicked", self.on_auto_fig) + hbox.pack_start(b_auto_fig, False, False, 0) + b_scan_fonts = Gtk.Button('Selection to PDF') b_scan_fonts.connect("clicked", self.on_export) @@ -193,6 +197,13 @@ class Poprender(object): cr.set_source_rgba(0, 0, 1, 0.2) cr.fill() + def on_auto_fig(self, widget): + self.scale = min(self.win.get_size().width / self.width, + self.win.get_size().height / self.height) + self.dwg.set_size_request(int(self.width*self.scale), + int(self.height*self.scale)) + self.dwg.queue_draw() + def on_expose(self, widget, event): cr = widget.get_property('window').cairo_create() self.cr_draw(cr,self.width,self.height,self.scale) From a90ddc25b726e16aa3cd1dd889a8de361fee6998 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 20:27:04 +0800 Subject: [PATCH 05/19] Cleanup --- src/gpdfx | 204 ++++++++++++++++++++++++++---------------------------- 1 file changed, 99 insertions(+), 105 deletions(-) diff --git a/src/gpdfx b/src/gpdfx index d4bbad6..18081e8 100755 --- a/src/gpdfx +++ b/src/gpdfx @@ -4,7 +4,7 @@ # # v1[Lehner]: Original version # v2[Goldschmidt]: Use expanduser, expandvars. Use self.fn instead of fn. -# v3[Lehner]: Use self.fn in argument of exportPdf. +# v3[Lehner]: Use self.fn in argument of export_pdf. # # Copyright (C) 2016 Yishi Lin # @@ -31,156 +31,158 @@ import gi gi.require_version('Gtk', '3.0') gi.require_version('Poppler', '0.18') -from gi.repository import Poppler, Gtk, Gdk -import sys, os +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import Poppler +import sys +import os import cairo -class Poprender(object): + +class PopRender(object): def __init__(self): + # Initialize variables + self.sel_x = 0 + self.sel2_x = 0 + self.sel_y = 0 + self.sel2_y = 0 + self.btn_down = False + self.sel = False + self.scale = 1 + + # Open document self.fn = os.path.expanduser(sys.argv[1]) self.fn = os.path.expandvars(self.fn) self.fn = os.path.abspath(self.fn) uri = "file://" + self.fn try: - self.document = Poppler.Document.new_from_file (uri, None) + self.document = Poppler.Document.new_from_file(uri, None) except: sys.exit(1) self.n_pages = self.document.get_n_pages() - self.current_page = self.document.get_page(0) self.n_page = 1 self.width, self.height = self.current_page.get_size() - self.scale = 1 - self.sel = False - + # Initialize window self.win = Gtk.Window() self.win.set_default_size(600, 600) self.win.set_title(self.fn) self.win.connect("delete-event", Gtk.main_quit) - adjust = Gtk.Adjustment(1, 1, self.n_pages, 1, 5) - page_selector = Gtk.SpinButton() - page_selector.set_adjustment(adjust) - page_selector.connect("value-changed", self.on_changed) - - lab = Gtk.Label('Page') - hbox = Gtk.HBox(False, 0) - vbox = Gtk.VBox(False, 0) vbox.pack_start(hbox, False, False, 0) + # Page up/down + adjust = Gtk.Adjustment(self.n_page, 1, self.n_pages, 1, 5) + page_selector = Gtk.SpinButton() + page_selector.set_adjustment(adjust) + page_selector.connect("value-changed", self.on_page_changed) + lab = Gtk.Label('Page') hbox.pack_start(lab, False, False, 4) hbox.pack_start(page_selector, False, False, 0) - adjust = Gtk.Adjustment(100, 25, 400, 25, 100) + # Zoom in/out + adjust = Gtk.Adjustment(self.scale * 100, 25, 400, 25, 100) scale_selector = Gtk.SpinButton() scale_selector.set_adjustment(adjust) scale_selector.connect("value-changed", self.on_scale_changed) - - lab = Gtk.Label('Zoom/%') - + lab = Gtk.Label('Zoom') hbox.pack_start(lab, False, False, 4) hbox.pack_start(scale_selector, False, False, 0) - b_auto_fig = Gtk.Button('Auto Fit') - b_auto_fig.connect("clicked", self.on_auto_fig) - hbox.pack_start(b_auto_fig, False, False, 0) + # Auto fit + b_auto_fit = Gtk.Button('Auto Fit') + b_auto_fit.connect("clicked", self.on_auto_fit) + hbox.pack_start(b_auto_fit, False, False, 0) - b_scan_fonts = Gtk.Button('Selection to PDF') - b_scan_fonts.connect("clicked", self.on_export) - - hbox.pack_start(b_scan_fonts, False, False, 0) + # Export to PDF + b_export_pdf = Gtk.Button('Selection to PDF') + b_export_pdf.connect("clicked", self.on_export) + hbox.pack_start(b_export_pdf, False, False, 0) + # Scrolled windows (display PDF) self.sw = Gtk.ScrolledWindow() self.sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - self.dwg = Gtk.DrawingArea() self.dwg.set_size_request(int(self.width), int(self.height)) self.dwg.connect("draw", self.on_expose) + # Connect events self.sw.connect("button-press-event", self.on_btn_down) self.sw.connect("button-release-event", self.on_btn_up) self.sw.connect("motion-notify-event", self.on_mouse_move) eventbox = Gtk.EventBox() eventbox.add(self.dwg) - self.sw.add_with_viewport(eventbox) - self.dwg.modify_bg(Gtk.StateFlags.NORMAL, - Gdk.Color(50000,50000,50000)) vbox.pack_start(self.sw, True, True, 0) + # Start window self.win.add(vbox) self.win.show_all() - self.sel_x=0 - self.sel2_x=0 - self.sel_y=0 - self.sel2_y=0 - self.btn_down=False - def sel_pos_clip(self): - if self.sel_x>self.width: - self.sel_x=self.width - if self.sel2_x>self.width: - self.sel2_x=self.width - if self.sel_y>self.height: - self.sel_y=self.height - if self.sel2_y>self.height: - self.sel2_y=self.height - - if self.sel_x<0: - self.sel_x=0 - if self.sel2_x<0: - self.sel2_x=0 - if self.sel_y<0: - self.sel_y=0 - if self.sel2_y<0: - self.sel2_y=0 + self.sel_x = min(self.sel_x, self.width) + self.sel_y = min(self.sel_y, self.height) + self.sel2_x = min(self.sel2_x, self.width) + self.sel2_y = min(self.sel2_y, self.height) + + self.sel_x = max(self.sel_x, 0) + self.sel_y = max(self.sel_y, 0) + self.sel2_x = max(self.sel2_x, 0) + self.sel2_y = max(self.sel2_y, 0) def on_btn_down(self, widget, event): - self.sel_x=event.x/self.scale - self.sel_y=event.y/self.scale - self.sel2_x=event.x/self.scale - self.sel2_y=event.y/self.scale + self.sel_x = event.x / self.scale + self.sel_y = event.y / self.scale + self.sel2_x = event.x / self.scale + self.sel2_y = event.y / self.scale self.sel_pos_clip() self.sel = True self.btn_down = True def on_btn_up(self, widget, event): - self.sel2_x=event.x/self.scale - self.sel2_y=event.y/self.scale + self.sel2_x = event.x / self.scale + self.sel2_y = event.y / self.scale self.sel_pos_clip() self.dwg.queue_draw() - self.btn_down = False + self.btn_down = False def on_mouse_move(self, widget, event): if self.btn_down: - self.sel2_x=event.x/self.scale - self.sel2_y=event.y/self.scale + self.sel2_x = event.x / self.scale + self.sel2_y = event.y / self.scale self.sel_pos_clip() self.dwg.queue_draw() - def on_changed(self, widget): + def on_page_changed(self, widget): self.n_page = widget.get_value_as_int() - self.current_page = self.document.get_page(widget.get_value_as_int()-1) + self.current_page = self.document.get_page(widget.get_value_as_int() - + 1) self.width, self.height = self.current_page.get_size() - self.dwg.set_size_request(int(self.width*self.scale), - int(self.height*self.scale)) + self.dwg.set_size_request( + int(self.width * self.scale), int(self.height * self.scale)) + self.dwg.queue_draw() + + def on_auto_fit(self, widget): + self.scale = min(self.win.get_size().width / self.width, + self.win.get_size().height / self.height) + self.dwg.set_size_request( + int(self.width * self.scale), int(self.height * self.scale)) self.dwg.queue_draw() def on_scale_changed(self, widget): - self.scale = widget.get_value_as_int()/100.0 - self.dwg.set_size_request(int(self.width*self.scale), - int(self.height*self.scale)) + self.scale = widget.get_value_as_int() / 100.0 + self.dwg.set_size_request( + int(self.width * self.scale), int(self.height * self.scale)) self.dwg.queue_draw() - def cr_draw(self,cr,width,height,scale): + def cr_draw(self, cr, width, height, scale): if scale != 1: cr.scale(scale, scale) cr.set_source_rgb(1, 1, 1) @@ -191,65 +193,57 @@ class Poprender(object): if self.sel: cr.set_source_rgba(0, 0, 0.5, 0.9) cr.set_line_width(1) - cr.rectangle(self.sel_x,self.sel_y,self.sel2_x-self.sel_x, - self.sel2_y-self.sel_y) + cr.rectangle(self.sel_x, self.sel_y, self.sel2_x - self.sel_x, + self.sel2_y - self.sel_y) cr.stroke_preserve() cr.set_source_rgba(0, 0, 1, 0.2) cr.fill() - def on_auto_fig(self, widget): - self.scale = min(self.win.get_size().width / self.width, - self.win.get_size().height / self.height) - self.dwg.set_size_request(int(self.width*self.scale), - int(self.height*self.scale)) - self.dwg.queue_draw() - def on_expose(self, widget, event): cr = widget.get_property('window').cairo_create() - self.cr_draw(cr,self.width,self.height,self.scale) + self.cr_draw(cr, self.width, self.height, self.scale) def on_export(self, widget): if self.sel: - if self.sel_x>self.sel2_x: - tmp=self.sel_x - self.sel_x=self.sel2_x - self.sel2_x=tmp + if self.sel_x > self.sel2_x: + tmp = self.sel_x + self.sel_x = self.sel2_x + self.sel2_x = tmp - if self.sel_y>self.sel2_y: - tmp=self.sel_y - self.sel_y=self.sel2_y - self.sel2_y=tmp + if self.sel_y > self.sel2_y: + tmp = self.sel_y + self.sel_y = self.sel2_y + self.sel2_y = tmp - ch = Gtk.FileChooserDialog("Filename for selection PDF",None, - Gtk.FileChooserAction.SAVE, - (Gtk.STOCK_CANCEL,Gtk.ResponseType.CANCEL, - Gtk.STOCK_OPEN,Gtk.ResponseType.OK)) + ch = Gtk.FileChooserDialog( + "Filename for selection PDF", None, Gtk.FileChooserAction.SAVE, + (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, + Gtk.ResponseType.OK)) ch.set_do_overwrite_confirmation(True) fnout = None if ch.run() == Gtk.ResponseType.OK: fnout = ch.get_filename() ch.destroy() - if fnout!=None: - exportPdf(self.fn,fnout,self.n_page, - self.sel_x,self.sel_y, - self.width-self.sel2_x, - self.height-self.sel2_y) + if fnout != None: + export_pdf(self.fn, fnout, self.n_page, self.sel_x, self.sel_y, + self.width - self.sel2_x, self.height - self.sel2_y) def main(self): Gtk.main() -def exportPdf(fn,fnout,npage,left,top,right,bottom): - os.system("clipdfx \"" + fn + "\" \"" + fnout + "\" " + str(npage) + " " - + str(left) + " " + str(top) + " " + str(right) + " " - + str(bottom)) +def export_pdf(fn, fnout, npage, left, top, right, bottom): + os.system("clipdfx \"" + fn + "\" \"" + fnout + "\" " + str(npage) + " " + + str(left) + " " + str(top) + " " + str(right) + " " + str( + bottom)) + if __name__ == '__main__': try: - if len(sys.argv)==2: - pop = Poprender() + if len(sys.argv) == 2: + pop = PopRender() pop.main() else: print("Usage:") From 3ce9097941b03e534c1d7a406943af9c813d5659 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 20:34:40 +0800 Subject: [PATCH 06/19] Add open file button --- src/gpdfx | 89 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 28 deletions(-) diff --git a/src/gpdfx b/src/gpdfx index 18081e8..06690e5 100755 --- a/src/gpdfx +++ b/src/gpdfx @@ -49,41 +49,34 @@ class PopRender(object): self.btn_down = False self.sel = False self.scale = 1 - - # Open document - self.fn = os.path.expanduser(sys.argv[1]) - self.fn = os.path.expandvars(self.fn) - self.fn = os.path.abspath(self.fn) - uri = "file://" + self.fn - - try: - self.document = Poppler.Document.new_from_file(uri, None) - except: - sys.exit(1) - - self.n_pages = self.document.get_n_pages() - self.current_page = self.document.get_page(0) + self.width = 1 + self.height = 1 + self.current_page = None self.n_page = 1 - self.width, self.height = self.current_page.get_size() # Initialize window self.win = Gtk.Window() self.win.set_default_size(600, 600) - self.win.set_title(self.fn) + self.win.set_title("gpdfx") self.win.connect("delete-event", Gtk.main_quit) hbox = Gtk.HBox(False, 0) vbox = Gtk.VBox(False, 0) vbox.pack_start(hbox, False, False, 0) + # Open file + b_open_file = Gtk.Button("Choose File") + b_open_file.connect("clicked", self.on_file_clicked) + hbox.pack_start(b_open_file, False, False, 0) + # Page up/down - adjust = Gtk.Adjustment(self.n_page, 1, self.n_pages, 1, 5) - page_selector = Gtk.SpinButton() - page_selector.set_adjustment(adjust) - page_selector.connect("value-changed", self.on_page_changed) + adjust = Gtk.Adjustment(self.n_page, 1, self.n_page, 1, 5) + self.page_selector = Gtk.SpinButton() + self.page_selector.set_adjustment(adjust) + self.page_selector.connect("value-changed", self.on_page_changed) lab = Gtk.Label('Page') hbox.pack_start(lab, False, False, 4) - hbox.pack_start(page_selector, False, False, 0) + hbox.pack_start(self.page_selector, False, False, 0) # Zoom in/out adjust = Gtk.Adjustment(self.scale * 100, 25, 400, 25, 100) @@ -126,6 +119,49 @@ class PopRender(object): self.win.add(vbox) self.win.show_all() + def on_file_clicked(self, widget): + dialog = Gtk.FileChooserDialog( + "Please choose a file", None, Gtk.FileChooserAction.OPEN, + (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, + Gtk.ResponseType.OK)) + + response = dialog.run() + if response == Gtk.ResponseType.OK: + self.fn = dialog.get_filename() + + # Open document + uri = "file://" + self.fn + print("File selected: " + uri) + try: + self.document = Poppler.Document.new_from_file(uri, None) + except: + sys.exit(1) + self.n_pages = self.document.get_n_pages() + self.current_page = self.document.get_page(0) + self.width, self.height = self.current_page.get_size() + + # Set window title + self.win.set_title(self.fn) + + # Set page range + self.n_page = 1 + adjust = Gtk.Adjustment(1, 1, self.n_pages, 1, 5) + self.page_selector.set_adjustment(adjust) + + # Load pdf + self.scale = min(self.win.get_size().width / self.width, + self.win.get_size().height / self.height) + self.dwg.set_size_request( + int(self.width * self.scale), int(self.height * self.scale)) + self.dwg.queue_draw() + self.dwg.modify_bg(Gtk.StateFlags.NORMAL, + Gdk.Color(50000, 50000, 50000)) + + elif response == Gtk.ResponseType.CANCEL: + print("Cancel clicked") + + dialog.destroy() + def sel_pos_clip(self): self.sel_x = min(self.sel_x, self.width) self.sel_y = min(self.sel_y, self.height) @@ -188,7 +224,8 @@ class PopRender(object): cr.set_source_rgb(1, 1, 1) cr.rectangle(0, 0, width, height) cr.fill() - self.current_page.render(cr) + if self.current_page != None: + self.current_page.render(cr) if self.sel: cr.set_source_rgba(0, 0, 0.5, 0.9) @@ -242,11 +279,7 @@ def export_pdf(fn, fnout, npage, left, top, right, bottom): if __name__ == '__main__': try: - if len(sys.argv) == 2: - pop = PopRender() - pop.main() - else: - print("Usage:") - print(os.path.basename(sys.argv[0]) + " filename.pdf") + pop = PopRender() + pop.main() except KeyboardInterrupt: __name__ From 6fb09477e6deceac40ac63c0eff5d1d1d0484054 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 20:49:50 +0800 Subject: [PATCH 07/19] Update logic --- src/gpdfx | 69 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/src/gpdfx b/src/gpdfx index 06690e5..a285bba 100755 --- a/src/gpdfx +++ b/src/gpdfx @@ -51,7 +51,7 @@ class PopRender(object): self.scale = 1 self.width = 1 self.height = 1 - self.current_page = None + self.opened_file = False self.n_page = 1 # Initialize window @@ -136,6 +136,8 @@ class PopRender(object): self.document = Poppler.Document.new_from_file(uri, None) except: sys.exit(1) + + self.opened_file = True self.n_pages = self.document.get_n_pages() self.current_page = self.document.get_page(0) self.width, self.height = self.current_page.get_size() @@ -190,51 +192,54 @@ class PopRender(object): self.btn_down = False def on_mouse_move(self, widget, event): - if self.btn_down: + if self.opened_file and self.btn_down: self.sel2_x = event.x / self.scale self.sel2_y = event.y / self.scale self.sel_pos_clip() self.dwg.queue_draw() def on_page_changed(self, widget): - self.n_page = widget.get_value_as_int() - self.current_page = self.document.get_page(widget.get_value_as_int() - - 1) - self.width, self.height = self.current_page.get_size() - self.dwg.set_size_request( - int(self.width * self.scale), int(self.height * self.scale)) - self.dwg.queue_draw() + if self.opened_file: + self.n_page = widget.get_value_as_int() + page = widget.get_value_as_int() - 1 + self.current_page = self.document.get_page(page) + self.width, self.height = self.current_page.get_size() + self.dwg.set_size_request( + int(self.width * self.scale), int(self.height * self.scale)) + self.dwg.queue_draw() def on_auto_fit(self, widget): - self.scale = min(self.win.get_size().width / self.width, - self.win.get_size().height / self.height) - self.dwg.set_size_request( - int(self.width * self.scale), int(self.height * self.scale)) - self.dwg.queue_draw() + if self.opened_file: + self.scale = min(self.win.get_size().width / self.width, + self.win.get_size().height / self.height) + self.dwg.set_size_request( + int(self.width * self.scale), int(self.height * self.scale)) + self.dwg.queue_draw() def on_scale_changed(self, widget): - self.scale = widget.get_value_as_int() / 100.0 - self.dwg.set_size_request( - int(self.width * self.scale), int(self.height * self.scale)) - self.dwg.queue_draw() + if self.opened_file: + self.scale = widget.get_value_as_int() / 100.0 + self.dwg.set_size_request( + int(self.width * self.scale), int(self.height * self.scale)) + self.dwg.queue_draw() def cr_draw(self, cr, width, height, scale): - if scale != 1: - cr.scale(scale, scale) - cr.set_source_rgb(1, 1, 1) - cr.rectangle(0, 0, width, height) - cr.fill() - if self.current_page != None: + if self.opened_file: + if scale != 1: + cr.scale(scale, scale) + cr.set_source_rgb(1, 1, 1) + cr.rectangle(0, 0, width, height) + cr.fill() self.current_page.render(cr) - if self.sel: - cr.set_source_rgba(0, 0, 0.5, 0.9) - cr.set_line_width(1) - cr.rectangle(self.sel_x, self.sel_y, self.sel2_x - self.sel_x, - self.sel2_y - self.sel_y) - cr.stroke_preserve() - cr.set_source_rgba(0, 0, 1, 0.2) - cr.fill() + if self.sel: + cr.set_source_rgba(0, 0, 0.5, 0.9) + cr.set_line_width(1) + cr.rectangle(self.sel_x, self.sel_y, self.sel2_x - self.sel_x, + self.sel2_y - self.sel_y) + cr.stroke_preserve() + cr.set_source_rgba(0, 0, 1, 0.2) + cr.fill() def on_expose(self, widget, event): cr = widget.get_property('window').cairo_create() From 138256faca38caae8e0f7814454e244a5964d01d Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 20:56:36 +0800 Subject: [PATCH 08/19] Add status bar --- src/gpdfx | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/gpdfx b/src/gpdfx index a285bba..256cb35 100755 --- a/src/gpdfx +++ b/src/gpdfx @@ -115,6 +115,15 @@ class PopRender(object): vbox.pack_start(self.sw, True, True, 0) + # the statusbar + self.statusbar = Gtk.Statusbar() + # its context_id - not shown in the UI but needed to uniquely identify + # the source of a message + self.context_id = self.statusbar.get_context_id("example") + # we push a message onto the statusbar's stack + self.statusbar.push(self.context_id, "Please open a file...") + vbox.pack_start(self.statusbar, False, False, 0) + # Start window self.win.add(vbox) self.win.show_all() @@ -137,7 +146,6 @@ class PopRender(object): except: sys.exit(1) - self.opened_file = True self.n_pages = self.document.get_n_pages() self.current_page = self.document.get_page(0) self.width, self.height = self.current_page.get_size() @@ -158,6 +166,10 @@ class PopRender(object): self.dwg.queue_draw() self.dwg.modify_bg(Gtk.StateFlags.NORMAL, Gdk.Color(50000, 50000, 50000)) + self.opened_file = True + + # Update status bar + self.statusbar.push(self.context_id, "File: {}".format(self.fn)) elif response == Gtk.ResponseType.CANCEL: print("Cancel clicked") @@ -197,6 +209,10 @@ class PopRender(object): self.sel2_y = event.y / self.scale self.sel_pos_clip() self.dwg.queue_draw() + self.statusbar.push( + self.context_id, + 'Selected area: {:.2f} {:.2f} {:.2f} {:.2f}'.format( + self.sel_x, self.sel_y, self.sel2_x, self.sel2_y)) def on_page_changed(self, widget): if self.opened_file: @@ -272,6 +288,9 @@ class PopRender(object): export_pdf(self.fn, fnout, self.n_page, self.sel_x, self.sel_y, self.width - self.sel2_x, self.height - self.sel2_y) + self.statusbar.push(self.context_id, + 'Export to file: {}'.format(fnout)) + def main(self): Gtk.main() From 24249cae8818bd1318fa37477f648fd7fd21aeca Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 21:23:15 +0800 Subject: [PATCH 09/19] Add viewport(LaTeX) --- src/gpdfx | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/gpdfx b/src/gpdfx index 256cb35..8455f40 100755 --- a/src/gpdfx +++ b/src/gpdfx @@ -53,6 +53,7 @@ class PopRender(object): self.height = 1 self.opened_file = False self.n_page = 1 + self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) # Initialize window self.win = Gtk.Window() @@ -65,7 +66,7 @@ class PopRender(object): vbox.pack_start(hbox, False, False, 0) # Open file - b_open_file = Gtk.Button("Choose File") + b_open_file = Gtk.Button("Open") b_open_file.connect("clicked", self.on_file_clicked) hbox.pack_start(b_open_file, False, False, 0) @@ -97,6 +98,11 @@ class PopRender(object): b_export_pdf.connect("clicked", self.on_export) hbox.pack_start(b_export_pdf, False, False, 0) + # Copy area coord + b_copy_coord = Gtk.Button('Viewport (LaTeX)') + b_copy_coord.connect("clicked", self.on_copy_coord) + hbox.pack_start(b_copy_coord, False, False, 0) + # Scrolled windows (display PDF) self.sw = Gtk.ScrolledWindow() self.sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) @@ -283,7 +289,6 @@ class PopRender(object): if ch.run() == Gtk.ResponseType.OK: fnout = ch.get_filename() ch.destroy() - if fnout != None: export_pdf(self.fn, fnout, self.n_page, self.sel_x, self.sel_y, self.width - self.sel2_x, self.height - self.sel2_y) @@ -291,6 +296,19 @@ class PopRender(object): self.statusbar.push(self.context_id, 'Export to file: {}'.format(fnout)) + def on_copy_coord(self, widget): + # Here: top left corner = (0,0) + llx = min(self.sel_x, self.sel2_x) + lly = max(self.sel_y, self.sel2_y) + urx = max(self.sel_x, self.sel2_x) + ury = min(self.sel_y, self.sel2_y) + # Viewport in latex: lower left corner = (0,0) + viewport = '{:.2f} {:.2f} {:.2f} {:.2f}'.format(llx, self.height - lly, + urx, self.height - ury) + self.clipboard.set_text(viewport, -1) + self.statusbar.push(self.context_id, + 'Copied viewport (LaTeX): ' + viewport) + def main(self): Gtk.main() From df014d61c220ffeb0952f92007193d308390f65c Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 21:42:43 +0800 Subject: [PATCH 10/19] Put buttons in a flowbox --- src/gpdfx | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/gpdfx b/src/gpdfx index 8455f40..e0b0ed9 100755 --- a/src/gpdfx +++ b/src/gpdfx @@ -61,14 +61,20 @@ class PopRender(object): self.win.set_title("gpdfx") self.win.connect("delete-event", Gtk.main_quit) - hbox = Gtk.HBox(False, 0) vbox = Gtk.VBox(False, 0) - vbox.pack_start(hbox, False, False, 0) + + # Put buttons in a flowbox + flowbox = Gtk.FlowBox() + flowbox.set_valign(Gtk.Align.START) + flowbox.set_min_children_per_line(5) + flowbox.set_max_children_per_line(30) + flowbox.set_selection_mode(Gtk.SelectionMode.NONE) + vbox.pack_start(flowbox, False, False, 0) # Open file b_open_file = Gtk.Button("Open") b_open_file.connect("clicked", self.on_file_clicked) - hbox.pack_start(b_open_file, False, False, 0) + flowbox.add(b_open_file) # Page up/down adjust = Gtk.Adjustment(self.n_page, 1, self.n_page, 1, 5) @@ -76,8 +82,8 @@ class PopRender(object): self.page_selector.set_adjustment(adjust) self.page_selector.connect("value-changed", self.on_page_changed) lab = Gtk.Label('Page') - hbox.pack_start(lab, False, False, 4) - hbox.pack_start(self.page_selector, False, False, 0) + flowbox.add(lab) + flowbox.add(self.page_selector) # Zoom in/out adjust = Gtk.Adjustment(self.scale * 100, 25, 400, 25, 100) @@ -85,23 +91,23 @@ class PopRender(object): scale_selector.set_adjustment(adjust) scale_selector.connect("value-changed", self.on_scale_changed) lab = Gtk.Label('Zoom') - hbox.pack_start(lab, False, False, 4) - hbox.pack_start(scale_selector, False, False, 0) + flowbox.add(lab) + flowbox.add(scale_selector) # Auto fit b_auto_fit = Gtk.Button('Auto Fit') b_auto_fit.connect("clicked", self.on_auto_fit) - hbox.pack_start(b_auto_fit, False, False, 0) + flowbox.add(b_auto_fit) # Export to PDF b_export_pdf = Gtk.Button('Selection to PDF') b_export_pdf.connect("clicked", self.on_export) - hbox.pack_start(b_export_pdf, False, False, 0) + flowbox.add(b_export_pdf) # Copy area coord b_copy_coord = Gtk.Button('Viewport (LaTeX)') b_copy_coord.connect("clicked", self.on_copy_coord) - hbox.pack_start(b_copy_coord, False, False, 0) + flowbox.add(b_copy_coord) # Scrolled windows (display PDF) self.sw = Gtk.ScrolledWindow() @@ -118,15 +124,11 @@ class PopRender(object): eventbox = Gtk.EventBox() eventbox.add(self.dwg) self.sw.add_with_viewport(eventbox) - vbox.pack_start(self.sw, True, True, 0) - # the statusbar + # The statusbar self.statusbar = Gtk.Statusbar() - # its context_id - not shown in the UI but needed to uniquely identify - # the source of a message self.context_id = self.statusbar.get_context_id("example") - # we push a message onto the statusbar's stack self.statusbar.push(self.context_id, "Please open a file...") vbox.pack_start(self.statusbar, False, False, 0) @@ -208,6 +210,10 @@ class PopRender(object): self.sel_pos_clip() self.dwg.queue_draw() self.btn_down = False + self.statusbar.push( + self.context_id, + 'Selected area: {:.2f} {:.2f} {:.2f} {:.2f}'.format( + self.sel_x, self.sel_y, self.sel2_x, self.sel2_y)) def on_mouse_move(self, widget, event): if self.opened_file and self.btn_down: From c8abb2475cdcf3ef286d14690a06fea81f8b85d2 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 21:44:56 +0800 Subject: [PATCH 11/19] Rename readme --- readme.txt => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename readme.txt => README.md (100%) diff --git a/readme.txt b/README.md similarity index 100% rename from readme.txt rename to README.md From b625e73d28d6ec5fc8d107ea73b288b927eea775 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Wed, 4 May 2016 22:05:04 +0800 Subject: [PATCH 12/19] Update readme --- README.md | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4ce7ed4..3e5400c 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,44 @@ - gpdfx - a graphical tool to extract parts of a PDF as a PDF ------------------------------------------------------------------------------- +=============================== -gpdfx is a GTK application written in Python using the Poppler library +`gpdfx` is a GTK application written in Python using the Poppler library to render the PDF. It uses pdfTeX and PDFCrop to create the extracted PDF. -Author - * Christoph Lehner (clehner // users.sourceforge.net) +# Features +My improvements to the ancient `gpdfx`: + +- Add a "Open" button (open file). +- Add a "Auto Fit" botton. It helps to fit the pdf file according to the size of the window. +- Add a button "Viewport". It copies the "viewport" of the selected area to the clipboard. +- Add a status bar. + +# Install + +Dependency +- Python2 or Python3 +- poppler-glib +- python-gobject +- gtk3 +- python-cairo + +Clone files in `gpdfx/src` to some directory in your PATH + +# Usage +- Run `gpdfx` and open a pdf file. +- Select an area. +- Export the selection to a pdf file, or copy the "viewport" to the clipboard. + +## Viewport +If you want to insert the selected area of your pdf file in a LaTeX document, you may find the following codes useful. +``` + \begin{figure}[ht] + \includegraphics[clip, page=1, viewport=1 2 3 4, + width=1.0\textwidth, fbox]{paper.pdf} + \end{figure} +``` + +Upstream +-------- +- https://github.com/lehner/gpdfx +- Author: Christoph Lehner (clehner // users.sourceforge.net) From de771e39e4701144dd172b98b23287d21667e906 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Thu, 5 May 2016 14:03:15 +0800 Subject: [PATCH 13/19] Clean up (clipdfx -> gpdfx) --- src/clipdfx | 73 ----------------------------------------------------- src/gpdfx | 40 +++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 78 deletions(-) delete mode 100755 src/clipdfx diff --git a/src/clipdfx b/src/clipdfx deleted file mode 100755 index e722bc6..0000000 --- a/src/clipdfx +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2011 Christoph Lehner, Nathan Goldschmidt -# -# v1[Lehner]: Original version -# v2[Goldschmidt]: Use ghostscript to remove invisible content, format FN -# v3[Lehner]: Streamline code -# -# All programs in this directory and subdirectories are published under the GNU -# General Public License as described below. -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 59 Temple -# Place, Suite 330, Boston, MA 02111-1307 USA -# -# Further information about the GNU GPL is available at: -# http://www.gnu.org/copyleft/gpl.ja.html - -# -# Assign arguments -# -fn=$1 -fnout=$2 -page=$3 -left=$4 -top=$5 -right=$6 -bottom=$7 - -# -# Create temporary directory -# -tdir=$(mktemp -d) -mkdir -p $tdir - -# -# Use a simple filename for LaTeX with .pdf extension -# -cp -f "$fn" $tdir/i.pdf - -# -# Use LaTeX to extract the -# -cat > $tdir/o.tex < Date: Thu, 5 May 2016 14:05:20 +0800 Subject: [PATCH 14/19] Update readme --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3e5400c..a5b8d1c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -gpdfx - a graphical tool to extract parts of a PDF as a PDF +gpdfx-ng - a graphical tool to extract parts of a PDF as a PDF =============================== -`gpdfx` is a GTK application written in Python using the Poppler library +`gpdfx-ng` is a GTK application written in Python using the Poppler library to render the PDF. It uses pdfTeX and PDFCrop to create the extracted PDF. @@ -14,7 +14,6 @@ My improvements to the ancient `gpdfx`: - Add a status bar. # Install - Dependency - Python2 or Python3 - poppler-glib @@ -22,8 +21,6 @@ Dependency - gtk3 - python-cairo -Clone files in `gpdfx/src` to some directory in your PATH - # Usage - Run `gpdfx` and open a pdf file. - Select an area. From ddbdd9617e432511a1cbe844ca6c8869bfa9aee8 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Thu, 5 May 2016 15:30:41 +0800 Subject: [PATCH 15/19] Add install --- README.md | 3 +++ install.sh | 2 ++ 2 files changed, 5 insertions(+) create mode 100755 install.sh diff --git a/README.md b/README.md index a5b8d1c..69d8358 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,9 @@ Dependency - gtk3 - python-cairo +The one line script `install.sh` helps to install (copy) `gpdfx` to your PATH, +in you want. + # Usage - Run `gpdfx` and open a pdf file. - Select an area. diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..2e6f335 --- /dev/null +++ b/install.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo install -Dm 755 src/gpdfx /usr/local/bin/gpdfx From f5cf0446809e276a3b3c174b39c1c0f1b2c6eb40 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Thu, 5 May 2016 15:36:15 +0800 Subject: [PATCH 16/19] Rename as gpdfx-ng --- README.md | 4 ++-- install.sh | 2 +- src/{gpdfx => gpdfx-ng} | 0 3 files changed, 3 insertions(+), 3 deletions(-) rename src/{gpdfx => gpdfx-ng} (100%) diff --git a/README.md b/README.md index 69d8358..3f73ef3 100644 --- a/README.md +++ b/README.md @@ -21,11 +21,11 @@ Dependency - gtk3 - python-cairo -The one line script `install.sh` helps to install (copy) `gpdfx` to your PATH, +The one line script `install.sh` helps to install (copy) `gpdfx-ng` to your PATH, in you want. # Usage -- Run `gpdfx` and open a pdf file. +- Run `gpdfx-ng` and open a pdf file. - Select an area. - Export the selection to a pdf file, or copy the "viewport" to the clipboard. diff --git a/install.sh b/install.sh index 2e6f335..2be824e 100755 --- a/install.sh +++ b/install.sh @@ -1,2 +1,2 @@ #!/bin/bash -sudo install -Dm 755 src/gpdfx /usr/local/bin/gpdfx +sudo install -Dm 755 src/gpdfx-ng /usr/local/bin/gpdfx-ng diff --git a/src/gpdfx b/src/gpdfx-ng similarity index 100% rename from src/gpdfx rename to src/gpdfx-ng From c2b50442087f457e1ef19d4809b03dca560d9fe0 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Thu, 5 May 2016 15:42:44 +0800 Subject: [PATCH 17/19] Update script --- install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/install.sh b/install.sh index 2be824e..710e52f 100755 --- a/install.sh +++ b/install.sh @@ -1,2 +1,3 @@ #!/bin/bash +set -x sudo install -Dm 755 src/gpdfx-ng /usr/local/bin/gpdfx-ng From 95217b39840a1f40e574cec082a9c8c566aa2ea9 Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Mon, 13 Jun 2016 17:11:30 +0800 Subject: [PATCH 18/19] Open argv[1] on startup --- README.md | 2 +- src/gpdfx-ng | 75 +++++++++++++++++++++++++++++----------------------- 2 files changed, 43 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 3f73ef3..ba1cf8c 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ The one line script `install.sh` helps to install (copy) `gpdfx-ng` to your PATH in you want. # Usage -- Run `gpdfx-ng` and open a pdf file. +- Run `gpdfx-ng` and open a pdf file. You can also pass a file name the through command line argument. - Select an area. - Export the selection to a pdf file, or copy the "viewport" to the clipboard. diff --git a/src/gpdfx-ng b/src/gpdfx-ng index 225d1ad..c7c1de0 100755 --- a/src/gpdfx-ng +++ b/src/gpdfx-ng @@ -133,10 +133,51 @@ class PopRender(object): self.statusbar.push(self.context_id, "Please open a file...") vbox.pack_start(self.statusbar, False, False, 0) + # Try to open argv[1] + if len(sys.argv)==2: + self.fn = os.path.expanduser(sys.argv[1]) + self.fn = os.path.expandvars(self.fn) + self.fn = os.path.abspath(self.fn) + self.open_file() + # Start window self.win.add(vbox) self.win.show_all() + def open_file(self): + # Open document + uri = "file://" + self.fn + print("File selected: " + uri) + try: + self.document = Poppler.Document.new_from_file(uri, None) + except: + sys.exit(1) + + self.n_pages = self.document.get_n_pages() + self.current_page = self.document.get_page(0) + self.width, self.height = self.current_page.get_size() + + # Set window title + self.win.set_title(self.fn) + + # Set page range + self.n_page = 1 + adjust = Gtk.Adjustment(1, 1, self.n_pages, 1, 5) + self.page_selector.set_adjustment(adjust) + + # Load pdf + self.scale = min(self.win.get_size().width / self.width, + self.win.get_size().height / self.height) + self.dwg.set_size_request( + int(self.width * self.scale), int(self.height * self.scale)) + self.dwg.queue_draw() + self.dwg.modify_bg(Gtk.StateFlags.NORMAL, + Gdk.Color(50000, 50000, 50000)) + self.opened_file = True + + # Update status bar + self.statusbar.push(self.context_id, "File: {}".format(self.fn)) + def on_file_clicked(self, widget): dialog = Gtk.FileChooserDialog( "Please choose a file", None, Gtk.FileChooserAction.OPEN, @@ -146,39 +187,7 @@ class PopRender(object): response = dialog.run() if response == Gtk.ResponseType.OK: self.fn = dialog.get_filename() - - # Open document - uri = "file://" + self.fn - print("File selected: " + uri) - try: - self.document = Poppler.Document.new_from_file(uri, None) - except: - sys.exit(1) - - self.n_pages = self.document.get_n_pages() - self.current_page = self.document.get_page(0) - self.width, self.height = self.current_page.get_size() - - # Set window title - self.win.set_title(self.fn) - - # Set page range - self.n_page = 1 - adjust = Gtk.Adjustment(1, 1, self.n_pages, 1, 5) - self.page_selector.set_adjustment(adjust) - - # Load pdf - self.scale = min(self.win.get_size().width / self.width, - self.win.get_size().height / self.height) - self.dwg.set_size_request( - int(self.width * self.scale), int(self.height * self.scale)) - self.dwg.queue_draw() - self.dwg.modify_bg(Gtk.StateFlags.NORMAL, - Gdk.Color(50000, 50000, 50000)) - self.opened_file = True - - # Update status bar - self.statusbar.push(self.context_id, "File: {}".format(self.fn)) + self.open_file() elif response == Gtk.ResponseType.CANCEL: print("Cancel clicked") From c42ef900e1658c723cb9e116908b7f8d06cddeef Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Mon, 13 Jun 2016 17:38:32 +0800 Subject: [PATCH 19/19] Fix the trim problem --- src/gpdfx-ng | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gpdfx-ng b/src/gpdfx-ng index c7c1de0..7eba9f5 100755 --- a/src/gpdfx-ng +++ b/src/gpdfx-ng @@ -344,13 +344,15 @@ def export_pdf(fn, fnout, npage, left, top, right, bottom): # Use LaTeX to extract the lines = """ -\\documentclass{{article}} -\\usepackage[left=0cm,right=0cm,bottom=0cm,top=0cm]{{geometry}} +\\documentclass{{standalone}} \\usepackage{{graphicx}} \\begin{{document}} \\includegraphics[page={0},trim={1} {2} {3} {4},clip]{{{5}/i.pdf}} \\end{{document}} """.format(npage, left, bottom, right, top, temp_dir) + + print(left,bottom,right,top) + with open('o.tex', 'w') as output: output.write(lines) os.system('pdflatex ' + 'o.tex')