You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:58:41