Bagaimana cara membuat PDF kosong dari baris perintah?

57

Saya baru-baru ini membutuhkan satu halaman PDF kosong (ukuran 8,5 "x 11") dan menyadari bahwa saya tidak tahu cara membuatnya dari baris perintah.

Penerbitan touch blank.pdfmenghasilkan file PDF kosong . Apakah ada alat baris perintah yang menghasilkan halaman PDF kosong ?

Brian Fitzpatrick
sumber
Mengapa Anda membutuhkannya? Saya memiliki paket pencetakan untuk meniru pencetakan dua sisi (dupleks) pada printer non-dupleks. Melakukan hal ini membutuhkan mengeluarkan halaman kosong tambahan saat mencetak halaman bernomor genap untuk pekerjaan yang memiliki jumlah halaman ganjil. Untuk melakukan ini, saya hanya mengirim formfeed ke lp. Itu berhasil tanpa membuat file halaman kosong, dll.
Joe
10
@ Jo. Bukan urusan kami mengapa Brian menginginkan atau membutuhkan ini.
Iain Holder
6
@IainHolder: Saya berharap lebih banyak pengguna SE berpikir seperti Anda.
Mehrdad
3
@IainHolder - Saya tidak mencoba mengorek bisnis OP! Saya hanya ingin menyarankan bahwa jika itu seperti apa yang saya lakukan, maka ada cara lain untuk melakukannya. Seringkali hal-hal seperti ini adalah masalah besar ( meta.stackexchange.com/questions/66377/what-is-the-xy-problem ), jadi menanyakan apa tujuannya bisa sangat tepat.
Joe
5
Saya baru saja membaca tautan di atas secara detail. Saya tidak menyadari ini adalah masalah yang kontroversial. TL; DR - jika Anda tahu apa yang Anda lakukan, maka Anda hanya ingin jawaban atas pertanyaan yang Anda ajukan. Jika Anda tidak begitu berpengalaman, Anda mungkin telah mengajukan pertanyaan yang salah dan klarifikasi tentang apa masalah sebenarnya bisa membantu.
Joe

Jawaban:

85

convert, utilitas ImageMagick yang digunakan dalam jawaban Ketan, juga memungkinkan Anda untuk menulis sesuatu

convert xc:none -page Letter a.pdf

atau

convert xc:none -page A4 a.pdf

atau (untuk kertas A4 horizontal)

convert xc:none -page 842x595 a.pdf

dll. , tanpa membuat file teks kosong. @chbrown memperhatikan bahwa ini membuat file pdf yang lebih kecil.

"xc:" berarti "X Constant Image" tetapi benar-benar dapat dianggap sebagai "x canvas". Ini adalah cara untuk menentukan satu blok warna, dalam hal ini tidak ada. Info lebih lanjut di http://imagemagick.org/Usage/canvas/#solid yang merupakan manual "de facto" untuk ImageMagick. [ditambah dengan informasi dari pipa] (Hal seperti pdf:adapat digunakan untuk secara eksplisit menyatakan format file. label:'some text', gradient:, rose:dan logo: tampaknya menjadi contoh lain dari format file khusus.)

Anko menyarankan memposting modifikasi ini sebagai jawaban terpisah, jadi saya melakukannya.

BartekChom
sumber
2
ImageMagick tidak benar-benar memiliki manual yang bermanfaat. "xc: <foo>" berarti "X Constant Image" tetapi benar-benar dapat dianggap sebagai "x canvas". Ini adalah cara untuk menentukan satu blok warna, dalam hal ini tidak ada . Info lebih lanjut di imagemagick.org/Usage/canvas/#solid yang merupakan manual "de facto" untuk ImageMagick.
pipa
2
Sebagai by-the-the way, ini juga berfungsi dengan A4 bukan Letter, jika Anda ingin ukuran kertas masuk akal.
TRiG
@TRiG: Tentu saja. Saya menyesal tidak menyebut Anda dalam suntingan saya, tetapi dalam hal ini saya sudah mengetahuinya.
BartekChom
Saya mengubah ini menjadi jawaban yang diterima karena itu yang saya masukkan ke dalam~/bin
Brian Fitzpatrick
Bisakah perintah ini diubah untuk menghasilkan file pdf dengan n halaman kosong?
Brian Fitzpatrick
34

Seperti GIF terkecil yang mungkin, PDF halaman kosong terkecil yang mungkin perlu dikerjakan dengan tangan, karena sangat kecil sehingga bit metadata yang tidak perlu namun tidak berbahaya menjadi bagian penting dari ukuran file, dan kompresi sebenarnya membuat segalanya lebih besar . Ini juga membutuhkan perhatian cermat terhadap aturan dalam spesifikasi PDF tentang bit apa dari struktur file yang diperlukan dan yang tidak diperlukan. (Tahukah Anda bahwa objek halaman harus berisi /Resourceskamus, meskipun kamus itu kosong, tetapi tidak diharuskan menyertakan /Contentsaliran?)

Jika Anda tidak menggunakan objek PDF 1.5 dan aliran referensi silang (yang memiliki keuntungan bahwa file tersebut dapat sepenuhnya dicetak ASCII) Saya percaya yang terbaik yang dapat Anda lakukan adalah 317 byte. Jika copy dan paste, perhatikan bahwa perlu ada sebuah ruang tambahan pada semua empat dari entri tabel referensi silang (garis antara 0 4dan trailer<<...), dan bahwa ada tidak seharusnya menjadi baris baru akhir setelah %%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

Mengganti tabel referensi silang dengan stream referensi silang v1.5 yang dibuat secara manual memang membuat file sedikit lebih kecil, dengan harga yang tidak lagi dapat dicetak ASCII: 294 bytes. (Demi keterbacaan, belum lagi bisa mengetik sama sekali, aliran xref di bawah ini telah hexdumped, tetapi ini tidak tercermin dalam kamus alirannya. Untuk memulihkan PDF yang valid Anda harus mengganti hexdump dengan sesuai byte biner mentah, atau mengubah /Length 15ke /Length 30/Filter/ASCIIHexDecodedan menerima file yang 328 byte panjang.)

%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

Saya juga bereksperimen dengan membungkus objek 1 hingga 3 ke dalam aliran objek, tetapi ini menambahkan kembali lebih banyak overhead daripada menghemat, bahkan ketika aliran dikompresi.

Formulasi alternatif yang mungkin dari aliran xref adalah

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

Sayangnya, terlepas dari penghematan besar dalam panjang data stream aktual, tambahan /Index[1 4]memakan semua kecuali satu byte penghematan. Juga, tidak jelas bagi saya apakah Anda diizinkan untuk meninggalkan objek 0 sepenuhnya dari file. (Ini juga tidak jelas bagi saya apakah objek 0 harus memiliki nomor generasi -1. Jika itu tidak diperlukan, Anda sebenarnya menyimpan lebih banyak byte

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

.)

Untuk mengubah ukuran kertas, ganti 612 792dengan lebar dan tinggi yang sesuai, dinyatakan dalam poin PostScript (72 poin PostScript = 1 inci AS atau 25,4 milimeter). Misalnya, 595 842untuk A4. Anda bisa menanamkan ini dalam skrip shell yang mengeluarkan PDF kosong dari ukuran kertas apa pun yang diinginkan; satu-satunya bagian yang sulit adalah memastikan bahwa startxrefoffset tetap akurat bahkan jika ukuran objek 3 berubah.

zwol
sumber
10
Ini mungkin kegiatan yang menyenangkan untuk codegolf.stackexchange.com
Nate Eldredge
5
Saya memposting ke meta.codegolf untuk melihat apakah sesuatu seperti ini akan diterima dengan baik: meta.codegolf.stackexchange.com/questions/8990/…
Nate Eldredge
Meskipun ini adalah solusi yang bagus untuk membuat dokumen PDF yang valid dengan halaman kosong di editor teks, itu bukan apa yang saya anggap solusi baris perintah (seperti yang diminta OP).
Kurt Pfeifle
23

Jika Anda telah menginstal convert(utilitas ImageMagick), Anda dapat melakukan ini:

touch a.txt && convert a.txt -page Letter a.pdf
mkc
sumber
1
convertjuga memiliki -sizeopsi yang dapat Anda gunakan untuk mengatur ukuran output pdf.
mkc
21
Anda juga dapat menulis convert xc:none -page Letter a.pdftanpa membuat file txt kosong.
BartekChom
3
Metode @ BartekChom tampaknya membuat halaman kosong yang bahkan lebih kosong. Ini menghasilkan file yang lebih kecil, dengan benar-benar tidak ada yang dipilih di atasnya, dan itu tidak memicu (null)kesalahan font apa pun .
chbrown
1
@ BartekChom Saya ingin itu sebagai jawaban yang terpisah sehingga saya dapat meningkatkannya.
Anko
1
Saya mendapat convert.im6: improper image header a.txt '@ error / txt.c / ReadTXTImage / 429. convert.im6: tidak ada gambar yang ditentukana.pdf' @ error/convert.c/ConvertImageCommand/3044.
Sigur
12

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

Dipersembahkan kepada Anda oleh groff, perangkat lunak yang paling diremehkan di dunia.

James K. Lowden
sumber
2
Saya mendapatkan groff: can't find `DESC' filedan groff:fatal error: invalid device `pdf'dengan groff versi 1.22.2 di CentOS 7.2.
gla3dr
Pesan yang sama untuk saya menggunakan bash 4.1.2runninggroff 1.18.1.4
zundarz
2
@ gla3dr Instal paket groff lengkap bukan hanya groff-base.
Kapten Giraffe
1
.bphanya singkatan "break page", itulah sebabnya ini menghasilkan dokumen 2 halaman. Untuk menghasilkan dokumen 1 halaman, lakukan saja yang lebih sederhana echo | groff -T pdf > blank.pdf.
Faheem Mitha
solusi yang sangat bagus, tetapi echo .bpmemang harus diganti echo, seperti yang dikatakan
@FaheemMitha
8

Anda bisa menggunakan pdfTeX:

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

yang menghasilkan satu halaman kosong texput.pdfsekitar 900 byte, setengah dari apa yang digunakan ImageMagick.

Ini menempatkan Anda pada belas kasihan ukuran kertas standar instalasi TeX Anda. Untuk mengatur ukuran secara eksplisit, Anda dapat pergi ke LaTeX sebagai gantinya:

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

Namun pilihan lain adalah menggunakan driver PDF Ghostscript, meskipun ps2pdfskrip praktis :

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

yang jauh lebih tenang daripada TeX tetapi menghasilkan keluaran yang lebih kecil (sekitar 2300 byte).

Henning Makholm
sumber
1
Saya menggunakan varian echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf. Ini sedikit lebih kecil, pada 2200 byte.
Faheem Mitha
echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry} \begin{document}\shipout\hbox{}\end{document}' | pdflatexmenciptakan article.pdf. Apakah mungkin untuk membuatnya blank.pdfsecara langsung?
Faheem Mitha
@FaheemMitha: Hmm, saya berharap ps2pdf dengan input kosong untuk menghasilkan file PDF yang berisi nol halaman - tetapi ketika saya coba memang ada halaman di sana. Bertanya-tanya dari mana datangnya ...
Henning Makholm
@Faheem: Dengan setidaknya Texlive, Anda dapat mengatur nama file dari file output dengan -jobname <basename>pada baris perintah.
Henning Makholm
1
@FaheemMitha: Masing \shipout\hbox{}- masing atau showpagemenghasilkan satu halaman. Baik TeX dan Postscript memiliki konstruksi perulangan yang dapat Anda gunakan, tetapi mungkin lebih mudah untuk menggunakan bahasa skrip pilihan Anda untuk menduplikasi perintah beberapa kali sesuai.
Henning Makholm
3

Cara mudah untuk membuat PDF dengan halaman kosong, adalah menggunakan rst2pdf:

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

hanya menggema dalam satu ruang tidak akan dilakukan, Anda akan berakhir dengan file PDF tanpa halaman (yang tidak sama dengan file kosong).

Anthon
sumber
2

Pada baris perintah, ketik:

ps2pdf blank.pdf

perintah ps2pdfini digunakan untuk mengonversi file PostScript ke pdf

ps2pdf file.ps file.pdf
GAD3R
sumber
1
ps2pdf blank.pdfmengembalikan kesalahan, karena mengharapkan file Postscript sebagai argumen. Dan perintah kedua membutuhkan yang sudah ada sebelumnya file.pdf. Apakah saya melewatkan sesuatu?
Faheem Mitha
1
Coba ini: 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
Victoria Stuart
2

Terakhir, tak kalah penting, inilah cara Ghostscript untuk membuat PDF yang menunjukkan halaman kosong:

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

Ukuran halaman kemungkinan besar adalah Letter. Jika Anda ingin A4, gunakan ini:

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

Latar Belakang: yang -cparameter dapat diikuti beberapa string PostScript valid, yang Ghostscript akan mencoba untuk menafsirkan. Dan halaman kosong di PostScript diwakili oleh blok kode pendek ini:

%!PS
showpage
Kurt Pfeifle
sumber