trelby_export/src/watermarkdlg.py

166 lines
5.2 KiB
Python

import pdf
import pml
import random
import util
import wx
# The watermark tool dialog.
class WatermarkDlg(wx.Dialog):
# sp - screenplay object, from which to generate PDF
# prefix - prefix name for the PDF files (unicode)
def __init__(self, parent, sp, prefix):
wx.Dialog.__init__(self, parent, -1, "Watermarked PDFs generator",
style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
self.frame = parent
self.sp = sp
vsizer = wx.BoxSizer(wx.VERTICAL)
vsizer.Add(wx.StaticText(self, -1, "Directory to save in:"), 0)
hsizer = wx.BoxSizer(wx.HORIZONTAL)
self.dirEntry = wx.TextCtrl(self, -1)
hsizer.Add(self.dirEntry, 1, wx.EXPAND)
btn = wx.Button(self, -1, "Browse")
self.Bind(wx.EVT_BUTTON, self.OnBrowse, id=btn.GetId())
hsizer.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT, 10)
vsizer.Add(hsizer, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
vsizer.Add(wx.StaticText(self, -1, "Filename prefix:"), 0)
self.filenamePrefix = wx.TextCtrl(self, -1, prefix)
vsizer.Add(self.filenamePrefix, 0, wx.EXPAND | wx.BOTTOM, 5)
vsizer.Add(wx.StaticText(self, -1, "Watermark font size:"), 0)
self.markSize = wx.SpinCtrl(self, -1, size=(60, -1))
self.markSize.SetRange(20, 80)
self.markSize.SetValue(40)
vsizer.Add(self.markSize, 0, wx.BOTTOM, 5)
vsizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
vsizer.Add(wx.StaticText(self, -1, "Common mark:"), 0)
self.commonMark = wx.TextCtrl(self, -1, "Confidential")
vsizer.Add(self.commonMark, 0, wx.EXPAND| wx.BOTTOM, 5)
vsizer.Add(wx.StaticText(self, -1, "Watermarks (one per line):"))
self.itemsEntry = wx.TextCtrl(
self, -1, style = wx.TE_MULTILINE | wx.TE_DONTWRAP,
size = (300, 200))
vsizer.Add(self.itemsEntry, 1, wx.EXPAND)
hsizer = wx.BoxSizer(wx.HORIZONTAL)
closeBtn = wx.Button(self, -1, "Close")
hsizer.Add(closeBtn, 0)
hsizer.Add((1, 1), 1)
generateBtn = wx.Button(self, -1, "Generate PDFs")
hsizer.Add(generateBtn, 0)
vsizer.Add(hsizer, 0, wx.EXPAND | wx.TOP, 10)
util.finishWindow(self, vsizer)
self.Bind(wx.EVT_BUTTON, self.OnClose, id=closeBtn.GetId())
self.Bind(wx.EVT_BUTTON, self.OnGenerate, id=generateBtn.GetId())
self.dirEntry.SetFocus()
@staticmethod
def getUniqueId(usedIds):
while True:
uid = ""
for i in range(8):
uid += '%02x' % random.randint(0, 255)
if uid in usedIds:
continue
usedIds.add(uid)
return uid
def OnGenerate(self, event):
watermarks = self.itemsEntry.GetValue().split("\n")
common = self.commonMark.GetValue()
directory = self.dirEntry.GetValue()
fontsize = self.markSize.GetValue()
fnprefix = self.filenamePrefix.GetValue()
watermarks = set(watermarks)
# keep track of ids allocated so far, just on the off-chance we
# randomly allocated the same id twice
usedIds = set()
if not directory:
wx.MessageBox("Please set directory.", "Error", wx.OK, self)
self.dirEntry.SetFocus()
return
count = 0
for item in watermarks:
s = item.strip()
if not s:
continue
basename = item.replace(" ", "-")
fn = directory + "/" + fnprefix + '-' + basename + ".pdf"
pmldoc = self.sp.generatePML(True)
ops = []
# almost-not-there gray
ops.append(pml.PDFOp("0.85 g"))
if common:
wm = pml.TextOp(
util.cleanInput(common),
self.sp.cfg.marginLeft + 20, self.sp.cfg.paperHeight * 0.45,
fontsize, pml.BOLD, angle = 45)
ops.append(wm)
wm = pml.TextOp(
util.cleanInput(s),
self.sp.cfg.marginLeft + 20, self.sp.cfg.paperHeight * 0.6,
fontsize, pml.BOLD, angle = 45)
ops.append(wm)
# ...and back to black
ops.append(pml.PDFOp("0.0 g"))
for page in pmldoc.pages:
page.addOpsToFront(ops)
pmldoc.uniqueId = self.getUniqueId(usedIds)
pdfdata = pdf.generate(pmldoc)
if not util.writeToFile(fn, pdfdata, self):
wx.MessageBox("PDF generation aborted.", "Error", wx.OK, self)
return
else:
count += 1
if count > 0:
wx.MessageBox("Generated %d files in directory %s." %
(count, directory), "PDFs generated",
wx.OK, self)
else:
wx.MessageBox("No watermarks specified.", "Error", wx.OK, self)
def OnClose(self, event):
self.EndModal(wx.OK)
def OnBrowse(self, event):
dlg = wx.DirDialog(
self.frame, style = wx.DD_NEW_DIR_BUTTON)
if dlg.ShowModal() == wx.ID_OK:
self.dirEntry.SetValue(dlg.GetPath())
dlg.Destroy()