PDF - 删除白边

2024-02-25

我想知道如何从 PDF 文件中删除白边距。就像 Adob​​e Acrobat X Pro 一样。据我所知,它并不适用于每个 PDF 文件。

我猜想做到这一点的方法是获取文本边距,然后裁剪掉该边距。

PyPdf 是首选。

iText 根据以下代码查找文本边距:

public void addMarginRectangle(String src, String dest)
    throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(RESULT));
    TextMarginFinder finder;
    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        finder = parser.processContent(i, new TextMarginFinder());
        PdfContentByte cb = stamper.getOverContent(i);
        cb.rectangle(finder.getLlx(), finder.getLly(),
            finder.getWidth(), finder.getHeight());
        cb.stroke();
    }
    stamper.close();
}

我对 PyPDF 不太熟悉,但我知道 Ghostscript 能够为你做到这一点。以下是类似问题的其他一些答案的链接:

  1. 将 PDF 每页 2 面转换为每页 1 面 https://superuser.com/a/189109/40894(超级用户.com)
  2. 可以从中间分割 pdf 页面的免费软件吗? https://superuser.com/a/235401/40894(超级用户.com)
  3. 使用 Ghostscript 9.01 裁剪 PDF https://stackoverflow.com/a/6184547/359307(StackOverflow.com)

第三个答案可能就是你说的'我了解它不适用于每个 PDF 文件'。它使用pdfmark命令尝试设置/CropBox到 PDF 页面对象中。

前两个答案的方法很可能会成功,而第三个答案会失败。此方法使用 PostScript 命令片段<</PageOffset [NNN MMM]>> setpagedevice将 PDF 页面移动并放置在由-gNNNNxMMMM参数(定义设备宽度和高度(以像素为单位))。

如果您理解前两个答案背后的概念,您将能够轻松地调整其中使用的方法来裁剪 PDF 页面所有 4 个边缘的边距:

一个示例命令,用于在 4 个边缘上将字母大小的 PDF (8.5x11in == 612x792pt) 裁剪半英寸 (==36pt)(命令适用于 Windows):

gswin32c.exe ^
    -o cropped.pdf ^
    -sDEVICE=pdfwrite ^
    -g5400x7200 ^
    -c "<</PageOffset [-36 -36]>> setpagedevice" ^
    -f input.pdf

最终的页面大小将为 7.5x10in (== 540x720pt)。要在 Linux 或 Mac 上执行相同的操作,请使用:

gs \
    -o cropped.pdf \
    -sDEVICE=pdfwrite \
    -g5400x7200 \
    -c "<</PageOffset [-36 -36]>> setpagedevice" \
    -f input.pdf

更新:如何使用 Ghostscript 确定“边距”

有评论要求“自动”确定白边距。您可以使用 Ghostscript 来实现此目的。它是bbox设备可以确定每个页面上的(虚拟)墨水覆盖的区域(从而间接确定画布每个边缘的空白区域)。

这是命令:

gs \
  -q -dBATCH -dNOPAUSE \
  -sDEVICE=bbox \
   input.pdf 

输出(示例):

 %%BoundingBox: 57 29 562 764
 %%HiResBoundingBox: 57.265030 29.347046 560.245045 763.649977
 %%BoundingBox: 57 28 562 667
 %%HiResBoundingBox: 57.265030 28.347046 560.245045 666.295011

The bbox设备在内存中渲染每个 PDF 页面(不将任何输出写入磁盘),然后将 BoundingBox 和 HiResBoundingBox 信息打印到stderr。您可以像这样修改此命令以使结果更易于解析:

gs \
    -q -dBATCH -dNOPAUSE \
    -sDEVICE=bbox \
     input.pdf \
     2>&1 \  
  | grep -v HiResBoundingBox

输出(示例):

 %%BoundingBox: 57 29 562 764
 %%BoundingBox: 57 28 561 667

这会告诉你...

  • ...内容矩形的左下角Page 1位于坐标处[57 29]右上角位于[562 741]
  • ...内容矩形的左下角Page 2位于坐标处[57 28]右上角位于[561 667]

这意味着:

  • Page 1在左边缘使用 57pt 的空白(72pt == 1in == 25,4mm).
  • Page 1在底部边缘使用 29pt 的空白。
  • Page 2在左边缘使用 57pt 的空白。
  • Page 2在底部边缘使用 28pt 的空白。

正如您从这个简单的示例中看到的,每个页面的空白并不完全相同。根据您的需求(您可能希望多页 PDF 的每个页面具有相同的尺寸,不是吗?),您必须计算出文档所有页面的每个边缘的最小边距是多少。

现在右侧和顶部边缘的空白又如何呢?要计算该值,您需要知道每个页面的原始页面大小。确定这一点的最简单方法:pdfinfo公用事业。 5 页 PDF 的命令示例:

pdfinfo \
  -f 1 \
  -l 5 \
   input.pdf \
| grep "Page "

输出(示例):

Page    1 size: 612 x 792 pts (letter)
Page    2 size: 612 x 792 pts (letter)
Page    3 size: 595 x 842 pts (A4)
Page    4 size: 842 x 1191 pts (A3)
Page    5 size: 612 x 792 pts (letter)

这将帮助您确定所需的画布尺寸以及每个新 PDF 页面的顶部和右侧边缘所需的(最大)白边距。

当然,这些计算也都可以编写脚本。

但是,如果您的 PDF 都是统一的页面大小,或者它们是单页文档,那么这一切就更容易完成......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PDF - 删除白边 的相关文章

  • iTextSharp 从 WPF 固定文档生成 PDF

    我有一个简单的 WPF 应用程序 可以显示和打印一些内容 使用固定文档进行报告 如何使用免费且开放的解决方案从中生成 PDF 比如iTextSharp WPF 固定文档 也称为 XPS 文档 是对 PDF 的明显改进 它具有 PDF 所缺乏
  • 在 ionic 中从 Base64 打开 pdf

    因此 我将 Jasper 报告转换为 pdf 然后在 REST 控制器中转换为 base64 我该如何将其传输到我的 ionic 3 应用程序 我研究了 Ionic Native Document Viewer 但为了做到这一点 我需要将文
  • 渲染从 SimpleDocTemplate 构建的 ReportLab pdf

    我有一个 django 应用程序 当前使用用户可以下载的画布生成 pdf 我创建一个 StringIO 缓冲区 执行一些操作 然后发送调用 response write Set up response response HttpRespon
  • 在 WebView 中打开 PDF 文件

    大约 2 天 我尝试在我的自定义中打开 PDF 文件WebvView 这是我的WebView code import android app AlertDialog import android app ProgressDialog imp
  • 如何以编程方式生成在图像顶部带有标签的维恩图图像?

    我正在尝试为 pdf 报告生成维恩图 其中文本位于不同区域的顶部 我们使用 htmldoc 生成 pdf 这会排除背景图像之上的文本 我们使用谷歌图表 API 来处理其他图像 但他们的维恩图不支持图表顶部的文本 据我所知 最简单的路径是使用
  • 是否可以“缩小”PdfPtable?

    我目前正在使用 Itextsharp 但在使用 PDfPtables 时遇到一些问题 有时 它们对于一个页面来说太大了 并且当添加到文档中时 它们会被分成多个页面 可悲的是 这种理性的行为对于我的一些上级来说是不可接受的 他们一直坚持认为表
  • itextsharp读取表[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我使用 itextsharp 创建了一个带有表格的 pdf 我找到了一个例子http itextsharp sourceforge n
  • Rails 4 - 如何链接到 PDF 文件(名称.PDF)?

    我正在生成 PDF 文件 我的链接如下所示 当我点击这个时 它会带我去 display invoice 123456789 这是一个 HTML 版本 在控制器中的操作如下 def display invoice if params invo
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 使用 ImageMagick 和/或 GhostScript 将多页 PDF 转换为多个 JPG

    我正在尝试将多页 PDF 文件转换为一堆 JPEG PDF 中的每一页一个 我花了几个小时寻找如何做到这一点 最终我发现我需要安装 Ghostscript 所以我就这么做了 来自这个网站 http downloads ghostscript
  • 从 Internet Explorer 打印时的默认文件名

    使用 pdf 打印机打印网页 将页面另存为 pdf 时 Chrome 和 Firefox 都使用该页面
  • 使用 PHP 将值插入可编辑 PDF,并保持可编辑状态

    我有一个带有可编辑字段的 PDF 我希望将 HTML 表单中的值传递到此 PDF 中 我尝试过使用 FPDF 并且它有效 但是将值传递到 PDF 后 pdf 中的字段不再可编辑 另一个缺点是 在将值传递到 PDF 时 我们必须为每个字段指定
  • 使用 JavaScript 生成 PDF 文件

    我正在尝试将 XML 数据从网页转换为 PDF 文件 并且希望能够完全在 JavaScript 中完成此操作 我需要能够绘制文本 图像和简单的形状 我希望能够完全在浏览器中完成此操作 我刚刚写了一个名为jsPDF https github
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • 如何使用文件输入在PDFJS中打开本地PDF?

    我想知道是否有办法使用选择pdf文件input type file 并使用打开它PDFJS https github com mozilla pdf js 您应该能够使用 FileReader 来获取文件对象的内容作为类型化数组 pdfjs
  • 无法在jspdf中加载多个图像

    我正在尝试加载动态生成的多个图像 我想将这些图像转换为 PDF 格式 HTML 代码如下
  • 在 RMarkdown 输出到 PDF 时缩进而不添加项目符号点或编号

    之前有人问过如何在没有项目符号的情况下缩进文本 RMarkdown 中的点 但这是针对 HTML 输出的 在 RMarkdown 中缩进而不添加项目符号点或数字 https stackoverflow com questions 47087
  • 如何从 pdf C# 中获取具有特定颜色的文本

    我必须将 pdf 文件中的数据放入特定的数据库结构中 这要求我能够从 pdf 文件中获取某些数据 由于 pdf 没有任何标签等 我想知道是否可以根据颜色获取文本 比如说我想要所有的红色文本 或者我想要文档中的所有斜体文本 这在 C 中可能吗
  • 在 Android 中使用 iText 将图像添加到特定位置

    我想使用 Android 中的 iText 将图像添加到 PDF 文件中的特定位置 这是一个可填写的表单 我添加了作为图像占位符的文本框 我想要做的就是像这样获取该文本框和图像 public class FormFill public st
  • 如何使用 Ghostscript DLL 将 PDF 转换为 PDF/A

    如何使用 GhostScript DLL 将 PDF 转换为 PDF A 我知道我必须调用 gsdll32 dll 的导出函数 其名称为 gsapi init with args 但如何传递正确的参数 顺便说一句 我正在使用 C 请尝试从命

随机推荐