add zine to pdf2book.pdf
This commit is contained in:
parent
ccaf0577ca
commit
a922e6b4b7
103
pdf2book.py
103
pdf2book.py
@ -1,7 +1,9 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from pypdf import PdfReader
|
from pypdf import PaperSize, PdfReader, PdfWriter, Transformation
|
||||||
from pypdf import PdfWriter
|
from pypdf.generic import RectangleObject
|
||||||
|
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
prog='pdf2book',
|
prog='pdf2book',
|
||||||
@ -12,6 +14,7 @@ parser.add_argument('pdf_file') # positional argument
|
|||||||
#parser.add_argument('pages', type=int) # positional argument
|
#parser.add_argument('pages', type=int) # positional argument
|
||||||
#parser.add_argument('-s', '--signature') # option that takes a value
|
#parser.add_argument('-s', '--signature') # option that takes a value
|
||||||
parser.add_argument('-v', '--verbose', action='store_true') # on/off flag
|
parser.add_argument('-v', '--verbose', action='store_true') # on/off flag
|
||||||
|
parser.add_argument('-z', '--zine', action='store_true', help='Input pdf needs to be 16 pages')
|
||||||
parser.add_argument('-s', '--signature',
|
parser.add_argument('-s', '--signature',
|
||||||
dest='signature',
|
dest='signature',
|
||||||
type=int,
|
type=int,
|
||||||
@ -83,6 +86,7 @@ def get_reorder(number_of_pages: int, signature_size: int):
|
|||||||
#print(lst)
|
#print(lst)
|
||||||
#print(len(lst))
|
#print(len(lst))
|
||||||
return lst
|
return lst
|
||||||
|
|
||||||
def print_signatures(lst: list,signature_size: int):
|
def print_signatures(lst: list,signature_size: int):
|
||||||
if signature_size==0: signature_size=1
|
if signature_size==0: signature_size=1
|
||||||
for i in range( len( lst ) ):
|
for i in range( len( lst ) ):
|
||||||
@ -92,13 +96,9 @@ def print_signatures(lst: list,signature_size: int):
|
|||||||
print(lst[i], end=' ')
|
print(lst[i], end=' ')
|
||||||
else:
|
else:
|
||||||
print(lst[i],end='.')
|
print(lst[i],end='.')
|
||||||
lst=get_reorder(number_of_pages, signature_size)
|
|
||||||
print_signatures(lst,signature_size)
|
|
||||||
|
|
||||||
# REARRANGING OF PAGES
|
# REARRANGING OF PAGES
|
||||||
|
|
||||||
def rearrange_pages(reader, lst):
|
def rearrange_pages(reader, lst):
|
||||||
|
|
||||||
writer = PdfWriter()
|
writer = PdfWriter()
|
||||||
for page in lst:
|
for page in lst:
|
||||||
# print(page)
|
# print(page)
|
||||||
@ -106,11 +106,96 @@ def rearrange_pages(reader, lst):
|
|||||||
writer.add_blank_page(width=reader.pages[0].mediabox.width,height=reader.pages[0].mediabox.height)
|
writer.add_blank_page(width=reader.pages[0].mediabox.width,height=reader.pages[0].mediabox.height)
|
||||||
else:
|
else:
|
||||||
writer.add_page(reader.pages[page-1])
|
writer.add_page(reader.pages[page-1])
|
||||||
|
|
||||||
return writer
|
return writer
|
||||||
|
|
||||||
|
def make_zine(reader, lst):
|
||||||
|
# _____________________
|
||||||
|
# | 1r | 8r | 7r | 6r |
|
||||||
|
# ---------------------
|
||||||
|
# | 2 | 3 | 4 | 5 |
|
||||||
|
# ---------------------
|
||||||
|
#
|
||||||
|
# _________________________
|
||||||
|
# | 9r | 16r | 15r | 14r |
|
||||||
|
# -------------------------
|
||||||
|
# | 10 | 11 | 12 | 13 |
|
||||||
|
# -------------------------
|
||||||
|
#
|
||||||
|
page_order=[
|
||||||
|
2, 3, 4, 5,
|
||||||
|
1, 8, 7, 6,
|
||||||
|
10,11,12,13,
|
||||||
|
9,16,15,14
|
||||||
|
]
|
||||||
|
print("zine")
|
||||||
|
# Create a destination file, and add a blank page to it
|
||||||
|
writer = PdfWriter()
|
||||||
|
# Copy source page to destination page, several times
|
||||||
|
for i in range(2):
|
||||||
|
destpage = writer.add_blank_page(
|
||||||
|
width=PaperSize.A4.height,
|
||||||
|
height=PaperSize.A4.width
|
||||||
|
)
|
||||||
|
for y in range(2):
|
||||||
|
for x in range(4):
|
||||||
|
pageposition=8*i+4*y+x
|
||||||
|
sourcepage=reader.pages[page_order[pageposition]-1]
|
||||||
|
mb=sourcepage.mediabox
|
||||||
|
sourcepage.cropbox = RectangleObject((
|
||||||
|
-2*mb.right,
|
||||||
|
-4*mb.top,
|
||||||
|
2*mb.right,
|
||||||
|
2*mb.top
|
||||||
|
))
|
||||||
|
if y == 1:
|
||||||
|
transformation = Transformation().rotate(180)
|
||||||
|
r="r"
|
||||||
|
sourcepage.add_transformation(transformation)
|
||||||
|
tx_val=(1*x+1) * sourcepage.mediabox.width
|
||||||
|
ty_val=2*y * sourcepage.mediabox.height
|
||||||
|
else:
|
||||||
|
tx_val=x * sourcepage.mediabox.width
|
||||||
|
ty_val=2*y * sourcepage.mediabox.height
|
||||||
|
r=" "
|
||||||
|
if x==3:
|
||||||
|
print(page_order[pageposition],r)
|
||||||
|
else:
|
||||||
|
print(page_order[pageposition],r,end=' ')
|
||||||
|
destpage.merge_transformed_page(
|
||||||
|
sourcepage,
|
||||||
|
Transformation(
|
||||||
|
).translate(
|
||||||
|
tx=tx_val,
|
||||||
|
ty=ty_val,
|
||||||
|
).scale(
|
||||||
|
sx=0.5,
|
||||||
|
sy=0.5
|
||||||
|
)
|
||||||
|
, expand=True
|
||||||
|
)
|
||||||
|
# destpage.
|
||||||
|
destpage.mediabox = RectangleObject((
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2*mb.right,
|
||||||
|
1*mb.top
|
||||||
|
))
|
||||||
|
#writer.add_page(destpage)
|
||||||
|
# destpage = writer.add_blank_page(
|
||||||
|
# width=PaperSize.A4.height,
|
||||||
|
# height=PaperSize.A4.width
|
||||||
|
# )
|
||||||
|
return writer
|
||||||
|
|
||||||
|
lst=get_reorder(number_of_pages, signature_size)
|
||||||
|
if args.zine :
|
||||||
|
writer=make_zine(reader, lst)
|
||||||
|
# signature_size=zine
|
||||||
|
outfile=args.pdf_file.split(".pdf")[0]+"_zine.pdf"
|
||||||
|
else:
|
||||||
|
print_signatures(lst,signature_size)
|
||||||
|
writer=rearrange_pages(reader,lst)
|
||||||
|
outfile=args.pdf_file.split(".pdf")[0]+"_book_s"+str(signature_size)+".pdf"
|
||||||
# SAVE FILE TO DISK
|
# SAVE FILE TO DISK
|
||||||
writer=rearrange_pages(reader,lst)
|
|
||||||
outfile=args.pdf_file.split(".pdf")[0]+"_book_s"+str(signature_size)+".pdf"
|
|
||||||
with open(outfile, "wb") as fp:
|
with open(outfile, "wb") as fp:
|
||||||
writer.write(fp)
|
writer.write(fp)
|
||||||
|
BIN
testfiles/zine.pdf
Normal file
BIN
testfiles/zine.pdf
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user