Вопрос по pdf, ghostscript – PDF - Удалить белые поля

11

Я хотел бы знать, как удалить белые поля из файла PDF. Как и в случае с Adobe Acrobat X Pro. Я понимаю, что это не будет работать с каждым файлом PDF.

Я бы предположил, что способ сделать это, получить текстовые поля, а затем обрезать эти поля.

PyPdf является предпочтительным.

iText находит текстовые поля на основе этого кода:

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

Ваш Ответ

2   ответа
19

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

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

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

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

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

Пример команды для обрезки PDF размером с букву (8,5x11 дюймов == 612x792pt) на полдюйма (== 36pt) на каждом из 4 ребер (команда для Windows):

gswin32c.exe ^
    -o cropped.pdf ^
    -sDEVICE=pdfwrite ^
    -g5400x7200 ^
    -c "<</PageOffset [-36 -36]>> setpagedevice" ^
    -f input.pdf

Результирующий размер страницы будет 7,5x10 дюймов (== 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

Thebbox устройство отображает каждую 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

Это тебе скажет ...

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

Это означает

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

@ jacktrades: Конечно, вы можете использовать iText, если хотите. Не стесняйтесь. Однако для iText вам нужно написать Java-программу, используя iText API. С Ghostscript вы можете оставаться в сфере программирования сценариев, которые я предпочитаю в подобных случаях ... Kurt Pfeifle
До сих пор не могу понять, как найти поля PDF. iText делает то же самое, что и выше. jacktrades
Как ты можешь автоматически узнать, где белые поля? jacktrades
Почему не используете itext? jacktrades
@ PrakashK: я только что проверил -bboxстройство @ по какой-то странной причине использует стандартное разрешение 4000 точек на дюйм. Я всегда предполагал, что он будет использовать 72 точек на дюйм. (Я проверил, запустивgs -o /dev/null -sDEVICE=bbox -c "currentpagedevice {exch ==only ( ) print ==} forall quit" | grep -i resolution. Смотрите также " Запрос Ghostscript для параметров / настроек по умолчанию для устройства вывода (например, «pdfwrite» или «tiffg4»)». Kurt Pfeifle
8

Pdfcrop. Нужен ghostscript.

Работает, но выводит файл размером 1 ГБ из файла размером 3 МБ ... jacktrades
Относительно проблемы "огромного файла" в комментариях это сообщение в блоге они предлагают использоватьpdfcrop --xetex --resolution 72 [other-options] input.pdf output.pdf чтобы решить. Andrea Lazzarotto
Свободно, быстро, автоматически и правильно определяет поля, предустановленные. Как раз то, что мне было нужно. fuenfundachtzig

Похожие вопросы