add --crop-border, --bleed-border, --trim-border and --art-border options

This commit is contained in:
Johannes 'josch' Schauer 2019-04-02 07:37:03 +02:00
parent 82706671cc
commit ed6187d541
Signed by: josch
GPG key ID: F2CBA5C78FBD83E1

View file

@ -455,6 +455,9 @@ class MyPdfDict(object):
def __getitem__(self, key):
return self.content[key]
def __contains__(self, key):
return key in self.content
class MyPdfName:
def __getattr__(self, name):
@ -717,6 +720,10 @@ class pdfdoc(object):
inverted=False,
depth=0,
rotate=0,
cropborder=None,
bleedborder=None,
trimborder=None,
artborder=None,
):
if self.with_pdfrw:
from pdfrw import PdfDict, PdfName, PdfObject, PdfString
@ -809,6 +816,48 @@ class pdfdoc(object):
page = PdfDict(indirect=True)
page[PdfName.Type] = PdfName.Page
page[PdfName.MediaBox] = [0, 0, pagewidth, pageheight]
# 14.11.2 Page Boundaries
# ...
# The crop, bleed, trim, and art boxes shall not ordinarily extend
# beyond the boundaries of the media box. If they do, they are
# effectively reduced to their intersection with the media box.
if cropborder is not None:
page[PdfName.CropBox] = [
cropborder[1],
cropborder[0],
pagewidth - 2 * cropborder[1],
pageheight - 2 * cropborder[0],
]
if bleedborder is None:
if PdfName.CropBox in page:
page[PdfName.BleedBox] = page[PdfName.CropBox]
else:
page[PdfName.BleedBox] = [
bleedborder[1],
bleedborder[0],
pagewidth - 2 * bleedborder[1],
pageheight - 2 * bleedborder[0],
]
if trimborder is None:
if PdfName.CropBox in page:
page[PdfName.TrimBox] = page[PdfName.CropBox]
else:
page[PdfName.TrimBox] = [
trimborder[1],
trimborder[0],
pagewidth - 2 * trimborder[1],
pageheight - 2 * trimborder[0],
]
if artborder is None:
if PdfName.CropBox in page:
page[PdfName.ArtBox] = page[PdfName.CropBox]
else:
page[PdfName.ArtBox] = [
artborder[1],
artborder[0],
pagewidth - 2 * artborder[1],
pageheight - 2 * artborder[0],
]
page[PdfName.Resources] = resources
page[PdfName.Contents] = content
if rotate != 0:
@ -1763,6 +1812,10 @@ def convert(*images, **kwargs):
outputstream=None,
first_frame_only=False,
allow_oversized=True,
cropborder=None,
bleedborder=None,
trimborder=None,
artborder=None,
)
for kwname, default in _default_kwargs.items():
if kwname not in kwargs:
@ -1870,6 +1923,10 @@ def convert(*images, **kwargs):
inverted,
depth,
rotation,
kwargs["cropborder"],
kwargs["bleedborder"],
kwargs["trimborder"],
kwargs["artborder"],
)
if kwargs["outputstream"]:
@ -2442,6 +2499,8 @@ the image size will be calculated from the page size, respecting the border
setting. If the --border option is given while both the --pagesize and
--imgsize options are passed, then the --border option will be ignored.
The --pagesize option or the --imgsize option with the --border option will
determine the MediaBox size of the resulting PDF document.
"""
% default_dpi,
)
@ -2509,6 +2568,50 @@ If both dimensions of the page are given via --pagesize, conditionally swaps
these dimensions such that the page orientation is the same as the orientation
of the input image. If the orientation of a page gets flipped, then so do the
values set via the --border option.
""",
)
sizeargs.add_argument(
"--crop-border",
metavar="L[:L]",
type=parse_borderarg,
help="""
Specifies the border between the CropBox and the MediaBox. One, or two length
values can be given as an argument, separated by a colon. One value specifies
the border on all four sides. Two values specify the border on the top/bottom
and left/right, respectively. It is not possible to specify asymmetric borders.
""",
)
sizeargs.add_argument(
"--bleed-border",
metavar="L[:L]",
type=parse_borderarg,
help="""
Specifies the border between the BleedBox and the MediaBox. One, or two length
values can be given as an argument, separated by a colon. One value specifies
the border on all four sides. Two values specify the border on the top/bottom
and left/right, respectively. It is not possible to specify asymmetric borders.
""",
)
sizeargs.add_argument(
"--trim-border",
metavar="L[:L]",
type=parse_borderarg,
help="""
Specifies the border between the TrimBox and the MediaBox. One, or two length
values can be given as an argument, separated by a colon. One value specifies
the border on all four sides. Two values specify the border on the top/bottom
and left/right, respectively. It is not possible to specify asymmetric borders.
""",
)
sizeargs.add_argument(
"--art-border",
metavar="L[:L]",
type=parse_borderarg,
help="""
Specifies the border between the ArtBox and the MediaBox. One, or two length
values can be given as an argument, separated by a colon. One value specifies
the border on all four sides. Two values specify the border on the top/bottom
and left/right, respectively. It is not possible to specify asymmetric borders.
""",
)
@ -2685,7 +2788,11 @@ values set via the --border option.
viewer_fullscreen=args.viewer_fullscreen,
with_pdfrw=not args.without_pdfrw,
outputstream=args.output,
first_frame_only=args.first_frame_only
first_frame_only=args.first_frame_only,
cropborder=args.crop_border,
bleedborder=args.bleed_border,
trimborder=args.trim_border,
artborder=args.art_border,
)
except Exception as e:
logging.error("error: " + str(e))