4

Я хотел бы напечатать PDF-файл в Windows, но хочу напечатать путь к PDF-файлу в нижнем колонтитуле печатного документа (как я могу это сделать в Word).

Мы используем либо Adobe Reader, либо Foxit Reader.

Знаете ли вы, как этого добиться?

3 ответа3

4

Прежде всего: некоторые драйверы принтера позволяют вам определять "водяной знак" для каждой напечатанной страницы. Вы можете злоупотреблять этой функцией, чтобы делать то, что вы хотите. Однако, насколько мне известно, 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" .

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-февраль-04:

  • исправление ошибки: не удавалось, потому что имя файла не передавалось процедурам make & addFooter должным образом
  • изменить: имя файла теперь осталось таким же, как ввод, также удаляет временные файлы нижнего колонтитула

Возможно, вам придется изменить gswin64c для 64-битных установок ghostscript.

Единицы в строке -c :makeFooter указаны в пунктах. Таким образом, 5 5 /moveto - это 5 пунктов в и 5 пунктов вверху слева внизу страницы, а /Helvetica ... 12 - использовать шрифт 12pt Helvetica.

1

Нет способа автоматически обновить это как поле в 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();
    }
}

Этот код имеет некоторые проблемы, и, поскольку я не знаю всех особенностей, вот они:

  1. Создается новый PDF-файл с другим именем, и это путь и имя в нижнем колонтитуле
  2. Вы можете настроить нижние ... переменные, чтобы расположить текст внизу
  3. Вам нужно настроить шрифт и размер в соответствии с вашими документами
  4. Он закодирован для Windows, поэтому для * nix потребуется несколько настроек
  5. Предполагается, что он будет запущен из каталога, в котором находится файл, и именно так он получает путь.
  6. Он не будет автоматически обновляться, если вы переместите файл, фактически вы не сможете запустить его во второй раз и удалить исходный текст.
  7. Этот код был быстро собран, но он компилируется и работает, поэтому, если вам нужно больше, это будет хорошей отправной точкой.

Так как pdf не имеет полей 'autoupdate', вы не хотите изменять связь pdf, чтобы указывать на скрипт для его запуска, потому что тогда каждый раз, когда вы открываете файл, он будет перезаписывать нижний колонтитул.

Повеселись.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .