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();
}

2 ответов


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

  1. конвертировать PDF 2 стороны на страницу в 1 сторону на страницу (SuperUser.com)
  2. Freeware, чтобы разделить страницы pdf посередине? (SuperUser.com)
  3. обрезка PDF с помощью Ghostscript 9.01 (StackOverflow.com)

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

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

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

пример команды для обрезки PDF-файла размером с букву (8.5x11in == 612x792pt) на полдюйма (==36pt) на каждом из 4 краев (команда для 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

Update: как определить "поля" с помощью 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

это тебе сказать...

  • ...что левый нижний угол содержимого прямоугольник Страница 1 в координатах [57 29] С верхним правым углом находится в [562 741]
  • ...что нижний левый угол прямоугольника содержимого Страница 2 в координатах [57 28] С верхним правым углом находится в [561 667]

это значит:

  • Страница 1 использует пробел 57pt на левом краю (72pt == 1in == 25,4mm).
  • Страница 1 использует пробелы 29pt на нижнем крае.
  • Страница 2 использует пробел 57pt на левом краю.
  • Страница 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-страничными документами, все это намного проще сделать...


попробовать pdfcrop. Ему нужен ghostscript.