lmat - Reinstate Monica Asked: 2024-11-11 20:14:44 +0800 CST2024-11-11 20:14:44 +0800 CST 2024-11-11 20:14:44 +0800 CST 如何将一个 pdf 页面的一部分移动到另一个 pdf 页面上 772 我有一份 2 页的 PDF 文档。我想创建一个新的单页 PDF 文档,其中包含原始文档 p1 的一部分和 p2 的一部分(见图片链接): 做到这一点的最好方法是什么? pdf 2 个回答 Voted Best Answer johnwhitington 2024-11-13T22:33:32+08:002024-11-13T22:33:32+08:00 大致未经测试: 分成两部分: cpdf in.pdf 1 -o 1.pdf cpdf in.pdf 2 -o 2.pdf 现在,将第二页的内容向下移动: cpdf -shift "0 dy" 2.pdf -o shifted.pdf 现在,裁剪您想要剪切的框: cpdf -cropbox "x y w h" shifted.pdf -o cropped.pdf 现在,通过剪切将裁剪框固定下来: cpdf -hard-box /CropBox cropped.pdf -o clipped.pdf 现在,将一个文件盖印到另一个文件上: cpdf -stamp-on clipped.pdf 1.pdf -o final.pdf 您需要为 选择适当的值dy, x, y, w, h。 如果有两页以上的页面,您可以在开始时用cpdf in.pdf odd -o 1.pdf和代替cpdf in.pdf even -o 2.pdf,以便一次性完成所有操作。 lmat - Reinstate Monica 2024-11-11T22:32:42+08:002024-11-11T22:32:42+08:00 一个目标是避免文档“栅格化”。字母仍应是“字母”(而不是字母的图片),输入 PDF 中的任何图像都应保留其原始光彩,而不是重新采样。我非常确定此处概述的方法可以实现这一点。 总体来说,做法是: 将每个输入部分隔离到其自己的 PDF 文件中 创建具有所需最终尺寸的空白 PDF (滥用)使用 pdftk 将各部分放置到空白文档上 似乎应该可以跳过上面的步骤 1 并将其作为步骤 3 的一部分来执行,但我无法弄清楚如何 1) 从输入中选择一页以及 2) 在插入空白文档之前裁剪输入页面。 详细步骤 创建“工作区”目录 mkdir pdftk && cd pdftk; 放置输入文件 cp ~/Downloads/ticket.pdf .; 创建与所需最终尺寸相匹配的空白 PDF magick xc:none -page Letter a.pdf; 隔离输入页面 1(对于页面 2 也类似) pdftk ticket.pdf cat 1 output ticket-p1.pdf 裁剪输入页面 pdfcrop --margins '0 0 0 -440' ticket-p1.pdf ticket-p1-cropped.pdf git clone 'https://gitlab.com/pdftk-java/pdftk.git' source; cd source && git checkout origin/master mvn package -DskipTests=true 初始构建以确保您拥有所需的一切。立即修复所有构建错误(更正路径上的 jdk 等)。 应用以下补丁 diff --git a/java/com/gitlab/pdftk_java/filter.java b/java/com/gitlab/pdftk_java/filter.java index c2b92d5..dea82e9 100644 --- a/java/com/gitlab/pdftk_java/filter.java +++ b/java/com/gitlab/pdftk_java/filter.java @@ -415,7 +415,7 @@ class filter { float[] trans = null; if (mark_page_rotation == 0) { - trans = new float[] {mark_scale, 0, 0, mark_scale, h_trans, v_trans}; + trans = new float[] {1, 0, 0, 1, (float)40, (float)450}; } else if (mark_page_rotation == 90) { trans = new float[] { 从差异中可以看出,您可以根据需要缩放和翻译您的输入。 运行修改后的代码 mvn package -DskipTests=true cd target/ java -jar pdftk-java-*.jar ../../blank.pdf background ../../ticket-p1-cropped.pdf output ../../phase1.pdf 再次修饰filter.java并创建第二阶段: java -jar pdftk-java-*.jar ../../phase1.pdf background ../../ticket-p2-cropped.pdf output ../../phase2.pdf
大致未经测试:
cpdf in.pdf 1 -o 1.pdf
cpdf in.pdf 2 -o 2.pdf
cpdf -shift "0 dy" 2.pdf -o shifted.pdf
cpdf -cropbox "x y w h" shifted.pdf -o cropped.pdf
cpdf -hard-box /CropBox cropped.pdf -o clipped.pdf
cpdf -stamp-on clipped.pdf 1.pdf -o final.pdf
您需要为 选择适当的值
dy, x, y, w, h
。如果有两页以上的页面,您可以在开始时用
cpdf in.pdf odd -o 1.pdf
和代替cpdf in.pdf even -o 2.pdf
,以便一次性完成所有操作。一个目标是避免文档“栅格化”。字母仍应是“字母”(而不是字母的图片),输入 PDF 中的任何图像都应保留其原始光彩,而不是重新采样。我非常确定此处概述的方法可以实现这一点。
总体来说,做法是:
似乎应该可以跳过上面的步骤 1 并将其作为步骤 3 的一部分来执行,但我无法弄清楚如何 1) 从输入中选择一页以及 2) 在插入空白文档之前裁剪输入页面。
详细步骤
mkdir pdftk && cd pdftk;
cp ~/Downloads/ticket.pdf .;
magick xc:none -page Letter a.pdf;
pdftk ticket.pdf cat 1 output ticket-p1.pdf
pdfcrop --margins '0 0 0 -440' ticket-p1.pdf ticket-p1-cropped.pdf
git clone 'https://gitlab.com/pdftk-java/pdftk.git' source;
cd source && git checkout origin/master
mvn package -DskipTests=true
mvn package -DskipTests=true
cd target/
java -jar pdftk-java-*.jar ../../blank.pdf background ../../ticket-p1-cropped.pdf output ../../phase1.pdf
filter.java
并创建第二阶段:java -jar pdftk-java-*.jar ../../phase1.pdf background ../../ticket-p2-cropped.pdf output ../../phase2.pdf