Linux虚拟环境Python3.11安装pdfnup失败,求解决或pypdf替代方案
问题解决:pdfnup安装失败与pypdf替代方案
错误原因
你遇到的SyntaxError是因为pdfnup是基于Python 2开发的包,其代码中的except pkg_resources.VersionConflict, e:是Python 2的异常捕获语法,在Python 3中已被弃用(必须改为except pkg_resources.VersionConflict as e:),直接用pip3安装会触发语法错误。
一、安装pdfnup的可行方法
方法1:修改源码后本地安装
- 下载源码包:
pip3 download pdfnup --no-deps - 解压下载的压缩包:
tar -xzf pdfnup-*.tar.gz - 进入解压目录,编辑
ez_setup.py文件,找到第94行的异常捕获代码,将:
修改为:except pkg_resources.VersionConflict, e:except pkg_resources.VersionConflict as e: - 检查并修复其他可能存在的Python 2语法问题(比如无括号的
print语句),然后执行本地安装:pip3 install .
方法2:使用Python 2虚拟环境
如果必须使用原版pdfnup,可以创建Python 2虚拟环境来安装:
- 安装Python 2和virtualenv:
sudo apt-get install python2 virtualenv - 创建并激活Python 2虚拟环境:
virtualenv -p python2 venv_py2 source venv_py2/bin/activate - 安装pdfnup:
pip install pdfnup
二、用pypdf实现pdfnup核心功能(多页合并到单页)
pdfnup的核心功能是将多个PDF页面合并到同一页(如2-up、4-up排版),用pypdf可以直接实现,示例如下:
1. 安装pypdf
pip3 install pypdf
2. 示例代码(2-up横向排版)
from pypdf import PdfReader, PdfWriter from pypdf.generic import RectangleObject def merge_pages_to_sheet(input_pdf, output_pdf, pages_per_sheet=2): reader = PdfReader(input_pdf) writer = PdfWriter() if not reader.pages: return # 获取原页面尺寸 orig_width = reader.pages[0].mediabox.width orig_height = reader.pages[0].mediabox.height # 计算新页面尺寸(横向排版) new_page_width = orig_width * pages_per_sheet new_page_height = orig_height # 按分组合并页面 for start_idx in range(0, len(reader.pages), pages_per_sheet): # 创建空白页面作为载体 new_page = writer.add_blank_page(width=new_page_width, height=new_page_height) # 处理当前组内的页面 for offset in range(pages_per_sheet): current_idx = start_idx + offset if current_idx >= len(reader.pages): break # 获取当前页面并设置位置 page = reader.pages[current_idx] page.mediabox = RectangleObject((0, 0, orig_width, orig_height)) new_page.merge_translated_page(page, orig_width * offset, 0) # 写入输出文件 with open(output_pdf, "wb") as f: writer.write(f) # 调用示例:将input.pdf合并为2页/单页的output.pdf merge_pages_to_sheet("input.pdf", "output_2up.pdf", pages_per_sheet=2)
代码扩展说明
- 如果需要纵向排版(如2页上下排列),只需修改新页面尺寸为
new_page_width = orig_width、new_page_height = orig_height * pages_per_sheet,并调整merge_translated_page的y轴偏移量为orig_height * offset - 修改
pages_per_sheet参数为4即可实现4-up排版
内容的提问来源于stack exchange,提问作者amirmohammad firouzfar
相关产品推荐
相关产品推荐

