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

Reply via email to