forked from josch/img2pdf
add --crop-border, --bleed-border, --trim-border and --art-border options
This commit is contained in:
parent
82706671cc
commit
ed6187d541
1 changed files with 108 additions and 1 deletions
109
src/img2pdf.py
109
src/img2pdf.py
|
@ -455,6 +455,9 @@ class MyPdfDict(object):
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
return self.content[key]
|
return self.content[key]
|
||||||
|
|
||||||
|
def __contains__(self, key):
|
||||||
|
return key in self.content
|
||||||
|
|
||||||
|
|
||||||
class MyPdfName:
|
class MyPdfName:
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
|
@ -717,6 +720,10 @@ class pdfdoc(object):
|
||||||
inverted=False,
|
inverted=False,
|
||||||
depth=0,
|
depth=0,
|
||||||
rotate=0,
|
rotate=0,
|
||||||
|
cropborder=None,
|
||||||
|
bleedborder=None,
|
||||||
|
trimborder=None,
|
||||||
|
artborder=None,
|
||||||
):
|
):
|
||||||
if self.with_pdfrw:
|
if self.with_pdfrw:
|
||||||
from pdfrw import PdfDict, PdfName, PdfObject, PdfString
|
from pdfrw import PdfDict, PdfName, PdfObject, PdfString
|
||||||
|
@ -809,6 +816,48 @@ class pdfdoc(object):
|
||||||
page = PdfDict(indirect=True)
|
page = PdfDict(indirect=True)
|
||||||
page[PdfName.Type] = PdfName.Page
|
page[PdfName.Type] = PdfName.Page
|
||||||
page[PdfName.MediaBox] = [0, 0, pagewidth, pageheight]
|
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.Resources] = resources
|
||||||
page[PdfName.Contents] = content
|
page[PdfName.Contents] = content
|
||||||
if rotate != 0:
|
if rotate != 0:
|
||||||
|
@ -1763,6 +1812,10 @@ def convert(*images, **kwargs):
|
||||||
outputstream=None,
|
outputstream=None,
|
||||||
first_frame_only=False,
|
first_frame_only=False,
|
||||||
allow_oversized=True,
|
allow_oversized=True,
|
||||||
|
cropborder=None,
|
||||||
|
bleedborder=None,
|
||||||
|
trimborder=None,
|
||||||
|
artborder=None,
|
||||||
)
|
)
|
||||||
for kwname, default in _default_kwargs.items():
|
for kwname, default in _default_kwargs.items():
|
||||||
if kwname not in kwargs:
|
if kwname not in kwargs:
|
||||||
|
@ -1870,6 +1923,10 @@ def convert(*images, **kwargs):
|
||||||
inverted,
|
inverted,
|
||||||
depth,
|
depth,
|
||||||
rotation,
|
rotation,
|
||||||
|
kwargs["cropborder"],
|
||||||
|
kwargs["bleedborder"],
|
||||||
|
kwargs["trimborder"],
|
||||||
|
kwargs["artborder"],
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs["outputstream"]:
|
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
|
setting. If the --border option is given while both the --pagesize and
|
||||||
--imgsize options are passed, then the --border option will be ignored.
|
--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,
|
% 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
|
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
|
of the input image. If the orientation of a page gets flipped, then so do the
|
||||||
values set via the --border option.
|
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,
|
viewer_fullscreen=args.viewer_fullscreen,
|
||||||
with_pdfrw=not args.without_pdfrw,
|
with_pdfrw=not args.without_pdfrw,
|
||||||
outputstream=args.output,
|
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:
|
except Exception as e:
|
||||||
logging.error("error: " + str(e))
|
logging.error("error: " + str(e))
|
||||||
|
|
Loading…
Reference in a new issue