Merge pull request #385 from HollowMan6/rotate-pdf

Add PDF Rotation function for PDF viewer #379
master
Matthew Zeng 6 years ago committed by GitHub
commit 9d2f60dfeb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 78
      app/pdf-viewer/buffer.py
  2. 2
      eaf.el

@ -80,16 +80,18 @@ class AppBuffer(Buffer):
self.scroll_down()
def save_session_data(self):
return "{0}:{1}:{2}:{3}".format(self.buffer_widget.scroll_offset,
return "{0}:{1}:{2}:{3}:{4}".format(self.buffer_widget.scroll_offset,
self.buffer_widget.scale,
self.buffer_widget.read_mode,
self.buffer_widget.inverted_mode)
self.buffer_widget.inverted_mode,
self.buffer_widget.rotation)
def restore_session_data(self, session_data):
(scroll_offset, scale, read_mode, inverted_mode) = session_data.split(":")
(scroll_offset, scale, read_mode, inverted_mode, rotation) = session_data.split(":")
self.buffer_widget.scroll_offset = float(scroll_offset)
self.buffer_widget.scale = float(scale)
self.buffer_widget.read_mode = read_mode
self.buffer_widget.rotation = int(rotation)
if self.emacs_var_dict["eaf-pdf-dark-mode"] == "ignore":
self.buffer_widget.inverted_mode = inverted_mode == "True"
self.buffer_widget.update()
@ -206,11 +208,16 @@ class PdfViewerWidget(QWidget):
self.first_pixmap = self.document.getPagePixmap(0)
self.page_width = self.first_pixmap.width
self.page_height = self.first_pixmap.height
self.original_page_width = self.page_width
self.original_page_height = self.page_height
self.page_total_number = self.document.pageCount
# Init scale and scale mode.
self.scale = 1.0
self.read_mode = "fit_to_width"
self.rotation = 0
# Simple string comparation.
if (self.emacs_var_dict["eaf-pdf-default-zoom"] != "1.0"):
self.read_mode = "fit_to_customize"
@ -283,6 +290,11 @@ class PdfViewerWidget(QWidget):
self.remember_offset = None
# To avoid 'PDF only' method errors
self.inpdf = True
if os.path.splitext(self.url)[-1] != ".pdf":
self.inpdf = False
def handle_color(self,color,inverted=False):
r = float(color.redF())
g = float(color.greenF())
@ -312,7 +324,7 @@ class PdfViewerWidget(QWidget):
self.remember_offset = current_scroll_offset
self.buffer.message_to_emacs.emit("Jumped to saved position.")
def get_page_pixmap(self, index, scale):
def get_page_pixmap(self, index, scale, rotation=0):
# Just return cache pixmap when found match index and scale in cache dict.
if self.page_cache_scale == scale:
if index in self.page_cache_pixmap_dict.keys():
@ -324,6 +336,8 @@ class PdfViewerWidget(QWidget):
self.page_cache_trans = fitz.Matrix(scale, scale)
page = self.document[index]
if self.inpdf:
page.setRotation(rotation)
if self.is_mark_link:
page = self.add_mark_link(index)
@ -336,12 +350,18 @@ class PdfViewerWidget(QWidget):
self.char_dict[index] = self.get_page_char_rect_list(index)
self.select_area_annot_cache_dict[index] = None
if self.emacs_var_dict["eaf-pdf-dark-mode"] == "follow" and os.path.splitext(self.url)[-1] == ".pdf":
if self.emacs_var_dict["eaf-pdf-dark-mode"] == "follow" and self.inpdf:
col = self.handle_color(QColor(self.emacs_var_dict["eaf-emacs-theme-background-color"]), self.inverted_mode)
page.drawRect(page.rect, color=col, fill=col, overlay=False)
page.drawRect(page.CropBox, color=col, fill=col, overlay=False)
trans = self.page_cache_trans if self.page_cache_trans is not None else fitz.Matrix(scale, scale)
pixmap = page.getPixmap(matrix=trans, alpha=False)
if rotation % 180 != 0:
self.page_width = self.original_page_height
self.page_height = self.original_page_width
else:
self.page_width = self.original_page_width
self.page_height = self.original_page_height
if self.inverted_mode:
pixmap.invertIRect(pixmap.irect)
@ -406,7 +426,10 @@ class PdfViewerWidget(QWidget):
while imagebboxlist.count(item) > 1:
imagebboxlist.remove(item)
for bbox in imagebboxlist:
pixmap.invertIRect(bbox * self.scale)
if self.inpdf:
pixmap.invertIRect(bbox * page.rotationMatrix * self.scale)
else:
pixmap.invertIRect(bbox * self.scale)
img = QImage(pixmap.samples, pixmap.width, pixmap.height, pixmap.stride, QImage.Format_RGB888)
qpixmap = QPixmap.fromImage(img)
@ -459,7 +482,7 @@ class PdfViewerWidget(QWidget):
for index in list(range(start_page_index, last_page_index)):
if index < self.page_total_number:
# Get page image.
qpixmap = self.get_page_pixmap(index, self.scale)
qpixmap = self.get_page_pixmap(index, self.scale, self.rotation)
# Init render rect.
render_width = self.page_width * self.scale
@ -544,7 +567,7 @@ class PdfViewerWidget(QWidget):
last_page_index = min(self.page_total_number, self.get_last_page_index() + 1)
for index in list(range(start_page_index, last_page_index)):
self.get_page_pixmap(index, self.scale)
self.get_page_pixmap(index, self.scale, self.rotation)
def scale_to(self, new_scale):
self.scroll_offset = new_scale * 1.0 / self.scale * self.scroll_offset
@ -655,6 +678,32 @@ class PdfViewerWidget(QWidget):
self.page_cache_pixmap_dict.clear()
self.update()
@interactive()
def rotate_clockwise(self):
if self.inpdf:
self.rotation = (self.rotation + 90) % 360
# Need clear page cache first, otherwise current page will not inverted until next page.
self.page_cache_pixmap_dict.clear()
self.update_scale()
self.update()
else:
self.buffer.message_to_emacs.emit("Only support PDF!")
@interactive()
def rotate_counterclockwise(self):
if self.inpdf:
self.rotation = (self.rotation - 90) % 360
# Need clear page cache first, otherwise current page will not inverted until next page.
self.page_cache_pixmap_dict.clear()
self.update_scale()
self.update()
else:
self.buffer.message_to_emacs.emit("Only support PDF!")
def add_mark_link(self, index):
annot_list = []
@ -1075,6 +1124,17 @@ class PdfViewerWidget(QWidget):
page_index = index + 1
y = (ey + page_offset) * 1.0 / self.scale
temp = x
if self.rotation == 90:
x = y
y = self.page_width - temp
elif self.rotation == 180:
x = self.page_width - x
y = self.page_height - y
elif self.rotation == 270:
x = self.page_height - y
y = temp
return x, y, page_index
return None, None, None

@ -450,6 +450,8 @@ Try not to modify this alist directly. Use `eaf-setq' to modify instead."
("C-s" . "search_text_forward")
("C-r" . "search_text_backward")
("x" . "close_buffer")
("C-<right>" . "rotate_clockwise")
("C-<left>" . "rotate_counterclockwise")
("M-h" . "add_annot_highlight")
("M-u" . "add_annot_underline")
("M-s" . "add_annot_squiggly")

Loading…
Cancel
Save