Как создать пустой PDF из командной строки?

58

Недавно мне понадобилась одна пустая страница PDF (8,5 x 11 дюймов), и я понял, что не знаю, как ее создать из командной строки.

Выдача touch blank.pdfвыдает пустой файл PDF . Есть ли инструмент командной строки, который создает пустую страницу PDF ?

Брайан Фитцпатрик
источник
Зачем тебе это? У меня есть пакет для эмуляции двусторонней (дуплексной) печати на недуплексных принтерах. Для этого необходимо распечатать дополнительную пустую страницу при печати четных страниц для задания с нечетным количеством страниц. Для этого я просто отправляю форму подачи в lp. Это делает трюк, не создавая пустой файл страницы и т.д ..
Джо
10
@Joe Это не наше дело, почему Брайан хочет или нуждается в этом.
Iain Holder
6
@IainHolder: Я бы хотел, чтобы больше пользователей SE думали, как ты.
Мердад
3
@IainHolder - я не пытаюсь вмешиваться в бизнес ОП! Я просто хотел предположить, что если это что-то вроде того, что я делал, то есть другой способ сделать это. Часто такие вещи являются проблемами xy ( meta.stackexchange.com/questions/66377/what-is-the-xy-problem ), поэтому вопрос о цели может быть вполне уместным.
Джо
5
Я просто подробно прочитал ссылку выше. Я не понимал, что это был такой спорный вопрос. TL; DR - если вы знаете, что делаете, то вам просто нужен ответ на вопрос, который вы задали. Если вы не так хорошо разбираетесь, возможно, вы задали неправильный вопрос, и вам могут помочь разъяснения о том, в чем заключается настоящая проблема.
Джо

Ответы:

86

convertутилита ImageMagick, использованная в ответе Кетана, также позволяет писать что-то вроде

convert xc:none -page Letter a.pdf

или же

convert xc:none -page A4 a.pdf

или (для горизонтальной бумаги формата А4)

convert xc:none -page 842x595 a.pdf

и т.д. , без создания пустого текстового файла. @chbrown заметил, что это создает PDF-файл меньшего размера.

«xc:» означает «X Constant Image», но на самом деле его можно считать «x canvas». Это способ указать один блок цвета, в данном случае ни одного. Более подробная информация на http://imagemagick.org/Usage/canvas/#solid, которая является «фактическим» руководством для ImageMagick. [дополнены информацией из трубы] (вещи , как pdf:aможно использовать явно объявить формат файла. label:'some text', gradient:, rose:и , как logo: представляется, другие примеры специальных форматов файлов.)

Анко предложил опубликовать эту модификацию в качестве отдельного ответа, поэтому я делаю это.

BartekChom
источник
2
ImageMagick на самом деле не имеет полезного руководства. «xc: <foo>» означает «X Constant Image», но на самом деле его можно считать «x canvas». Это способ указать один блок цвета, в данном случае ни одного . Больше информации на imagemagick.org/Usage/canvas/#solid, которое является "фактическим" руководством для ImageMagick.
труба
2
Кстати, это также работает с A4 вместо Letter, если вы хотите разумные размеры бумаги.
TRiG
@TRiG: конечно. Я сожалею, что не упомянул вас в своем редактировании, но в этом случае я знал это.
BartekChom
Я изменил это на принятый ответ, так как это тот, который я положил в мой~/bin
Брайан Фицпатрик
1
При выполнении этой команды я получил ошибку convert-im6.q16: not authorized 'blank.pdf' @ error/constitute.c/WriteImage/1037, но нашел решение здесь: askubuntu.com/questions/1081895/… Публикация здесь на случай, если она поможет кому-либо, кто столкнется с той же проблемой.
Брент Йорги
34

Как наименьшее возможное GIF , наименьший возможный пробел страниц PDF должен быть разработан вручную, потому что это настолько мало , что излишние но-безвредны биты метаданных становятся важной частью размера файла, а сжатие на самом деле делает все больше . Это также требует внимательного отношения к правилам в спецификации PDF о том, что такое биты файловой структуры, а какие нет. (Знаете ли вы, что объекты страницы должны содержать /Resourcesсловарь, даже если он пустой, но не обязательно включать /Contentsпоток?)

Если вы не используете объектные потоки PDF 1.5 и потоки перекрестных ссылок (что дает преимущество в том, что файл может быть полностью печатным ASCII), я считаю, что лучшее, что вы можете сделать, - это 317 байт. При копировании и вставке обратите внимание, что на всех четырех записях таблицы перекрестных ссылок (строки между 0 4и trailer<<...) должен быть завершающий пробел , и что после символа не должно быть заключительного символа новой строки %%EOF.

%PDF-1.4
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj
2 0 obj<</Type/Pages/Count 1/Kids[3 0 R]>>endobj
3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<<>>>>endobj
xref
0 4
0000000000 65535 f 
0000000009 00000 n 
0000000052 00000 n 
0000000101 00000 n 
trailer<</Size 4/Root 1 0 R>>
startxref
178
%%EOF

Замена таблицы перекрестных ссылок на созданный вручную поток перекрестных ссылок v1.5 делает файл немного меньше по цене, поскольку он больше не печатается в формате ASCII: 294 байта. (Для удобства чтения, не говоря уже о том, что он вообще может быть напечатан, приведенный ниже поток внешних ссылок был шестнадцатеричным, но это не отражено в словаре потоков. Чтобы восстановить действительный PDF-файл, необходимо либо заменить шестнадцатеричный код на соответствующие необработанные двоичные байты, или изменения /Length 15в /Length 30/Filter/ASCIIHexDecodeи принять файл , который имеет длину 328 байт.)

%PDF-1.5
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj
2 0 obj<</Type/Pages/Count 1/Kids[3 0 R]>>endobj
3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<<>>>>endobj
4 0 obj<</Type/XRef/Size 5/W[1 1 1]/Root 1 0 R/Length 15>>stream
0000ff01090001340001650001b200endstream endobj
startxref
178
%%EOF

Я также экспериментировал с переносом объектов с 1 по 3 в поток объектов, но это добавляет больше накладных расходов, чем экономит, даже когда поток сжат.

Возможной альтернативной формулировкой потока внешних ссылок является

4 0 obj<</Type/XRef/Size 4/W[0 1 0]/Index[1 4]/Root 1 0 R/Length 4>>stream
091365b2endstream endobj

К сожалению, несмотря на существенную экономию в длине фактических потоковых данных, дополнительные /Index[1 4]расходуют все, кроме одного байта экономии. Кроме того, мне неясно, разрешено ли вам полностью исключать объект 0 из файла. (Мне также неясно, должен ли объект 0 иметь номер генерации -1. Если это не требуется, вы фактически экономите больше байтов с помощью

4 0 obj<</Type/XRef/Size 5/W[1 1 0]/Root 1 0 R/Length 10>>stream
000001090134016501b2endstream endobj

.)

Чтобы изменить размер бумаги, замените его 612 792на соответствующую ширину и высоту, выраженные в точках PostScript (72 точки PostScript = 1 дюйм США или 25,4 миллиметра). Например, 595 842для A4. Вы можете встроить это в сценарий оболочки, который выдает пустой PDF-файл любого размера бумаги; единственной сложной задачей было бы убедиться, что startxrefсмещение остается точным, даже если размер объекта 3 изменился.

zwol
источник
10
Это может быть забавным занятием для codegolf.stackexchange.com
Нейт Элдридж
5
Я отправил сообщение в meta.codegolf, чтобы узнать, будет ли что-то подобное хорошо получено: meta.codegolf.stackexchange.com/questions/8990/…
Нейт
Хотя это хорошее решение для создания действительного документа PDF с пустой страницей в текстовом редакторе, это не совсем то, что я считаю решением для командной строки (как об этом просил ОП).
Курт Пфайфл
23

Если у вас установлена convert(утилита ImageMagick), вы можете сделать это:

touch a.txt && convert a.txt -page Letter a.pdf
MKC
источник
1
convertТакже есть -sizeопция, которую вы можете использовать, чтобы установить размер выходного PDF.
MKC
21
Вы также можете написать, convert xc:none -page Letter a.pdfне создавая пустой текстовый файл.
BartekChom
3
Метод @ BartekChom, кажется, создает еще более пустую страницу. Он создает файл меньшего размера, абсолютно ничего не выбирая, и не вызывает никаких (null)ошибок шрифта.
chbrown
1
@ BartekChom Я хочу, чтобы это был отдельный ответ, чтобы я мог проголосовать за него.
Анко
1
Я получил convert.im6: improper image header a.txt '@ error / txt.c / ReadTXTImage / 429. convert.im6: изображения не определеныa.pdf' @ error/convert.c/ConvertImageCommand/3044.
Сигур
12

echo .bp | groff -T pdf > t.pdf

Принесено вам groff, самым недооцененным программным обеспечением в мире.

Джеймс К. Лоуден
источник
2
Я получаю groff: can't find `DESC' fileи groff:fatal error: invalid device `pdf'с groff версии 1.22.2 на CentOS 7.2.
gla3dr
То же самое сообщение для меня, используя bash 4.1.2бегgroff 1.18.1.4
zundarz
2
@ gla3dr Установите полный пакет groff, а не только groff-base.
Капитан Жираф
1
.bpпросто означает «разрыв страницы», поэтому он создает двухстраничный документ. Чтобы создать одностраничный документ, просто сделайте еще проще echo | groff -T pdf > blank.pdf.
Фахим Митха
очень хорошее решение, но на echo .bpсамом деле должно быть заменено echo, как сказал
@FaheemMitha
8

Вы можете использовать pdfTeX:

echo '\shipout\hbox{}\end' | pdftex

который производит чистую одностраничную страницу texput.pdfразмером около 900 байт, половину того, что использует ImageMagick.

Тем не менее, вы получаете возможность использовать формат бумаги по умолчанию для вашей установки TeX. Чтобы установить размер явно, вы можете перейти к LaTeX:

echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry}
      \begin{document}\shipout\hbox{}\end{document}' | pdflatex

Еще один вариант - использовать драйвер PDF Ghostscript, хотя это и удобный ps2pdfскрипт:

echo showpage | ps2pdf -sPAPERSIZE=letter - blank.pdf

который намного тише, чем TeX, но производит менее компактный вывод (около 2300 байт).

Хеннинг махолм
источник
1
Я использую вариант echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf. Это немного меньше, в 2200 байт.
Фахим Митха
echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry} \begin{document}\shipout\hbox{}\end{document}' | pdflatexсоздает article.pdf. Возможно ли создать его blank.pdfнапрямую?
Фахим Митха
@FaheemMitha: Хм, я бы ожидал, что ps2pdf с пустым вводом создаст файл PDF, содержащий ноль страниц - но когда я пытаюсь, там действительно есть страница. Интересно, откуда это взялось ...
Хеннинг Махолм
@Faheem: По крайней мере, с Texlive вы можете установить базовое имя выходного файла -jobname <basename>в командной строке.
Хеннинг Махолм
1
@FaheemMitha: каждый \shipout\hbox{}или showpageпроизводит одну страницу. И TeX, и Postscript имеют циклические конструкции, которые вы можете использовать, но, вероятно, проще использовать язык сценариев по вашему выбору, чтобы дублировать команду соответствующее количество раз.
Хеннинг
3

Простой способ сделать PDF с пустой страницей, используя rst2pdf:

echo -e '.. raw:: pdf\n\n   PageBreak' | rst2pdf -o blank.pdf

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

Энтон
источник
2

В командной строке введите:

ps2pdf blank.pdf

команда ps2pdfиспользуется для преобразования файла PostScript в pdf

ps2pdf file.ps file.pdf
GAD3R
источник
1
ps2pdf blank.pdfвозвращает ошибку, поскольку ожидает файл Postscript в качестве аргумента. А вторая команда требует уже существующей file.pdf. Я что-то пропустил?
Фахим Митха
1
Попробуйте это: 1 touch blank.ps.; 2 ps2pdf blank.ps blank.pdf.; 3.pdftk A=1.pdf B=blank.pdf cat A1-end B output 2.pdf
Виктория Стюарт
2

И последнее, что не менее важно, вот способ Ghostscript для создания PDF с пустой страницей:

 gs -sDEVICE=pdfwrite -o empty.pdf -c showpage

Размер страницы, скорее всего, будет Letter. Если вы хотите A4, используйте это:

 gs -sDEVICE=pdfwrite -o empty.pdf -g5950x8420 -c showpage

Справочная информация: за -cпараметром может следовать любая допустимая строка PostScript, которую Ghostscript попытается интерпретировать. И пустая страница в PostScript представлена ​​этим коротким кодом:

%!PS
showpage
Курт Пфайфл
источник