Package: pdfposter Version: 0.4.4-2 Severity: wishlist Tags: patch upstream Forwarded: http://pdfposter.origo.ethz.ch/node/39
At the moment, pdfposter prints full-bleed to the edge of the pages. Most real-world printers can't handle this, so it leaves gaps in the printed material as a result. The attached patch applies to pdfposter 0.5.0 and creates an overlap option. It was originally reported to upstream at http://pdfposter.origo.ethz.ch/node/39, and the patch was updated by me, as noted in the upstream bug log. This is not the full fix for full-bleed printing, but it's a start, and it certainly makes it easier to re-assemble pages after printing. --dkg -- System Information: Debian Release: wheezy/sid APT prefers testing APT policy: (500, 'testing'), (200, 'unstable'), (1, 'experimental') Architecture: i386 (i686) Kernel: Linux 3.1.0-1-686-pae (SMP w/1 CPU core) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Versions of packages pdfposter depends on: ii python 2.7.2-9 ii python-pypdf 1.13-1 ii python-support 1.0.14 pdfposter recommends no packages. pdfposter suggests no packages. -- no debconf information
--- a/pdftools/pdfposter/__init__.py +++ b/pdftools/pdfposter/__init__.py @@ -32,6 +32,7 @@ import math DEFAULT_MEDIASIZE = 'a4' +DEFAULT_OVERLAP_PERCENT = 0 mm = 72 / 25.4 @@ -136,12 +137,12 @@ log(18, 'Rotating %s specs to portrait format', which) return True -def decide_num_pages(inbox, mediabox, posterbox, scale=None): +def decide_num_pages(inbox, mediabox, posterbox, scale=None, overlap=0.01*DEFAULT_OVERLAP_PERCENT): """decide on number of pages""" # avoid changing original posterbox when handling multiple pages # (if --scale, posterbox is None) posterbox = posterbox and posterbox.copy() - cutmargin = {'x': 0, 'y': 0} # todo + cutmargin = {'x': mediabox['width']*overlap, 'y': mediabox['height']*overlap} # todo whitemargin = {'x': 0, 'y': 0} # todo # media and image sizes (inbox) are fixed already # available drawing area per sheet @@ -240,16 +241,17 @@ page[NameObject('/Contents')] = content -def posterize(outpdf, page, mediabox, posterbox, scale): +def posterize(outpdf, page, mediabox, posterbox, scale, overlap=0.01*DEFAULT_OVERLAP_PERCENT): """ page: input page mediabox : size secs of the media to print on posterbox: size secs of the resulting poster scale: scale factor (to be used instead of posterbox) + overlap: proportion of expected overlap per output page """ inbox = rectangle2box(page.artBox) ncols, nrows, scale, rotate = decide_num_pages(inbox, mediabox, - posterbox, scale) + posterbox, scale, overlap) mediabox = mediabox.copy() _scale_pdf_page(page, scale) if rotate: @@ -257,8 +259,8 @@ rotate_box(inbox) rotate_box(mediabox) # area to put on each page (allows for overlay of margin) - h_step = mediabox['width'] - mediabox['offset_x'] - v_step = mediabox['height'] - mediabox['offset_y'] + h_wid = mediabox['width'] - mediabox['offset_x'] + v_hi = mediabox['height'] - mediabox['offset_y'] trimbox = rectangle2box(page.trimBox) h_pos = float(trimbox['offset_x']) @@ -272,15 +274,15 @@ # transparent fill box behind, so the real content is in # the lower left corner newpage.mediaBox = RectangleObject((h_pos, v_pos, - h_pos + h_step, - v_pos + v_step)) + h_pos + h_wid, + v_pos + v_hi)) newpage.trimBox = RectangleObject((h_pos, v_pos, - min(h_max, h_pos + h_step), - min(v_max, v_pos + v_step))) + min(h_max, h_pos + h_wid), + min(v_max, v_pos + v_hi))) newpage.cropBox = newpage.artBox = newpage.trimBox outpdf.addPage(newpage) - v_pos += v_step - h_pos += h_step + v_pos += v_hi*(1-overlap) + h_pos += h_wid*(1-overlap) def password_hook(): import getpass @@ -308,6 +310,7 @@ for i, page in enumerate(inpdf.pages): log(19, '---- processing page %i -----', i+1) - posterize(outpdf, page, opts.media_size, opts.poster_size, opts.scale) + posterize(outpdf, page, opts.media_size, opts.poster_size, opts.scale, + opts.overlap_percent*0.01) if not opts.dry_run: outpdf.write(open(outfilename, 'wb')) --- a/pdftools/pdfposter/cmd.py +++ b/pdftools/pdfposter/cmd.py @@ -23,7 +23,7 @@ __copyright__ = "Copyright 2008-2009 by Hartmut Goebel <h.goe...@goebel-consult.de>" __licence__ = "GNU General Public License version 3 (GPL v3)" -from . import main, __version__, DEFAULT_MEDIASIZE, papersizes, DecryptionError +from . import main, __version__, DEFAULT_OVERLAP_PERCENT, DEFAULT_MEDIASIZE, papersizes, DecryptionError import re # pattern for parsing user textual box spec @@ -92,6 +92,8 @@ help='Specify the poster size (defaults to media size). ') group.add_option('-s', '--scale', type=float, help='Specify a linear scaling factor to produce the poster.') + group.add_option('-O', '--overlap-percent', type=float, default = DEFAULT_OVERLAP_PERCENT, + help='Image overlap (default: %g).' % DEFAULT_OVERLAP_PERCENT) opts, args = parser.parse_args() --- a/pdfposter.1 +++ b/pdfposter.1 @@ -102,6 +102,16 @@ .B \-n , \-\-dry\-run Show what would have been done, but do not generate files. +.TP +.B \-O , \-\-overlap\-percent NNN +Specify amount to overlap of adjacent pages. If this factor is +positive, the input pages actually overlap (or often only their +margins overlap harmlessly). A negative factor increases gaps between +pages. The factor is given in percent of the media page size. Default +0. +.B \-O 5 + is suggested for an approximation of collapsing margins. + .UNINDENT .SS Defining Output