pdf中的分页

xra*_*alf 76 command-line shell-script pdf conversion

我有一个扫描的 PDF 文件,其中两个不同的真实页面一起出现在一个虚拟页面上。

分辨率质量很好。问题是我在阅读时必须缩放并从左向右拖动。
是否有一些命令 ( convert, pdftk, ...) 或脚本可以将此 pdf 文件转换为普通页面(书中的一页 = pdf 文件中的一页)?

mar*_*rtz 73

只是一个补充,因为我在使用 python 脚本(和其他几个解决方案)时遇到了问题:对我来说mutool效果很好。这是优雅mupdf阅读器附带的一个简单而小巧的附加功能。所以你可以试试:

mutool poster -y 2 input.pdf output.pdf
Run Code Online (Sandbox Code Playgroud)

对于水平拆分,替换yx。当然,您可以将两者结合起来以获得更复杂的解决方案。

真的很高兴找到了这个(经过多年的日常 mupdf 使用:)


安装mupdfmutool从源

mutool从 1.4 版开始随 mupdf 一起提供:http : //www.mupdf.com/news

wget http://www.mupdf.com/downloads/mupdf-1.8-source.tar.gz
tar -xvf mupdf-1.8-source.tar.gz
cd mupdf-1.8-source
sudo make prefix=/usr/local install
Run Code Online (Sandbox Code Playgroud)

或前往下载页面查找更新版本。

mutool从 Linux 分发包安装

在 Debian 上,包含的包mutoolmupdf-tools

apt-get install mupdf-tools
Run Code Online (Sandbox Code Playgroud)

  • 这是最简单和更好的。`mutool` 就是为此而制作的。另外,当心`-y`,我认为在大多数情况下你想要的是`-x`。 (6认同)
  • 我有一个 djvu ......我把它变成了一个附言(相当快),然后变成了一个 pdf(乌龟慢)——最后 mutool 把它剪得太快了,我以为它没有用——它有! (3认同)
  • 是的,我对速度也很满意。 (2认同)
  • 这个实用程序非常快,但是我对页面顺序有问题。该命令在第一个位置分配右页,在第二个位置分配左页。有人可以帮我解决这个问题吗? (2认同)

Gil*_*il' 51

这是一个使用旧 PyPdf 库的小型 Python 脚本,它可以巧妙地完成这项工作。将其保存在名为un2up(或您喜欢的任何脚本)的脚本中,使其可执行 ( chmod +x un2up),然后将其作为过滤器 ( un2up <2up.pdf >1up.pdf) 运行。

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight
    p.mediaBox.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    output.addPage(p)
    output.addPage(q)
output.write(sys.stdout)
Run Code Online (Sandbox Code Playgroud)

忽略任何弃用警告;只有 PyPdf 维护者需要关心这些。

如果输入的方向不寻常,则在截断页面时可能需要使用不同的坐标。请参阅为什么我的代码未正确拆分扫描的 pdf 中的每一页?


以防万一它有用,这是我之前的答案,它使用了两种工具和一些手动干预的组合:

  • Pdfjam(至少 2.0 版),基于pdfpages LaTeX 包,裁剪页面;
  • Pdftk,将左右两半重新组合在一起。

这两种工具都是必需的,因为据我所知 pdfpages 无法在一个流中对同一页面应用两种不同的转换。在对 的调用中pdftk,将 42 替换为输入文档中的页数 ( 2up.pdf)。

pdfjam -o odd.pdf --trim '0cm 0cm 14.85cm 0cm' --scale 1.141 2up.pdf
pdfjam -o even.pdf --trim '14.85cm 0cm 0cm 0cm' --scale 1.141 2up.pdf
pdftk O=odd.pdf E=even.pdf cat $(i=1; while [ $i -le 42 ]; do echo O$i E$i; i=$(($i+1)); done) output all.pdf
Run Code Online (Sandbox Code Playgroud)

如果您没有 pdfjam 2.0,使用 pdfpages 包安装 PDFLaTeX 就足够了(在 Ubuntu 上:您需要texlive-latex-recommended 安装 texlive-latex-recommended也许(在 Ubuntu 上:texlive-fonts-recommended 安装 texlive-fonts-recommended),并使用以下驱动程序文件driver.tex

\batchmode
\documentclass{minimal}
\usepackage{pdfpages}
\begin{document}
\includepdfmerge[trim=0cm 0cm 14.85cm 0cm,scale=1.141]{2up.pdf,-}
\includepdfmerge[trim=14.85cm 0cm 0cm 0cm,scale=1.141]{2up.pdf,-}
\end{document}
Run Code Online (Sandbox Code Playgroud)

然后运行以下命令,将 42 替换为输入文件中的页数(必须调用2up.pdf):

pdflatex driver
pdftk driver.pdf cat $(i=1; pages=42; while [ $i -le $pages ]; do echo $i $(($pages+$i)); i=$(($i+1)); done) output 1up.pdf
Run Code Online (Sandbox Code Playgroud)


小智 19

Imagemagick 可以一步完成:

$ convert in.pdf -crop 50%x0 +repage out.pdf
Run Code Online (Sandbox Code Playgroud)

  • 看起来 convert 使用光栅作为中间格式。即使原始 PDF 包含矢量对象,也会导致外观模糊。 (14认同)
  • 这将文本呈现为图像并从图像创建 pdf。也许对图片很好,但对文本提取没用。 (4认同)
  • 谢谢。如果我添加`-密度 400` 参数` 它具有更好的质量。 (2认同)

小智 7

基于Gilles 的回答以及如何找到我写的PDF 页数

#!/bin/bash

pdforiginal=$1
pdfood=$pdforiginal.odd.pdf
pdfeven=$pdforiginal.even.pdf
pdfout=output_$1
margin=${2:-0}
scale=${3:-1}

pages=$(pdftk $pdforiginal dump_data | grep NumberOfPages | awk '{print $2}')

pagesize=$(pdfinfo $pdforiginal | grep "Page size" | awk '{print $5}')
margin=$(echo $pagesize/2-$margin | bc -l)

pdfjam -o $pdfood --trim "0cm 0cm ${margin}pt 0cm" --scale $scale $pdforiginal
pdfjam -o $pdfeven --trim "${margin}pt 0cm 0cm 0cm" --scale $scale  $pdforiginal

pdftk O=$pdfood E=$pdfeven cat $(i=1; while [ $i -le $pages ]; do echo O$i E$i; i=$(($i+1)); done) output $pdfout

rm $pdfood $pdfeven
Run Code Online (Sandbox Code Playgroud)

所以我可以跑

./split.sh my.pdf 50 1.2
Run Code Online (Sandbox Code Playgroud)

其中 50 用于调整边距,1.2 用于缩放。


小智 6

ImageMagick 的 Convert 命令可以帮助您将文件分成两部分。见http://www.imagemagick.org/Usage/crop/

如果我是你,我会写一个这样的(shell)脚本:

  1. 使用pdfsam拆分文件:磁盘上的 1 页 = 1 个文件(格式无关紧要。选择 ImageMagick 知道的一个。我只需要 PS 或 PDF。
  2. 对于每一页,裁剪前半部分并将其放入名为 ${PageNumber}A 的文件中

  3. 裁剪下半部分并将其放入名为 ${PageNumber}B 的文件中。

    你得到 1A.pdf、1B.pdf、2A.pdf、2B.pdf 等。

  4. 现在,再次将其组装到新的 PDF 中。 有很多方法可以做到这一点。


小智 5

这是 Gilles 发布的 PyPDF 代码的变体。无论页面方向如何,此功能都将起作用:

import copy
import math
import pyPdf

def split_pages(src, dst):
    src_f = file(src, 'r+b')
    dst_f = file(dst, 'w+b')

    input = pyPdf.PdfFileReader(src_f)
    output = pyPdf.PdfFileWriter()

    for i in range(input.getNumPages()):
        p = input.getPage(i)
        q = copy.copy(p)
        q.mediaBox = copy.copy(p.mediaBox)

        x1, x2 = p.mediaBox.lowerLeft
        x3, x4 = p.mediaBox.upperRight

        x1, x2 = math.floor(x1), math.floor(x2)
        x3, x4 = math.floor(x3), math.floor(x4)
        x5, x6 = math.floor(x3/2), math.floor(x4/2)

        if x3 > x4:
            # horizontal
            p.mediaBox.upperRight = (x5, x4)
            p.mediaBox.lowerLeft = (x1, x2)

            q.mediaBox.upperRight = (x3, x4)
            q.mediaBox.lowerLeft = (x5, x2)
        else:
            # vertical
            p.mediaBox.upperRight = (x3, x4)
            p.mediaBox.lowerLeft = (x1, x6)

            q.mediaBox.upperRight = (x3, x6)
            q.mediaBox.lowerLeft = (x1, x2)

        output.addPage(p)
        output.addPage(q)

    output.write(dst_f)
    src_f.close()
    dst_f.close()
Run Code Online (Sandbox Code Playgroud)


Edu*_*scu 5

最好的解决方案是 mutool 见上文:

sudo apt install mupdf-tools pdftk
Run Code Online (Sandbox Code Playgroud)

分裂:

mutool poster -y 2 input.pdf output.pdf
Run Code Online (Sandbox Code Playgroud)

但随后您需要向左旋转页面:

pdftk output.pdf cat 1-endleft output rotated.pdf
Run Code Online (Sandbox Code Playgroud)