linux 如何将多个PDF页面合并为一个页面

pb3s4cty  于 2023-02-03  发布在  Linux
关注(0)|答案(4)|浏览(219)

我有一个4页的PDF。我想创建另一个PDF,其中页面在一个页面中一个接一个地放置(垂直对齐)。哪个命令行工具可以用于此?

x3naxklr

x3naxklr1#

如果您使用类Unix操作系统,则有pdfjam,它将Latex后端与一个简单的命令结合在一起:
pdfjam --nup 1x4,landscape input.pdf
编辑:最近我在使用pdfjam时遇到了这个命令的问题。我用它来工作:
cat input.pdf | pdfjam -nup 1x4 -landscape –outfile out.pdf
their docs开始:

A potential drawback of pdfjam and other scripts based upon it is that any hyperlinks in the source PDF are lost
zbq4xfa0

zbq4xfa02#

执行此任务有几种方法,一种更简单,一种更困难

* 更简单的方法:* 多价. jar方法

jar是一个令人惊叹的免费软件,能够在pdf上执行许多有用的任务
你可以从其中一个链接下载(sourceforge上的2009 multivalent.jar版本没有更多的pdf工具)

java -cp路径..to/Multivalent.jar工具.pdf.强制-4x 1尺寸-纸张84x29.7厘米输入. pdf
这是由并排缝合在一起的4个连续页面组成的结果页面:

说明:

-dim 4x 1表示行的列数
-纸张84x29.7厘米表示最终拼版文件的纸张大小,该文件包含4页并排的内容。显然,由于最终的pdf文件只有4列和1行,因此需要将文件乘以4(21厘米)

多价也可接受英寸***(-纸张33.4x11.68英寸**)或附言磅*(-纸张2380 x841磅)作为单位输入

的 * 硬 *:乳胶方式:

4_pdf页面_并排附加
几年前,Peter Flynn在comp.text.pdf中建议,对于类似的任务,只需借助LateX即可 * 并排追加 * pdf页面。如果您是一名LaTeXian用户,您可以执行以下操作:
因为你需要
并排附加你的
*多页 * pdf的四页,你将写一个latex序言,创建一个新文档,如下所示:
假设您的pdf文档的名称为
input.pdf**,大小为ISO A4,并且您的工作文件夹中有此多页pdf,则您将拥有

\documentclass[a4paper]{article}
\usepackage[margin=0mm,nohead,nofoot]{geometry}
\usepackage{pdfpages}
\pagestyle{empty}
\parindent0pt
\begin{document}
\includepdfmerge[nup=1x4,landscape]{input.pdf,1,input.pdf,2,input.pdf,3,input.pdf,4}
\end{document}
hwamh0ep

hwamh0ep3#

我刚刚对CoherentPDF执行了此操作

cpdf -impose-xy "0 4" in.pdf -o out.pdf

如果页数未知,请将其设置为更大的值,如

cpdf -impose-xy "0 99" in.pdf -o out.pdf

-impose-xy的x值可被设置为零以指示无限宽的页;y值,表示无限长。在这两种情况下,输入文件**()中的页被假定为具有相同的维度。**
更多选项可以在优秀的手册中探索:
https://www.coherentpdf.com/cpdfmanual/cpdfmanualch9.html#x13-860009.2
)在我的情况下,首先我必须缩放最后一页,以适应其他页面的尺寸,然后是强加。

cpdf \
-scale-to-fit "768pt 1024pt" -top 0 in.pdf end \
AND \
-impose-xy "99 0" in.pdf \
-o out.pdf
cotxawn7

cotxawn74#

我最近遇到了一个类似的问题。我需要开发一个预处理PDF的解决方案,以便使用tabula-py包更好地识别表格。下面是我的问题的分步解决方案:
1.删除所有n页的页眉和页脚;
1.将PDF拆分为n文件,每个文件包含1个单页;
1.从n文件中根据其边界框裁剪单页;
1.将n文件合并为1个包含1页的PDF,保持顺序;
1.使用tabula-py从基于文本的PDF读取和预处理表格。
在我的例子中,步骤3可以生成不同尺寸的文件。当使用pdfjam命令时,我在步骤4对齐页面时遇到问题,即使使用--pagetemplate参数也是如此。对我来说,垂直对齐是最糟糕的。
幸运的是,我能够使用基于LaTeX的方法解决这个页面对齐问题。下面是我使用的基本源代码--将所有文件放在同一个目录中。

**本文问题的答案在“Shell脚本”部分,从“使用LaTeX将”n“个页面合并为一个页面......"开始。

要求:

我使用Debian linux发行版测试了这个解决方案。例如,要在Windows上工作,您可以使用install Debian via WSL。假设您使用的是Debian或Ubuntu,请运行以下命令:

sudo apt update
sudo apt install texlive-extra-utils texlive-latex-extra poppler-utils ghostscript default-jdk -y

由于PDF预处理的结果,最终文件的尺寸可能会减小,尤其是宽度。即使它是矢量化的,减小PDF的大小也会对使用tabula-py工具提取表格的质量产生负面影响。
为了增加最终PDF文件的大小,同时保持纵横比,我们可以使用cpdf工具,如果使用Linux发行版,只需将binary file复制到Shell脚本所在的目录,然后给予二进制文件执行权限:

chmod +x cpdf

LaTeX模板:

创建一个名为pdf_merge_template.tex的文件,其内容如下:

\documentclass[dvipdfmx]{article}

\usepackage[margin=0in]{geometry}
\usepackage{pdfpages}

\begin{document}

\centering<PDF-PAGES>

\end{document}

shell 脚本:

创建一个名为pdf-preprocessing.sh的文件,其内容如下:

#!/bin/bash

# References
# ----------
# [PDF preprocessing] https://stackoverflow.com/a/71802078/16109419

PDF_MERGE_TEMPLATE_FILENAME="pdf_merge_template.tex"
PDF_MERGE_TEMPLATE_PAGES_MACRO="<PDF-PAGES>"
CPDF_FILENAME="cpdf"  # Binary file of "Coherent PDF" tool.

INPUT_FILEPATH=$1
OUTPUT_FILEPATH=$2

if [ "$#" -eq  "2" ]; then
    echo "Starting PDF preprocessing..."
else
    echo "ERROR: Wrong arguments ('INPUT_FILEPATH', 'OUTPUT_FILEPATH')!"
    exit
fi

TEMP_DIR_PATH=$(mktemp -d)
echo "Setting up working directory: ${TEMP_DIR_PATH}"

THIS_FILENAME=$(readlink -f "$0")
THIS_DIR=$(dirname "$THIS_FILENAME")
PDF_MERGE_TEMPLATE_PATH="${THIS_DIR}/${PDF_MERGE_TEMPLATE_FILENAME}"
CPDF_BIN_PATH="${THIS_DIR}/${CPDF_FILENAME}"

echo "Removing header and footer from all pages..."

# Removing header and footer from PDF pages based on margin settings (e.g., '5 -75 5 -25'):
pdfcrop --margins '5 -75 5 -25' "${INPUT_FILEPATH}" "${TEMP_DIR_PATH}/input-tmp.pdf"

# Deleting the textual content of the cut parts:
pdftocairo "${TEMP_DIR_PATH}/input-tmp.pdf" "${TEMP_DIR_PATH}/input.pdf" -pdf

# Counting the number of pages from PDF:
NUM_PAGES=$(pdfinfo "${TEMP_DIR_PATH}/input.pdf" | awk '/^Pages:/ {print $2}')
REL_PAGE_WIDTH=$(python -c "print(1 / ${NUM_PAGES})")
PAGES_LIST=""

echo "Cropping each page based on its specific bounding box..."
for i in $(seq 1 $NUM_PAGES)
do
    # Splitting current page:
    pdfjam "${TEMP_DIR_PATH}/input.pdf" $i --outfile "${TEMP_DIR_PATH}/page_${i}-tmp.pdf"

    # Fetching bounding box of current page:
    PAGE_WIDTH=$(pdfinfo "${TEMP_DIR_PATH}/page_${i}-tmp.pdf" | awk '/^Page size:/ {print $3}')
    BBOX=$(gs -dBATCH -dNOPAUSE -q -sDEVICE=bbox "${TEMP_DIR_PATH}/page_${i}-tmp.pdf" 2>&1 | awk '/^%%HiResBoundingBox:/ {print 0 " " $3 " " '${PAGE_WIDTH}' " " $5}')

    # Removing content out of current page's bounding box:
    PAGE_FILENAME="page_${i}"
    PDF_FILEPATH="${TEMP_DIR_PATH}/${PAGE_FILENAME}.pdf"
    PS_FILEPATH="${TEMP_DIR_PATH}/${PAGE_FILENAME}.ps"
    gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -sOutputFile=$PDF_FILEPATH -c "[/CropBox [${BBOX}] /PAGES pdfmark" -f "${TEMP_DIR_PATH}/page_${i}-tmp.pdf"

    PAGES_LIST="${PAGES_LIST}\n    \\\includegraphics[width=${REL_PAGE_WIDTH}\\\textwidth]{${PDF_FILEPATH}} \\\\\\\ \\\vspace{-0.03cm}"
done

echo "Merging the 'n' pages into a single one using LaTeX..."
cp $PDF_MERGE_TEMPLATE_PATH "${TEMP_DIR_PATH}/merged.tex"
sed -i "s#${PDF_MERGE_TEMPLATE_PAGES_MACRO}#${PAGES_LIST}#g" "${TEMP_DIR_PATH}/merged.tex"
latex -halt-on-error -output-directory $TEMP_DIR_PATH "${TEMP_DIR_PATH}/merged.tex"
dvipdfm "${TEMP_DIR_PATH}/merged.dvi" -o "${TEMP_DIR_PATH}/merged.pdf"

echo "Finalizing the PDF and sending a copy to the destination directory..."

# Adding margins to the final PDF:
pdfcrop --margins 5 "${TEMP_DIR_PATH}/merged.pdf" "${TEMP_DIR_PATH}/output-tmp.pdf"

# Enlargement of the final PDF file to extract tables correctly using the "tabula-py" tool:
$CPDF_BIN_PATH -scale-page "10 10" "${TEMP_DIR_PATH}/output-tmp.pdf" -o "${TEMP_DIR_PATH}/output.pdf"

# Copying the pre-processed PDF file to the output path:
cp "${TEMP_DIR_PATH}/output.pdf" "${OUTPUT_FILEPATH}"

echo "Deleting temp files..."
rm -rf "${TEMP_DIR_PATH}"

使用以下命令为脚本给予执行权限:

chmod +x pdf-preprocessing.sh

用法示例:

要预处理名为example.pdf的文件,只需运行以下命令:

sh pdf-preprocessing.sh example.pdf preprocessed-example.pdf

根据你的情况编辑脚本参数。例如,页眉和页脚坐标将取决于你的文件模板。请随意提出改进和简化建议。

相关问题