Added "Split left and right pages" option
Also cleaned formatting according to Eclipse PyDev
This commit is contained in:
parent
9c065b50ef
commit
1b2c5308eb
@ -17,7 +17,9 @@
|
|||||||
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from PyQt4 import QtGui
|
from PyQt4 import QtGui
|
||||||
|
|
||||||
from mangle.book import MainWindowBook
|
from mangle.book import MainWindowBook
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,10 +14,10 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
import os.path
|
|
||||||
import util
|
|
||||||
from PyQt4 import QtGui, uic
|
from PyQt4 import QtGui, uic
|
||||||
|
|
||||||
|
import util
|
||||||
|
|
||||||
|
|
||||||
class DialogAbout(QtGui.QDialog):
|
class DialogAbout(QtGui.QDialog):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
@ -14,19 +14,20 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
import os
|
|
||||||
import os.path
|
|
||||||
from os.path import basename
|
from os.path import basename
|
||||||
import util
|
import os.path
|
||||||
import tempfile
|
import tempfile
|
||||||
from PyQt4 import QtGui, QtCore, QtXml, uic
|
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
from image import ImageFlags
|
|
||||||
from about import DialogAbout
|
from PyQt4 import QtGui, QtCore, QtXml, uic
|
||||||
from options import DialogOptions
|
|
||||||
from convert import DialogConvert
|
|
||||||
from natsort import natsorted
|
from natsort import natsorted
|
||||||
|
|
||||||
|
from about import DialogAbout
|
||||||
|
from convert import DialogConvert
|
||||||
|
from image import ImageFlags
|
||||||
|
from options import DialogOptions
|
||||||
|
import util
|
||||||
|
|
||||||
|
|
||||||
class Book(object):
|
class Book(object):
|
||||||
DefaultDevice = 'Kindle Paperwhite'
|
DefaultDevice = 'Kindle Paperwhite'
|
||||||
@ -250,7 +251,7 @@ class MainWindowBook(QtGui.QMainWindow):
|
|||||||
QtGui.QMessageBox.warning(self, 'Mangle', 'This book has no images to export')
|
QtGui.QMessageBox.warning(self, 'Mangle', 'This book has no images to export')
|
||||||
return
|
return
|
||||||
|
|
||||||
if not self.book.titleSet: # if self.book.title is None:
|
if not self.book.titleSet: # if self.book.title is None:
|
||||||
dialog = DialogOptions(self, self.book)
|
dialog = DialogOptions(self, self.book)
|
||||||
if dialog.exec_() == QtGui.QDialog.Rejected:
|
if dialog.exec_() == QtGui.QDialog.Rejected:
|
||||||
return
|
return
|
||||||
@ -378,7 +379,7 @@ class MainWindowBook(QtGui.QMainWindow):
|
|||||||
filenames = []
|
filenames = []
|
||||||
|
|
||||||
for directory in directories:
|
for directory in directories:
|
||||||
for root, subdirs, subfiles in os.walk(unicode(directory)):
|
for root, _, subfiles in os.walk(unicode(directory)):
|
||||||
for filename in subfiles:
|
for filename in subfiles:
|
||||||
path = os.path.join(root, filename)
|
path = os.path.join(root, filename)
|
||||||
if self.isImageFile(path):
|
if self.isImageFile(path):
|
||||||
@ -402,16 +403,15 @@ class MainWindowBook(QtGui.QMainWindow):
|
|||||||
for f in cbzFile.namelist():
|
for f in cbzFile.namelist():
|
||||||
if f.endswith('/'):
|
if f.endswith('/'):
|
||||||
try:
|
try:
|
||||||
os.makedirs(path+f)
|
os.makedirs(path + f)
|
||||||
except:
|
except:
|
||||||
pass #the dir exists so we are going to extract the images only.
|
pass # the dir exists so we are going to extract the images only.
|
||||||
else:
|
else:
|
||||||
cbzFile.extract(f, path)
|
cbzFile.extract(f, path)
|
||||||
#Add the directories
|
if os.path.isdir(unicode(path)): # Add the directories
|
||||||
if os.path.isdir(unicode(path)):
|
|
||||||
directories.append(path)
|
directories.append(path)
|
||||||
#Add the files
|
|
||||||
self.addImageDirs(directories)
|
self.addImageDirs(directories) # Add the files
|
||||||
|
|
||||||
|
|
||||||
def isImageFile(self, filename):
|
def isImageFile(self, filename):
|
||||||
|
@ -14,10 +14,13 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
import os, shutil
|
import os
|
||||||
|
import shutil
|
||||||
|
|
||||||
from PyQt4 import QtGui, QtCore
|
from PyQt4 import QtGui, QtCore
|
||||||
import image
|
|
||||||
import cbz
|
import cbz
|
||||||
|
import image
|
||||||
import pdfimage
|
import pdfimage
|
||||||
|
|
||||||
|
|
||||||
@ -39,7 +42,7 @@ class DialogConvert(QtGui.QProgressDialog):
|
|||||||
|
|
||||||
self.pdf = None
|
self.pdf = None
|
||||||
if "PDF" in self.book.outputFormat:
|
if "PDF" in self.book.outputFormat:
|
||||||
self.pdf = pdfimage.PDFImage(self.bookPath, str(self.book.title), str(self.book.device))
|
self.pdf = pdfimage.PDFImage(self.bookPath, str(self.book.title), str(self.book.device))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -56,9 +59,9 @@ class DialogConvert(QtGui.QProgressDialog):
|
|||||||
# Close the archive if we created a CBZ file
|
# Close the archive if we created a CBZ file
|
||||||
if self.archive is not None:
|
if self.archive is not None:
|
||||||
self.archive.close()
|
self.archive.close()
|
||||||
#Close and generate the PDF File
|
# Close and generate the PDF File
|
||||||
if self.pdf is not None:
|
if self.pdf is not None:
|
||||||
self.pdf.close()
|
self.pdf.close()
|
||||||
|
|
||||||
# Remove image directory if the user didn't wish for images
|
# Remove image directory if the user didn't wish for images
|
||||||
if 'Image' not in self.book.outputFormat:
|
if 'Image' not in self.book.outputFormat:
|
||||||
@ -108,7 +111,7 @@ class DialogConvert(QtGui.QProgressDialog):
|
|||||||
if self.archive is not None:
|
if self.archive is not None:
|
||||||
self.archive.addFile(target)
|
self.archive.addFile(target)
|
||||||
if self.pdf is not None:
|
if self.pdf is not None:
|
||||||
self.pdf.addImage(target)
|
self.pdf.addImage(target)
|
||||||
except RuntimeError, error:
|
except RuntimeError, error:
|
||||||
result = QtGui.QMessageBox.critical(
|
result = QtGui.QMessageBox.critical(
|
||||||
self,
|
self,
|
||||||
|
@ -14,6 +14,8 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
from PIL import Image, ImageDraw
|
from PIL import Image, ImageDraw
|
||||||
|
|
||||||
|
|
||||||
@ -23,6 +25,8 @@ class ImageFlags:
|
|||||||
Frame = 1 << 2
|
Frame = 1 << 2
|
||||||
Quantize = 1 << 3
|
Quantize = 1 << 3
|
||||||
Stretch = 1 << 4
|
Stretch = 1 << 4
|
||||||
|
Split = 1 << 5
|
||||||
|
SplitRight = 1 << 6
|
||||||
|
|
||||||
|
|
||||||
class KindleData:
|
class KindleData:
|
||||||
@ -81,6 +85,18 @@ class KindleData:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def splitLeft(image):
|
||||||
|
widthImg, heightImg = image.size
|
||||||
|
|
||||||
|
return image.crop((0, 0, widthImg / 2, heightImg))
|
||||||
|
|
||||||
|
|
||||||
|
def splitRight(image):
|
||||||
|
widthImg, heightImg = image.size
|
||||||
|
|
||||||
|
return image.crop((widthImg / 2, 0, widthImg, heightImg))
|
||||||
|
|
||||||
|
|
||||||
def quantizeImage(image, palette):
|
def quantizeImage(image, palette):
|
||||||
colors = len(palette) / 3
|
colors = len(palette) / 3
|
||||||
if colors < 256:
|
if colors < 256:
|
||||||
@ -93,8 +109,8 @@ def quantizeImage(image, palette):
|
|||||||
|
|
||||||
|
|
||||||
def stretchImage(image, size):
|
def stretchImage(image, size):
|
||||||
widthDev, heightDev = size
|
widthDev, heightDev = size
|
||||||
return image.resize((widthDev, heightDev), Image.ANTIALIAS)
|
return image.resize((widthDev, heightDev), Image.ANTIALIAS)
|
||||||
|
|
||||||
def resizeImage(image, size):
|
def resizeImage(image, size):
|
||||||
widthDev, heightDev = size
|
widthDev, heightDev = size
|
||||||
@ -175,15 +191,24 @@ def convertImage(source, target, device, flags):
|
|||||||
raise RuntimeError('Cannot read image file %s' % source)
|
raise RuntimeError('Cannot read image file %s' % source)
|
||||||
image = formatImage(image)
|
image = formatImage(image)
|
||||||
if flags & ImageFlags.Orient:
|
if flags & ImageFlags.Orient:
|
||||||
image = orientImage(image, size)
|
image = orientImage(image, size)
|
||||||
|
if flags & ImageFlags.SplitRight:
|
||||||
|
image = splitRight(image)
|
||||||
|
elif flags & ImageFlags.Split:
|
||||||
|
image = splitLeft(image)
|
||||||
|
# Recurse for right page
|
||||||
|
fileName, fileExtension = os.path.splitext(target)
|
||||||
|
newTarget = fileName + "r" + fileExtension
|
||||||
|
print(newTarget)
|
||||||
|
convertImage(source, newTarget, device, flags | ImageFlags.SplitRight)
|
||||||
if flags & ImageFlags.Resize:
|
if flags & ImageFlags.Resize:
|
||||||
image = resizeImage(image, size)
|
image = resizeImage(image, size)
|
||||||
if flags & ImageFlags.Stretch:
|
if flags & ImageFlags.Stretch:
|
||||||
image = stretchImage(image, size)
|
image = stretchImage(image, size)
|
||||||
if flags & ImageFlags.Frame:
|
if flags & ImageFlags.Frame:
|
||||||
image = frameImage(image, tuple(palette[:3]), tuple(palette[-3:]), size)
|
image = frameImage(image, tuple(palette[:3]), tuple(palette[-3:]), size)
|
||||||
if flags & ImageFlags.Quantize:
|
if flags & ImageFlags.Quantize:
|
||||||
image = quantizeImage(image, palette)
|
image = quantizeImage(image, palette)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
image.save(target)
|
image.save(target)
|
||||||
|
@ -14,10 +14,10 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
import os.path
|
from PyQt4 import QtGui, uic
|
||||||
import util
|
|
||||||
from PyQt4 import QtGui, QtCore, uic
|
|
||||||
from image import ImageFlags
|
from image import ImageFlags
|
||||||
|
import util
|
||||||
|
|
||||||
|
|
||||||
class DialogOptions(QtGui.QDialog):
|
class DialogOptions(QtGui.QDialog):
|
||||||
@ -59,11 +59,13 @@ class DialogOptions(QtGui.QDialog):
|
|||||||
if self.checkboxResize.isChecked():
|
if self.checkboxResize.isChecked():
|
||||||
imageFlags |= ImageFlags.Resize
|
imageFlags |= ImageFlags.Resize
|
||||||
if self.checkboxStretch.isChecked():
|
if self.checkboxStretch.isChecked():
|
||||||
imageFlags |= ImageFlags.Stretch
|
imageFlags |= ImageFlags.Stretch
|
||||||
if self.checkboxQuantize.isChecked():
|
if self.checkboxQuantize.isChecked():
|
||||||
imageFlags |= ImageFlags.Quantize
|
imageFlags |= ImageFlags.Quantize
|
||||||
if self.checkboxFrame.isChecked():
|
if self.checkboxFrame.isChecked():
|
||||||
imageFlags |= ImageFlags.Frame
|
imageFlags |= ImageFlags.Frame
|
||||||
|
if self.checkboxSplit.isChecked():
|
||||||
|
imageFlags |= ImageFlags.Split
|
||||||
|
|
||||||
modified = (
|
modified = (
|
||||||
self.book.title != title or
|
self.book.title != title or
|
||||||
|
@ -17,9 +17,10 @@
|
|||||||
import os.path
|
import os.path
|
||||||
|
|
||||||
from reportlab.pdfgen import canvas
|
from reportlab.pdfgen import canvas
|
||||||
from reportlab.lib.pagesizes import letter
|
|
||||||
from image import KindleData
|
from image import KindleData
|
||||||
|
|
||||||
|
|
||||||
class PDFImage(object):
|
class PDFImage(object):
|
||||||
def __init__(self, path, title, device):
|
def __init__(self, path, title, device):
|
||||||
outputDirectory = os.path.dirname(path)
|
outputDirectory = os.path.dirname(path)
|
||||||
@ -28,7 +29,7 @@ class PDFImage(object):
|
|||||||
self.currentDevice = device
|
self.currentDevice = device
|
||||||
self.bookTitle = title
|
self.bookTitle = title
|
||||||
self.pageSize = KindleData.Profiles[self.currentDevice][0]
|
self.pageSize = KindleData.Profiles[self.currentDevice][0]
|
||||||
#pagesize could be letter or A4 for standarization but we need to control some image sizes
|
# pagesize could be letter or A4 for standarization but we need to control some image sizes
|
||||||
self.canvas = canvas.Canvas(outputPath, pagesize=self.pageSize)
|
self.canvas = canvas.Canvas(outputPath, pagesize=self.pageSize)
|
||||||
self.canvas.setAuthor("Mangle")
|
self.canvas.setAuthor("Mangle")
|
||||||
self.canvas.setTitle(self.bookTitle)
|
self.canvas.setTitle(self.bookTitle)
|
||||||
|
@ -158,6 +158,13 @@
|
|||||||
<string>Draw frame around images</string>
|
<string>Draw frame around images</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="checkboxSplit">
|
||||||
|
<property name="text">
|
||||||
|
<string>Split left and right pages</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_3">
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
|
|
||||||
import os.path
|
import os.path
|
||||||
import re
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
13
setup.py
13
setup.py
@ -16,16 +16,15 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
import sys
|
|
||||||
from distutils.core import setup
|
from distutils.core import setup
|
||||||
import py2exe
|
import sys
|
||||||
|
|
||||||
|
|
||||||
sys.argv.append('py2exe')
|
sys.argv.append('py2exe')
|
||||||
setup(
|
setup(
|
||||||
name = 'Mangle',
|
name='Mangle',
|
||||||
windows = [{'script': 'mangle.pyw'}],
|
windows=[{'script': 'mangle.pyw'}],
|
||||||
data_files = [('', ['LICENSE']),
|
data_files=[('', ['LICENSE']),
|
||||||
('mangle/ui', ['mangle/ui/book.ui',
|
('mangle/ui', ['mangle/ui/book.ui',
|
||||||
'mangle/ui/about.ui',
|
'mangle/ui/about.ui',
|
||||||
'mangle/ui/options.ui']),
|
'mangle/ui/options.ui']),
|
||||||
@ -39,11 +38,11 @@ setup(
|
|||||||
'mangle/img/save_file.png',
|
'mangle/img/save_file.png',
|
||||||
'mangle/img/shift_down.png',
|
'mangle/img/shift_down.png',
|
||||||
'mangle/img/shift_up.png'])],
|
'mangle/img/shift_up.png'])],
|
||||||
options = {'py2exe': {
|
options={'py2exe': {
|
||||||
'bundle_files': 1,
|
'bundle_files': 1,
|
||||||
'includes': ['sip'],
|
'includes': ['sip'],
|
||||||
'packages': ['reportlab.pdfbase'],
|
'packages': ['reportlab.pdfbase'],
|
||||||
'dll_excludes': ['w9xpopen.exe']
|
'dll_excludes': ['w9xpopen.exe']
|
||||||
}},
|
}},
|
||||||
zipfile = None
|
zipfile=None
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user