PDF - Удалите белые поля

Я хотел бы знать способ удаления белых полей из файла PDF. Как и Adobe 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();
}

Ответ 1

Я не очень хорошо знаком с PyPDF, но знаю, что Ghostscript сможет сделать это за вас. Вот ссылки на некоторые другие ответы на похожие вопросы:

Третий ответ, вероятно, заставил вас сказать: "Я понимаю, что он не будет работать с каждым PDF файлом". Он использует команду pdfmark, чтобы попытаться установить /CropBox в объекты страницы PDF.

Метод первых двух ответов, скорее всего, будет успешным, если третий не удастся. Этот метод использует фрагмент команды PostScript <</PageOffset [NNN MMM]>> setpagedevice для перемещения и размещения страниц PDF на (меньшем) размере носителя, определяемом параметром -gNNNNxMMMM (который определяет ширину и высоту устройства в пикселях).

Если вы понимаете концепцию первых двух ответов, вы легко сможете адаптировать метод, используемый там для обрезки полей на всех четырех краях страницы PDF:

Пример команды для обрезания 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

Устройство 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 файлы - это все размер страницы uniq, или если они являются 1-страничными документами, все это намного проще сделать...

Ответ 2

Попробуйте pdfcrop. Он нуждается в ghostscript.

Ответ 3

Я нашел это, и он работает удивительно хорошо (он очень прост в использовании). http://www.pdfscissors.com/