打印 PDF 文件并在页脚中显示文件路径

打印 PDF 文件并在页脚中显示文件路径

我想在 Windows 上打印 PDF,但想在打印文档的页脚中打印 PDF 文件的路径(就像我在 Word 中所做的那样)。

我们使用的是 Adob​​e Reader 或 Foxit Reader。

您知道如何实现这一目标吗?

答案1

首先:某些打印机驱动程序允许您为打印的每页定义“水印”。您可以滥用该功能来做您想做的事情。但是,据我所知,Acrobat Reader 不包含这样的功能(尽管您可以(滥用)使用 Acrobat 内置的 JavaScript 支持来实现您想要的效果...

好的。让我也试一试。因为我们是在 superuser.com(而不是 stackoverflow.com),所以我会这样做没有编程语言并使用仅(批处理)脚本反而。

第一步:使用 Ghostscript 创建 PDF 页脚页,显示带有路径的“页脚”字符串

我们将使用一个相对简单的Ghostscript命令。该命令将一个简短的 PostScript 片段作为命令行输入 ( -c "..."),并将 PDF 输出为“myfooter.pdf”。我们将使用作为介质尺寸(替换为a4或任何你需要的)。如下所示:(
我假设我们使用的是 Windows。如果读者使用的是 Linux,请使用gs而不是gswin32c.exe。)

gswin32c.exe ^
 -o myfooter.pdf ^
 -sDEVICE=pdfwrite ^
 -sPAPERSIZE=letter ^
 -c "72 12 moveto /Helvetica findfont 9 scalefont setfont (File: d:\\c\\b\\a.pdf) show"

现在,我们有一个仅包含页脚的 PDF 页面,其余画布没有任何内容。您可以在查看器中打开它,并看到字符串从左下角左侧 72 个 PostScript 点(72 pt == 1 英寸)处开始,顶部 12 点处开始。

第二步:使用 PDF ToolKit 将页脚页面与原始 PDF 叠加

我们将使用 PDF工具包 pdftk.exe命令。此命令行实用程序可以对 PDF 执行很多操作。我们这里需要的功能:将两个不同 PDF 文档的页面相互叠加,以提供'邮票''背景'到原始文件。如下所示:(
如果读者使用 Linux,请使用pdftk而不是pdftk.exe。)

pdftk.exe ^
  d:\c\b\a.pdf ^
  stamp myfooter.pdf ^
  output d:\c\b\result-with-footer-a.pdf

(顺便说一句,pdftk 也是从 iText 库衍生而来的,另一个答案提到了它。)

第三步:创建一个批处理脚本,使前两个步骤自动发生

这是为了您的锻炼乐趣而留下的... ;-)


您可能需要将字符串旋转 90 度,以便它在左页边框上垂直读取。在这种情况下,请修改 Ghostscript 命令,如下所示:gswin32c.exe -sDEVICE=pdfwrite -o myfooter.pdf -dAutoRotatePages=/None -c "12 72 moveto /Helvetica findfont 9 scalefont setfont 90 rotate (File: d:\\c\\b\\a.pdf) show showpage"

答案2

这是一个由以下文件构建的 Windows 批处理文件:@Kurt 的回答

@echo off
if [%*]==[] goto :usage
if not exist outdir mkdir outdir

for %%a in (%*) do (
 call :makeFooter %%a
 call :addFooter %%a
 )
goto :eof

:makeFooter
  gswin32c ^
  -o outdir\footer_%1 ^
  -sDEVICE=pdfwrite ^
  -c "5 5 moveto /Helvetica findfont 12 scalefont setfont (%~n1) show"
  goto :eof

:addFooter
  pdftk ^
  %1 ^
  stamp outdir\footer_%1 ^
  output outdir\%1
  del outdir\footer_%1
  goto :eof

:usage
  echo. &echo. -={ Usage: %0 [list of pdf files or pattern] }=-
  echo. &echo. %~n0 foo*.pdf &echo.

2013 年 2 月 4 日:

  • 错误修复:由于文件名未正确传递给 make 和 addFooter 例程而失败
  • 更改:输出文件名现在与输入保持相同,同时删除临时页脚文件

您可能需要更改gswin64c为 64 位 ghostscript 安装。

-c行中的单位:makeFooter是点。因此,5 5 /moveto从页面左下角开始向内和向上各为 5pt,并/Helvetica ... 12使用 12pt Helvetica 字体。

答案3

没有办法像 Word 中的字段那样自动更新此字段。但您可以做的是在创建文件后对其进行处理,并将其移动到源文档以外的位置。PDF 实际上是为打印而设计的,而将其更改为允许表格和其他内容只是一种黑客行为。

我猜你会希望这是一个自动化的通用过程,所以你需要使用一个单独的库来做到这一点。其中最丰富的一个是 iText,它是一个允许编辑 PDF 文件的 Java 开源库。它不太难使用,我将在下面提供一个示例代码,说明完成此练习所需的代码。

您需要从 sourceforge 下载 JDK 和 iText。以下是 Java 代码

import java.io.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.*;
public class AddFooter {
    public static void main(String[] args) throws Exception {
        String fileName;
        try {
            fileName = args[0];
        } catch (Exception e) {
            System.out.println("You need to pass the filename after command");
            return;
        }
        int         bottomHorizontalOffset = 100;
        int         bottomVerticalOffset = 10;
        String      workingDir = System.getProperty("user.dir");
        String      file = workingDir + "\\" + fileName;
        String      stamped = workingDir + "\\" + fileName + "_stamped.pdf";
        stamped = stamped.replaceAll("\\\\", "\\\\\\\\");
        file    = file.replaceAll("\\\\", "\\\\\\\\");
        PdfReader   pdfReader   = new PdfReader(file);
        PdfStamper  pdfStamper  = new PdfStamper(pdfReader, new FileOutputStream(stamped));

        for(int i = 1; i <= pdfReader.getNumberOfPages(); i++) {
            PdfContentByte content = pdfStamper.getUnderContent(i);
            BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            content.beginText();
            content.setFontAndSize(bf, 12);
            content.setTextMatrix(bottomHorizontalOffset, bottomVerticalOffset);
            stamped = stamped.replaceAll("\\\\\\\\", "\\\\");
            content.showText(stamped);
            content.endText();
        }
        pdfStamper.close();
    }
}

这段代码存在一些问题,由于我不知道所有的细节,因此它们如下:

  1. 使用不同的名称创建新的 pdf,即页脚中的路径和名称
  2. 您可以调整底部...变量以将文本定位在底部
  3. 您需要调整字体和大小以适合您的文档
  4. 它是为 Windows 编写的,因此需要对 *nix 进行一些调整
  5. 它希望从文件所在的目录运行,这就是它获取路径的方式。
  6. 如果您移动文件,它将不会自动更新,事实上您无法再次运行此操作并删除原始文本。
  7. 该代码是快速拼凑起来的,但确实可以编译和运行,所以如果您需要更多,这将是一个很好的起点。

由于 pdf 没有“自动更新”字段,您不想更改 pdf 关联以指向运行该脚本,因为每次您打开文件时它都会重写页脚。

玩得开心。

相关内容