diff options
Diffstat (limited to 'app-text/krop/files/krop-0.6.0-pikepdf.patch')
-rw-r--r-- | app-text/krop/files/krop-0.6.0-pikepdf.patch | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/app-text/krop/files/krop-0.6.0-pikepdf.patch b/app-text/krop/files/krop-0.6.0-pikepdf.patch new file mode 100644 index 000000000000..17f59f2f72b3 --- /dev/null +++ b/app-text/krop/files/krop-0.6.0-pikepdf.patch @@ -0,0 +1,150 @@ +From b1d17b605088e118a8799fd027a892310e00d29e Mon Sep 17 00:00:00 2001 +From: Hongzhuo Liang <lianghongzhuo@126.com> +Date: Fri, 27 Jan 2023 17:57:04 +0100 +Subject: [PATCH] support pikepdf instead of pypdf2 + +--- + krop/mainwindow.py | 1 - + krop/pdfcropper.py | 79 ++++++++++++++-------------------------------- + 2 files changed, 24 insertions(+), 56 deletions(-) + +diff --git a/krop/mainwindow.py b/krop/mainwindow.py +index e8adadf..fd1ae32 100644 +--- a/krop/mainwindow.py ++++ b/krop/mainwindow.py +@@ -413,7 +413,6 @@ def slotKrop(self): + pdf = PdfFile() + pdf.loadFromFile(inputFileName) + cropper = PdfCropper() +- cropper.copyDocumentRoot(pdf) + for nr in pages: + c = self.viewer.cropValues(nr) + cropper.addPageCropped(pdf, nr, c, alwaysinclude, rotation) +diff --git a/krop/pdfcropper.py b/krop/pdfcropper.py +index db30646..42500de 100644 +--- a/krop/pdfcropper.py ++++ b/krop/pdfcropper.py +@@ -15,23 +15,8 @@ + + import copy + import sys ++from pikepdf import Pdf + +-# Unless specified otherwise, use PyPDF2 instead of pyPdf if available. +-usepypdf2 = '--no-PyPDF2' not in sys.argv +-if usepypdf2: +- try: +- from PyPDF2 import PdfFileReader, PdfFileWriter +- except ImportError: +- usepypdf2 = False +-if not usepypdf2: +- try: +- from pyPdf import PdfFileReader, PdfFileWriter +- except ImportError: +- _msg = "Please install PyPDF2 (or its predecessor pyPdf) first."\ +- "\n\tOn recent versions of Ubuntu, the following should do the trick:"\ +- "\n\tsudo apt-get install python-pypdf2"\ +- "\n\t(or, if using python3) sudo apt-get install python3-pypdf2" +- raise RuntimeError(_msg) + + class PdfEncryptedError(Exception): + pass +@@ -55,8 +40,6 @@ def writeToFile(self, filename): + stream.close() + def addPageCropped(self, pdffile, pagenumber, croplist, rotate=0): + pass +- def copyDocumentRoot(self, pdffile): +- pass + + + class PyPdfFile(AbstractPdfFile): +@@ -64,23 +47,16 @@ class PyPdfFile(AbstractPdfFile): + def __init__(self): + self.reader = None + def loadFromStream(self, stream): +- if usepypdf2: +- self.reader = PdfFileReader(stream, strict=False) +- else: +- self.reader = PdfFileReader(stream) +- if self.reader.isEncrypted: +- try: +- if not self.reader.decrypt(''): +- raise PdfEncryptedError +- except: +- raise PdfEncryptedError +- def getPage(self, nr): +- page = self.reader.getPage(nr-1) ++ self.reader = Pdf.open(stream) ++ if self.reader.is_encrypted: ++ raise PdfEncryptedError ++ + + class PyPdfCropper(AbstractPdfCropper): + """Implementation of PdfCropper using pyPdf""" + def __init__(self): +- self.output = PdfFileWriter() ++ self.pdf = Pdf.new() ++ + def writeToStream(self, stream): + # For certain large pdf files, PdfFileWriter.write() causes the error: + # maximum recursion depth exceeded while calling a Python object +@@ -88,37 +64,31 @@ def writeToStream(self, stream): + # We therefore temporarily increase the recursion limit. + old_reclimit = sys.getrecursionlimit() + sys.setrecursionlimit(10000) +- self.output.write(stream) ++ self.pdf.save(stream) + sys.setrecursionlimit(old_reclimit) ++ + def addPageCropped(self, pdffile, pagenumber, croplist, alwaysinclude, rotate=0): +- page = pdffile.reader.getPage(pagenumber) ++ page = pdffile.reader.pages[pagenumber] + if not croplist and alwaysinclude: +- self.output.addPage(page) ++ self.pdf.pages.append(page) + for c in croplist: +- newpage = copy.copy(page) +- self.cropPage(newpage, c, rotate) +- self.output.addPage(newpage) +- def cropPage(self, page, crop, rotate): ++ new_box = self.getCropPageParm(page, c) ++ # Update the various PDF boxes ++ new_page = copy.copy(page) ++ new_page.mediabox = new_box ++ new_page.cropbox = new_box ++ new_page.trimbox = new_box ++ if rotate != 0: ++ new_page.rotate(rotate, True) ++ self.pdf.pages.append(new_page) ++ ++ def getCropPageParm(self, page, crop): + # Note that the coordinate system is up-side down compared with Qt. +- x0, y0 = page.cropBox.lowerLeft +- x1, y1 = page.cropBox.upperRight ++ x0, y0, x1, y1 = page.cropbox + x0, y0, x1, y1 = float(x0), float(y0), float(x1), float(y1) + x0, x1 = x0+crop[0]*(x1-x0), x1-crop[2]*(x1-x0) + y0, y1 = y0+crop[3]*(y1-y0), y1-crop[1]*(y1-y0) +- # Update the various PDF boxes +- for box in (page.artBox, page.bleedBox, page.cropBox, page.mediaBox, page.trimBox): +- box.lowerLeft = (x0, y0) +- box.upperRight = (x1, y1) +- if rotate != 0: +- page.rotateClockwise(rotate) +- +- def copyDocumentRoot(self, pdffile): +- # Sounds promising in PyPDF2 (see PdfFileWriter.cloneDocumentFromReader), +- # but doesn't seem to produce a readable PDF: +- # self.output.cloneReaderDocumentRoot(pdffile.reader) +- # Instead, this copies at least the named destinations for links: +- for dest in pdffile.reader.namedDestinations.values(): +- self.output.addNamedDestinationObject(dest) ++ return [x0, y0, x1, y1] + + + def optimizePdfGhostscript(oldfilename, newfilename): +@@ -128,4 +98,3 @@ def optimizePdfGhostscript(oldfilename, newfilename): + + PdfFile = PyPdfFile + PdfCropper = PyPdfCropper +- |