Я хотел бы напечатать PDF-файл в Windows, но хочу напечатать путь к PDF-файлу в нижнем колонтитуле печатного документа (как я могу это сделать в Word).
Мы используем либо Adobe Reader, либо Foxit Reader.
Знаете ли вы, как этого добиться?
Прежде всего: некоторые драйверы принтера позволяют вам определять "водяной знак" для каждой напечатанной страницы. Вы можете злоупотреблять этой функцией, чтобы делать то, что вы хотите. Однако, насколько мне известно, Acrobat Reader не включает такую функцию (хотя вы можете (ab) использовать встроенную поддержку JavaScript в Acrobat для достижения чего-то похожего на то, что вы хотите ...
Хорошо, тогда. Позвольте мне также дать ему шанс. Поскольку мы здесь на 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
Теперь мы будем использовать команду pdftk.exe
из PDF ToolKit . Эта утилита командной строки может многое сделать с 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"
.
Вот пакетный файл 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-февраль-04:
Возможно, вам придется изменить gswin64c
для 64-битных установок ghostscript.
Единицы в строке -c
:makeFooter
указаны в пунктах. Таким образом, 5 5 /moveto
- это 5 пунктов в и 5 пунктов вверху слева внизу страницы, а /Helvetica ... 12
- использовать шрифт 12pt Helvetica.
Нет способа автоматически обновить это как поле в Word. Но то, что вы можете сделать, это обработать файл после того, как он был создан, и перемещен в место, отличное от исходного документа. PDF был действительно разработан для печати, а изменения, позволяющие создавать формы и прочее, были просто взломом.
Я предполагаю, что вы захотите, чтобы это был какой-то автоматизированный процесс и общий, поэтому для этого вам понадобится отдельная библиотека. Одним из наиболее плодотворных является iText, библиотека Java с открытым исходным кодом, которая позволяет редактировать PDF-файлы. Его не сложно использовать, и ниже я приведу пример кода, который понадобится вам для выполнения этого упражнения.
Вам понадобятся JDK и iText от sourceforge. Вот код 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 не имеет полей 'autoupdate', вы не хотите изменять связь pdf, чтобы указывать на скрипт для его запуска, потому что тогда каждый раз, когда вы открываете файл, он будет перезаписывать нижний колонтитул.
Повеселись.