在 16 个页面段中合并 2 个 PDF
Merge 2 PDF's in 16 page segments
我有 2 个 PDF,是将一个由 32 页签名组成的 2-up 文档拆分而成的。这意味着一个 PDF 有第 1-16、33-48、65-80 页....而另一个有第 17-32、49-64、81-96 页....
如何使用 Python 合并两者,遍历每个 16 页的片段?获得最终合成的 PDF 1-16, 17-32, 33-48, 49-64.....
我可以逐页迭代它们,我可以将一个完整的 PDF 一个接一个地合并,等等。但似乎无法获得按段合并的正确方法。
第一个操作是使用外部软件 (Xerox Freeflow Core) 完成的,我得到了 4 个文件,其中 16 页序列分为 even/odd 页,我加入它们迭代:
import itertools as itt
import sys
import PyPDF2 as PDF
def main():
fbase = sys.argv[1]
pdf_out = PDF.PdfFileWriter()
with open(fbase + "_odd.pdf", 'rb') as f_odd:
with open(fbase + "_even.pdf", 'rb') as f_even:
pdf_odd = PDF.PdfFileReader(f_odd)
pdf_even = PDF.PdfFileReader(f_even)
for p in itt.chain.from_iterable(
itt.zip_longest(
pdf_odd.pages,
(pdf_even.pages),
)
):
if p:
pdf_out.addPage(p)
with open(fbase + ".pdf", 'wb') as f_out:
pdf_out.write(f_out)
return 0
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Wrong number of arguments!")
sys.exit(1)
sys.exit(main())
然后我得到了上面提到的2个文件。如果我可以遍历 16p 段而不是逐页迭代,上面的代码对我有用。
有什么线索吗?
谢谢
知道了!
以防万一有人需要类似的东西,这对我有用:
import sys
import PyPDF2 as PDF
def main():
fbase = sys.argv[1]
all_pages = []
with open(fbase + "_odd.pdf", 'rb') as f_odd:
with open(fbase + "_even.pdf", 'rb') as f_even:
pdf_odd = PDF.PdfFileReader(f_odd)
pdf_even = PDF.PdfFileReader(f_even)
size_odd = len(pdf_odd.pages)
size_even = len(pdf_even.pages)
slice_idx = list(range(0,size_odd,16))
zip_pdfs = list(zip(pdf_odd.pages, pdf_even.pages))
for slice16_odd, slice16_even in [(pdf_odd.pages[el:el+16],
pdf_even.pages[el:el+16])
for el in slice_idx]:
all_pages.extend(slice16_odd)
all_pages.extend(slice16_even)
if size_odd > slice_idx[-1]:
all_pages.extend(slice16_odd[slice_idx[-1]:])
if size_even > slice_idx[-1]:
all_pages.extend(slice16_even[slice_idx[-1]:])
if any(all_pages):
pdf_out = PDF.PdfFileWriter()
for page in all_pages:
pdf_out.addPage(page)
with open(fbase + ".pdf", 'wb') as f_out:
pdf_out.write(f_out)
return 0
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Wrong number of arguments!")
sys.exit(1)
sys.exit(main())
还是谢谢...
BR
我有 2 个 PDF,是将一个由 32 页签名组成的 2-up 文档拆分而成的。这意味着一个 PDF 有第 1-16、33-48、65-80 页....而另一个有第 17-32、49-64、81-96 页....
如何使用 Python 合并两者,遍历每个 16 页的片段?获得最终合成的 PDF 1-16, 17-32, 33-48, 49-64.....
我可以逐页迭代它们,我可以将一个完整的 PDF 一个接一个地合并,等等。但似乎无法获得按段合并的正确方法。
第一个操作是使用外部软件 (Xerox Freeflow Core) 完成的,我得到了 4 个文件,其中 16 页序列分为 even/odd 页,我加入它们迭代:
import itertools as itt
import sys
import PyPDF2 as PDF
def main():
fbase = sys.argv[1]
pdf_out = PDF.PdfFileWriter()
with open(fbase + "_odd.pdf", 'rb') as f_odd:
with open(fbase + "_even.pdf", 'rb') as f_even:
pdf_odd = PDF.PdfFileReader(f_odd)
pdf_even = PDF.PdfFileReader(f_even)
for p in itt.chain.from_iterable(
itt.zip_longest(
pdf_odd.pages,
(pdf_even.pages),
)
):
if p:
pdf_out.addPage(p)
with open(fbase + ".pdf", 'wb') as f_out:
pdf_out.write(f_out)
return 0
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Wrong number of arguments!")
sys.exit(1)
sys.exit(main())
然后我得到了上面提到的2个文件。如果我可以遍历 16p 段而不是逐页迭代,上面的代码对我有用。
有什么线索吗?
谢谢
知道了! 以防万一有人需要类似的东西,这对我有用:
import sys
import PyPDF2 as PDF
def main():
fbase = sys.argv[1]
all_pages = []
with open(fbase + "_odd.pdf", 'rb') as f_odd:
with open(fbase + "_even.pdf", 'rb') as f_even:
pdf_odd = PDF.PdfFileReader(f_odd)
pdf_even = PDF.PdfFileReader(f_even)
size_odd = len(pdf_odd.pages)
size_even = len(pdf_even.pages)
slice_idx = list(range(0,size_odd,16))
zip_pdfs = list(zip(pdf_odd.pages, pdf_even.pages))
for slice16_odd, slice16_even in [(pdf_odd.pages[el:el+16],
pdf_even.pages[el:el+16])
for el in slice_idx]:
all_pages.extend(slice16_odd)
all_pages.extend(slice16_even)
if size_odd > slice_idx[-1]:
all_pages.extend(slice16_odd[slice_idx[-1]:])
if size_even > slice_idx[-1]:
all_pages.extend(slice16_even[slice_idx[-1]:])
if any(all_pages):
pdf_out = PDF.PdfFileWriter()
for page in all_pages:
pdf_out.addPage(page)
with open(fbase + ".pdf", 'wb') as f_out:
pdf_out.write(f_out)
return 0
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Wrong number of arguments!")
sys.exit(1)
sys.exit(main())
还是谢谢...
BR