Komut satırından nasıl boş bir PDF oluşturabilirim?


57

Kısa bir süre önce tek bir boş PDF sayfasına (8,5 "x 11" boyutunda) ihtiyacım vardı ve komut satırından nasıl yapılacağını bilmediğimi fark ettim.

Verme touch blank.pdf, boş bir PDF dosyası oluşturur . Boş bir PDF sayfası üreten bir komut satırı aracı var mı?


Ona neden ihtiyacın var? Dubleks olmayan yazıcılarda iki taraflı (dupleks) baskı taklit etmek için bir baskı paketim var. Bunu yapmak, tek sayfa sayımı olan bir iş için çift numaralı sayfaları yazdırırken fazladan boş sayfa bırakılmasını gerektirir. Bunu yapmak için lp'ye formfeed gönderiyorum. Bu boş bir sayfa dosyası oluşturmadan hile yapar, vb ..
Joe

10
@Joe Brian'ın neden bu istediği veya ihtiyaç duyduğu bizi ilgilendirmez.
Iain Sahibi

6
@IainHolder: Daha fazla SE kullanıcısının sizin gibi düşünmesini diliyorum.
Mehrdad

3
@IainHolder - OP'nin işine göz atmaya çalışmıyorum! Yaptığım gibi bir şey olursa, yapmanın başka bir yolu olduğunu söylemek istedim. Genelde bunun gibi şeyler xy problemleridir ( meta.stackexchange.com/questions/66377/what-is-the-xy-problem ), bu yüzden amacın ne kadar uygun olduğunu sormak.
Joe,

5
Sadece yukarıdaki bağlantıyı ayrıntılı olarak okudum. Bunun tartışmalı bir konu olduğunu bilmiyordum. TL; DR - Ne yaptığınızı biliyorsanız, o zaman sorduğunuz sorunun cevabını istiyorsunuz. Çok iyi tecrübeli değilseniz, yanlış soruyu sormuş olabilirsiniz ve asıl meselenin neye yardım edebileceğini netleştirmiş olabilirsiniz.
Joe,

Yanıtlar:


85

convert, Ketan'ın cevabında kullanılan ImageMagick yardımcı programı, aynı zamanda

convert xc:none -page Letter a.pdf

veya

convert xc:none -page A4 a.pdf

veya (yatay A4 kağıt için)

convert xc:none -page 842x595 a.pdf

vb . boş bir metin dosyası oluşturmadan. @chbrown bunun daha küçük bir pdf dosyası oluşturduğunu fark etti.

"xc:", "X Sabit Görüntü" anlamına gelir, ancak gerçekten "x tuval" olarak düşünülebilir. Bu, tek bir renk bloğu belirtmenin bir yoludur, bu durumda hiçbiri. ImageMagick için "fiili" bir kılavuz olan http://imagemagick.org/Usage/canvas/#solid adresinde daha fazla bilgi bulabilirsiniz . [borusundan bilgilerle desteklenmiş] (gibi şeyler pdf:aaçıkça dosyanın biçimini bildirmek için kullanılabilir. label:'some text', gradient:, rose:ve logo: özel dosya biçimleri diğer örnekler gibi görünüyor.)

Anko, bu değişikliği ayrı bir cevap olarak yayınlamayı önerdi, ben de yapıyorum.


2
ImageMagick gerçekten kullanışlı bir el kitabına sahip değil. "xc: <foo>", "X Sabit Görüntü" anlamına gelir ancak gerçekten "x tuval" olarak düşünülebilir. Bu, tek bir renk bloğu belirtmenin bir yoludur, bu durumda hiçbiri . ImageMagick için "fiili" bir el kitabı olan imagemagick.org/Usage/canvas/#solid adresinde daha fazla bilgi bulabilirsiniz .
pipo

2
Bu arada, eğer mantıklı kağıt boyutları istiyorsanız, bu aynı zamanda Letter yerine A4 ile de çalışır.
TRiG

@ TRiG: Elbette. Düzenlememde sizden bahsetmediğim için üzgünüm ama bu durumda bunu biliyordum.
BartekChom

Bunu kabul ettiğim cevaba değiştirdim çünkü cevap verdiğimden~/bin
Brian Fitzpatrick

Bu komut n boş sayfa içeren bir pdf dosyası oluşturmak için değiştirilebilir mi?
Brian Fitzpatrick

34

Mümkün olan en küçük GIF gibi, mümkün olan en küçük boş sayfa PDF'nin de elle işlenmesi gerekir, çünkü gereksiz fakat zararsız meta veri parçalarının dosya boyutunun önemli bir parçası haline gelmesi ve sıkıştırma aslında işleri daha büyük hale getirir . Ayrıca, dosya yapısının hangi bitlerinin gerekip gerekmediğine ilişkin PDF spesifikasyonundaki kurallara dikkat edilmesini gerektirir. (O sayfa nesneleri içermelidir biliyor muydunuz /Resourcesboş olsa bile, sözlüğü, ancak değil bir eklemesi gerekmektedir /Contentsakışı?)

PDF 1.5 nesnesini ve çapraz referans akışlarını kullanmıyorsanız (dosyanın ASCII'nin tamamen yazdırılabilir olması avantajına sahiptir) Yapabileceğiniz en iyi şeyin 317 bayt olduğuna inanıyorum. Kopyalama ve yapıştırma ise çapraz referans tablosu girdilerinin dördünün üzerinde sonunda bir boşluk (arasındaki çizgiler olması gerekir kötüye doğru olduğunu 0 4ve trailer<<...) ve orada olduğunu değil sonra nihai satır olması gerekiyordu %%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

Çapraz referans tablosunu elle hazırlanmış bir v1.5 çapraz referans akışıyla değiştirmek, artık ASCII: 294 bayt yazdırılamaz durumda olmak üzere dosyayı biraz daha küçük yapar. (Okunabilirliği uğruna, değil, aşağıda xref akışı hexdumped edilmiştir hiç de yazın edememek söz, ancak bu bir değil kendi akışı sözlükte yansıttı. Ortamınızda ya da geçerli bir PDF kurtarmak için birlikte HexDump yerine ham ikili bayt karşılık gelen veya değiştirmek /Length 15için /Length 30/Filter/ASCIIHexDecode328 bayt uzunluğunda bir dosya ve kabul edin.)

%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

Ayrıca 1'den 3'e kadar olan nesneleri bir nesne akışına sarmayı da denedim, ancak bu, akış sıkıştırıldığında bile, tasarrufundan daha fazla ek yük getiriyor.

Xref akışının olası bir alternatif formülasyonu,

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

Maalesef, gerçek akış verilerinin uzunluğundaki önemli tasarruflara rağmen, ek /Index[1 4]tasarrufların bir baytını tüketmektedir. Ayrıca, 0 nesnesini dosyadan tamamen çıkarmanıza izin verilip verilmediği bana net değil. (Bu nesne 0 nesil numarası olmalıdır olup olmadığını -1 bana da belirsiz. Eğer o oluyor gerekmez, aslında daha bayt kaydetmek

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

.)

Kağıt boyutunu değiştirmek 612 792için, PostScript noktalarında (72 PostScript noktaları = 1 ABD inç veya 25,4 milimetre) ifade edilen uygun genişlik ve yükseklikle değiştirin . Mesela 595 842A4 için. Bunu, istenen kağıt boyutunda boş bir PDF içeren bir kabuk betiğine gömebilirsiniz; Tek zor kısım startxref, nesne 3'ün büyüklüğü değişse bile ofsetin doğru kaldığından emin olmak olacaktır .



5
Böyle bir şey de kabul edileceğini olmadığını görmek meta.codegolf gönderilen: meta.codegolf.stackexchange.com/questions/8990/...
Nate Eldredge'in

Bu, bir metin düzenleyicide boş bir sayfa içeren geçerli bir PDF belgesi oluşturmak için iyi bir çözüm olsa da, komut satırı çözümünü tam olarak dikkate almam. (OP'nin istediği gibi).
Kurt Pfeifle

23

Yüklü convert(bir ImageMagick yardımcı programı) varsa, şunları yapabilirsiniz:

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

1
convertAyrıca -sizepdf çıktısının boyutunu ayarlamak için kullanabileceğiniz bir seçenek vardır.
mkc

21
convert xc:none -page Letter a.pdfBoş txt dosyası oluşturmadan da yazabilirsiniz .
BartekChom

3
@ BartekChom'un metodu daha da boş bir sayfa yaratıyor gibi görünüyor. Seçilebilecek hiçbir şey olmadan daha küçük bir dosya oluşturur ve (null)yazı tipi hatalarını tetiklemez .
chbrown

1
@BartekChom Ayrı bir cevap olarak, böylece onu oylayabilirim.
Anko,

1
Ben convert.im6: improper image header bir.txt '@ error / txt.c / ReadTXTImage / 429 aldım. convert.im6: resim tanımlanmadıa.pdf' @ error/convert.c/ConvertImageCommand/3044.
Sigur

12

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

Dünyanın en az kullanılan yazılımı olan groff tarafından getirilmiştir.


2
Ben olsun groff: can't find `DESC' fileve groff:fatal error: invalid device `pdf'CentOS 7.2 üzerinde Groff sürümü 1.22.2 ile.
gla3dr

Benim için bash 4.1.2çalışan aynı mesajgroff 1.18.1.4
zundarz 21:16 '

2
@ gla3dr Sadece groff-base değil komple groff paketini kurun.
Kaptan Zürafa

1
.bpsadece "sayfa sonu" anlamına gelir, bu yüzden 2 sayfalık bir belge oluşturur. 1 sayfalık bir belge üretmek için daha da basitini yapın echo | groff -T pdf > blank.pdf.
Faheem Mitha

çok güzel bir çözüm, ama echo .bpgerçekten echo, @FaheemMitha'nın dediği gibi
myrdd

8

PdfTeX kullanabilirsiniz:

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

texput.pdfImageMagick'in yarısı kadar, yaklaşık 900 baytlık boş bir sayfa oluşturur.

Bu, sizi TeX kurulumunuzun varsayılan kağıt boyutunun insafına bırakıyor. Boyutu açıkça ayarlamak için bunun yerine LaTeX'e gidebilirsiniz:

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

Yine bir başka seçenek, kullanışlı ps2pdfkomut dosyası olsa da Ghostscript'in PDF sürücüsünü kullanmak olacaktır :

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

TeX'ten çok daha sessiz ancak daha az kompakt çıktı (yaklaşık 2300 byte) üretir.


1
Ben varyantı kullanıyorum echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf. Bu 2200 baytta biraz daha küçüktür.
Faheem Mitha

echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry} \begin{document}\shipout\hbox{}\end{document}' | pdflatexoluşturur article.pdf. blank.pdfDoğrudan yaratması mümkün mü ?
Faheem Mitha

@FaheemMitha: Hmm, boş bir girişe sahip ps2pdf'in sıfır sayfa içeren bir PDF dosyası üretmesini beklerdim - ama denediğimde gerçekten orada bir sayfa var. Nereden geldiğini merak ediyorum ...
Henning Makholm

@Faheem: En azından Texlive ile çıktı dosyasının taban adını -jobname <basename>komut satırında ayarlayabilirsiniz .
Henning Makholm

1
@FaheemMitha: Her \shipout\hbox{}veya showpagebir sayfa üretir. Hem TeX hem de Postscript, kullanabileceğiniz döngüsel yapıları vardır, ancak komutu istediğiniz sayıda kopyalamak için seçtiğiniz komut dosyası dilini kullanmak daha kolaydır .
Henning Makholm

3

Boş sayfa içeren bir PDF dosyası oluşturmanın kolay bir yolu rst2pdfşunları kullanmaktır :

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

Sadece tek bir alanda yankılanma işe yaramaz, sayfaların olmadığı bir PDF dosyası (boş bir dosya ile aynı değildir) ile sonuçlanır.


2

Komut satırına şunu yazın:

ps2pdf blank.pdf

komut ps2pdfPostScript dosyasını pdf'ye dönüştürmek için kullanılır

ps2pdf file.ps file.pdf

1
ps2pdf blank.pdfBir Postscript dosyasını argüman olarak beklediğinden bir hata döndürür. Ve ikinci komut önceden var olanı gerektirir file.pdf. Bir şey mi eksik?
Faheem Mitha

1
Bunu dene: 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

Son olarak, en az değil, işte boş bir sayfayı gösteren bir PDF dosyası oluşturmanın Ghostscript yolu:

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

Sayfa boyutu büyük olasılıkla Mektup olacaktır. A4 istiyorsanız, bunu kullanın:

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

Amaç:-c Parametre Ghostscript yorumlamaya çalışacağız herhangi bir geçerli PostScript dize ile takip edilebilir. PostScript'teki boş bir sayfa bu kısa kod bloğu ile gösterilir:

%!PS
showpage
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.