Як створити порожній PDF з командного рядка?


57

Нещодавно мені потрібна була одна порожня сторінка PDF (розмір 8,5 "х 11") і зрозумів, що я не знаю, як зробити її з командного рядка.

При видачі touch blank.pdfстворюється порожній PDF- файл . Чи є інструмент командного рядка, який створює порожню сторінку PDF ?


Навіщо вам це потрібно? У мене є пакет друку для емуляції двостороннього (двостороннього) друку на недуплексних принтерах. Для цього потрібно вивести зайву порожню сторінку під час друку парних пронумерованих сторінок для завдання, що має непарне число сторінок. Для цього я просто надсилаю форму подачі у форматі lp. Це робить трюк, не створюючи файл порожньої сторінки тощо.
Джо

10
@Joe Це не наш бізнес, чому Брайан цього хоче чи потребує.
Ієн Холдер

6
@IainHolder: Я б хотів, щоб більше користувачів SE вважали, як ти.
Мехрдад

3
@IainHolder - Я не намагаюся прислухатися до справи ОП! Я просто хотів підказати, що якщо це щось на кшталт того, що я робив, то є інший спосіб зробити це. Найчастіше такі речі є проблемами xy ( meta.stackexchange.com/questions/66377/what-is-the-xy-problem ), тому запитання, що є ціллю, може бути цілком доречним.
Джо

5
Я просто детально прочитав посилання вище. Я не усвідомлював, що це таке суперечливе питання. TL; DR - якщо ви знаєте, що робите, то просто хочете відповісти на поставлене питання. Якщо ви не так добре розбираєтесь, можливо, ви поставили неправильне запитання та уточнення того, що справжнє питання може допомогти.
Джо

Відповіді:


85

convert, утиліта ImageMagick, що використовується у відповіді Кетана, також дозволяє вам написати щось подібне

convert xc:none -page Letter a.pdf

або

convert xc:none -page A4 a.pdf

або (для горизонтального паперу формату A4)

convert xc:none -page 842x595 a.pdf

тощо , не створюючи порожній текстовий файл. @chbrown помітив, що це створює менший pdf-файл.

"xc:" означає "Постійне зображення X", але насправді його можна вважати як "x полотно". Це спосіб вказати один блок кольору, в цьому випадку жоден. Більше інформації на http://imagemagick.org/Usage/canvas/#solid, що є "де-факто" посібником для ImageMagick. [Доповнені інформацією з труби] (речі , як pdf:aможна використовувати явно оголосити формат файлу. label:'some text', gradient:, rose:І , як logo: видається, інші приклади спеціальних форматів файлів.)

Анко запропонував опублікувати цю модифікацію як окрему відповідь, тому я це роблю.


2
ImageMagick насправді не має корисного посібника. "xc: <foo>" означає "X Постійне зображення", але насправді його можна вважати як "х полотно". Це спосіб вказати один блок кольору, в цьому випадку жоден . Більше інформації на imagemagick.org/Usage/canvas/#solid, що є "фактичним" посібником для ImageMagick.
труба

2
З іншого боку, це також працює з форматом A4 замість букви, якщо ви хочете отримати розумні розміри паперу.
TRiG

@TRiG: Звичайно. Мені шкода, що я не згадував вас у своїй редакції, але в цьому випадку я це знав.
BartekChom

Я змінив це на прийняту відповідь, оскільки це той, який я вклав у свій~/bin
Брайан Фіцпатрік

Чи можна змінити цю команду, щоб створити файл pdf з n порожніх сторінок?
Брайан Фіцпатрік

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 байти. (Для читабельності, не кажучи вже про можливість вводити його взагалі, потік xref, наведений нижче, був генерований, але це не відображено в його словнику потоків. Щоб відновити дійсний PDF-файл, потрібно або замінити hexdump на відповідні необроблені двійкові байти, або змінити , /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 в поток об'єктів, але це додає більше витрат на голову, ніж економить, навіть коли потік стискається.

Можливою альтернативною формулюванням потоку xref є

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 змінився.


10
Це може бути цікавим заходом для codegolf.stackexchange.com
Nate

5
Я розмістив на meta.codegolf, щоб побачити, чи вдасться щось подібне: meta.codegolf.stackexchange.com/questions/8990/…
Nate

Хоча це приємне рішення створити дійсний документ PDF з порожньою сторінкою в текстовому редакторі , я не точно вважаю рішення командного рядка (як вимагала ОП).
Курт Пфайфл

23

Якщо у вас встановлена convert(утиліта ImageMagick), ви можете зробити це:

touch a.txt && convert a.txt -page Letter a.pdf

1
convertтакож є -sizeопція, яку ви можете використовувати для встановлення розміру вихідного PDF.
mkc

21
Ви також можете писати, convert xc:none -page Letter a.pdfне створюючи порожній файл txt.
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просто означає "сторінку перерви", тому це створює документ на 2 сторінки. Щоб створити документ на 1 сторінці, просто зробіть ще простіше echo | groff -T pdf > blank.pdf.
Faheem Mitha

дуже приємне рішення, але 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 байт.
Faheem Mitha

echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry} \begin{document}\shipout\hbox{}\end{document}' | pdflatexтворить article.pdf. Чи можна його створити blank.pdfбезпосередньо?
Faheem Mitha

@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

1
ps2pdf blank.pdfповертає помилку, оскільки він очікує файл аргументу Postscript як аргумент. А друга команда вимагає попередньо існуючої file.pdf. Я щось пропускаю?
Faheem Mitha

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.