我想在 Windows 上打印 PDF,但想在打印文档的页脚中打印 PDF 文件的路径(就像我在 Word 中所做的那样)。
我们使用的是 Adobe 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();
}
}
这段代码存在一些问题,由于我不知道所有的细节,因此它们如下:
- 使用不同的名称创建新的 pdf,即页脚中的路径和名称
- 您可以调整底部...变量以将文本定位在底部
- 您需要调整字体和大小以适合您的文档
- 它是为 Windows 编写的,因此需要对 *nix 进行一些调整
- 它希望从文件所在的目录运行,这就是它获取路径的方式。
- 如果您移动文件,它将不会自动更新,事实上您无法再次运行此操作并删除原始文本。
- 该代码是快速拼凑起来的,但确实可以编译和运行,所以如果您需要更多,这将是一个很好的起点。
由于 pdf 没有“自动更新”字段,您不想更改 pdf 关联以指向运行该脚本,因为每次您打开文件时它都会重写页脚。
玩得开心。