ฉันจะสร้าง PDF เปล่าจากบรรทัดคำสั่งได้อย่างไร


57

เมื่อเร็ว ๆ นี้ฉันต้องการหน้า PDF เปล่าขนาดเดียว (ขนาด 8.5 "x 11") และรู้ว่าฉันไม่ทราบวิธีสร้างจากบรรทัดคำสั่ง

ออกtouch blank.pdfก่อให้เกิดรูปแบบไฟล์ PDF ที่ว่างเปล่าไฟล์ มีเครื่องมือบรรทัดคำสั่งที่สร้างหน้า PDF เปล่าหรือไม่?


ทำไมคุณต้องการมัน ฉันมีแพ็คเกจการพิมพ์สำหรับจำลองการพิมพ์สองด้าน (ดูเพล็กซ์) บนเครื่องพิมพ์ที่ไม่พิมพ์สองด้าน การทำเช่นนี้ต้องการวางหน้าว่างพิเศษเมื่อพิมพ์หน้าเลขคู่สำหรับงานที่มีจำนวนหน้าคี่ ในการทำเช่นนี้ฉันแค่ส่ง formfeed ให้ lp นั่นเป็นเคล็ดลับโดยไม่สร้างไฟล์หน้าเปล่า ฯลฯ
Joe Joe

10
@ Joe ไม่ใช่ธุรกิจของเราทำไม Brian ต้องการหรือต้องการสิ่งนี้
ผู้ถือเลน

6
@IainHolder: ฉันหวังว่าผู้ใช้ SE จะคิดเหมือนคุณมากขึ้น
Mehrdad

3
@IainHolder - ฉันไม่ได้พยายามแงะในธุรกิจของ OP! ฉันแค่อยากจะแนะนำว่าถ้ามันเป็นสิ่งที่ฉันกำลังทำอยู่ก็มีวิธีอื่นที่จะทำ บ่อยครั้งที่สิ่งนี้เป็นปัญหา xy ( meta.stackexchange.com/questions/66377/what-is-the-the-xy-problem ) ดังนั้นการถามว่าเป้าหมายมีความเหมาะสมขนาดไหน
Joe

5
ฉันเพิ่งอ่านลิงค์ด้านบนโดยละเอียด ฉันไม่ได้ตระหนักว่านี่เป็นปัญหาที่ถกเถียงกัน TL; DR - ถ้าคุณรู้ว่าคุณกำลังทำอะไรอยู่คุณแค่ต้องการคำตอบสำหรับคำถามที่คุณถาม หากคุณไม่เชี่ยวชาญคุณอาจถามคำถามที่ไม่ถูกต้องและการชี้แจงว่าปัญหาจริงสามารถช่วยอะไรได้บ้าง
Joe

คำตอบ:


85

convertยูทิลิตี้ ImageMagick ที่ใช้ในคำตอบของ Ketan ยังให้คุณสามารถเขียนได้เช่นกัน

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 Constant Image" แต่อาจคิดได้ว่าเป็น "x canvas" มันเป็นวิธีการระบุบล็อกสีเดียวในกรณีนี้ไม่มี ข้อมูลเพิ่มเติมที่http://imagemagick.org/Usage/canvas/#solidซึ่งเป็นคู่มือ "de พฤตินัย" สำหรับ ImageMagick [เสริมด้วยข้อมูลจากท่อ] (สิ่งที่ต้องการpdf:aสามารถใช้ในการประกาศอย่างชัดแจ้งในรูปแบบของไฟล์. label:'some text', gradient:, rose:และlogo: ดูเหมือนจะเป็นตัวอย่างอื่น ๆ ของรูปแบบไฟล์พิเศษ.)

Anko แนะนำให้โพสต์การดัดแปลงนี้เป็นคำตอบที่แยกต่างหากดังนั้นฉันกำลังทำอยู่


2
ImageMagick ไม่มีคู่มือที่เป็นประโยชน์ "xc: <foo>" หมายถึง "X Constant Image" แต่อาจคิดได้ว่าเป็น "x canvas" มันเป็นวิธีการที่จะระบุบล็อกเดียวของสีในกรณีนี้ไม่มี ข้อมูลเพิ่มเติมที่imagemagick.org/Usage/canvas/#solidซึ่งเป็นคู่มือ "de พฤตินัย" สำหรับ ImageMagick
ท่อ

2
วิธีนี้ใช้ได้กับ A4 แทน Letter หากคุณต้องการขนาดกระดาษที่เหมาะสม
TRiG

@TRiG: แน่นอน ฉันขอโทษที่ฉันไม่ได้พูดถึงคุณในการแก้ไขของฉัน แต่ในกรณีนี้ฉันรู้ว่ามัน
BartekChom

ฉันเปลี่ยนสิ่งนี้เป็นคำตอบที่ยอมรับเพราะมันเป็นคำตอบที่ฉันใส่ลงไป~/bin
Brian Fitzpatrick

คำสั่งนี้สามารถแก้ไขเพื่อสร้างไฟล์ pdf ที่มีหน้าว่าง n หน้าได้หรือไม่?
Brian Fitzpatrick

34

เช่นเดียวกับGIF เล็กที่สุดที่เล็กที่สุดที่เป็นไปได้ว่างเปล่าหน้าไฟล์ PDF จะต้องมีการทำงานออกด้วยมือเพราะมันมีขนาดเล็กเพื่อให้บิตที่ไม่จำเป็น แต่-อันตรายของเมตาดาต้ากลายเป็นส่วนหนึ่งที่สำคัญของขนาดของไฟล์และการบีบอัดจริงทำให้สิ่งที่ใหญ่กว่า นอกจากนี้ยังต้องการการเอาใจใส่กฎในข้อกำหนด PDF อย่างละเอียดเกี่ยวกับบิตของโครงสร้างไฟล์ที่เป็นและไม่จำเป็นต้องใช้ (คุณรู้หรือไม่ว่าวัตถุหน้าจะต้องมี/Resourcesพจนานุกรมแม้ว่ามันจะว่างเปล่า แต่ไม่จำเป็นต้องรวมถึง/Contentsกระแส)

หากคุณไม่ได้ใช้วัตถุ PDF 1.5 และสตรีมอ้างอิงไขว้ (ซึ่งมีข้อได้เปรียบที่ไฟล์นั้นสามารถพิมพ์ได้อย่างสมบูรณ์แบบ ASCII) ฉันเชื่อว่าวิธีที่ดีที่สุดที่คุณสามารถทำได้คือ 317 ไบต์ หากคัดลอกและวางจะทราบว่ามีความต้องการที่จะเป็นพื้นที่ต่อท้ายทั้งสี่ของรายการตารางอ้างอิงข้าม (เส้นระหว่าง0 4และtrailer<<...) และนั่นก็คือไม่ควรจะเป็น newline %%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 ด้านล่างได้รับการ hexdumped แต่นี่ไม่ได้สะท้อนในพจนานุกรมกระแสของมันในการกู้คืน 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 US นิ้วหรือ 25.4 มิลลิเมตร) ตัวอย่างเช่น595 842สำหรับ A4 คุณสามารถฝังสิ่งนี้ลงในเชลล์สคริปต์ที่แยก PDF เปล่าออกมาไม่ว่าจะต้องการกระดาษขนาดไหน ส่วนที่ยุ่งยากเท่านั้นจะทำให้แน่ใจว่าstartxrefออฟเซ็ตยังคงแม่นยำแม้ว่าขนาดของวัตถุ 3 จะเปลี่ยนไป


10
นี่อาจเป็นกิจกรรมที่สนุกสำหรับcodegolf.stackexchange.com
Nate Eldredge

5
ฉันโพสต์ไปยัง meta.codegolf เพื่อดูว่าบางสิ่งเช่นนี้จะได้รับการตอบรับดีหรือไม่: meta.codegolf.stackexchange.com/questions/8990/…
Nate Eldredge

แม้ว่านี่จะเป็นโซลูชันที่ดีในการสร้างเอกสาร PDF ที่ถูกต้องพร้อมหน้าว่างในเท็กซ์เอดิเตอร์แต่ก็ไม่ใช่สิ่งที่ฉันคิดว่าเป็นโซลูชั่น commandline (ตามที่ OP ขอ)
Kurt Pfeifle

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 ฉันต้องการเป็นคำตอบที่แยกต่างหากเพื่อให้ฉันสามารถ upvote ได้
Anko

1
ฉันได้รับconvert.im6: improper image header a.txt '@ error / txt.c / ReadTXTImage / 429 convert.im6: ไม่มีการกำหนดรูปภาพa.pdf' @ error/convert.c/ConvertImageCommand/3044.
Sigur

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
Captain Giraffe

1
.bpย่อมาจาก "break page" ซึ่งเป็นสาเหตุที่ทำให้เกิดเอกสาร 2 หน้า หากต้องการสร้างเอกสาร 1 หน้าเพียงทำอย่างเรียบง่ายยิ่งecho | groff -T pdf > blank.pdfขึ้น
Faheem Mitha

ทางออกที่ดีมาก แต่echo .bpควรถูกแทนที่ด้วยechoเช่นเดียวกับ @FaheemMitha พูด
myrdd

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 มาก แต่ให้ผลลัพธ์ที่มีขนาดกะทัดรัดน้อยลง (ประมาณ 2,400 ไบต์)


1
echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdfผมใช้ตัวแปร นี่เล็กกว่าเล็กน้อยที่ 2200 ไบต์
Faheem Mitha

echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry} \begin{document}\shipout\hbox{}\end{document}' | pdflatexarticle.pdfสร้าง เป็นไปได้ไหมที่จะสร้างมันขึ้นมาblank.pdfโดยตรง?
Faheem Mitha

@FaheemMitha: อืมฉันคาดหวังว่า ps2pdf ที่มีอินพุตว่างเปล่าเพื่อสร้างไฟล์ PDF ที่มีศูนย์หน้า - แต่เมื่อฉันลองมีหน้าจริง ๆ สงสัยว่าที่มาจาก ...
เฮนนิ่ง Makholm

@Faheem: ด้วย Texlive เป็นอย่างน้อยคุณสามารถตั้งค่า basename ของไฟล์เอาต์พุตด้วย-jobname <basename>ในบรรทัดคำสั่ง
Henning Makholm

1
@FaheemMitha: แต่ละรายการ\shipout\hbox{}หรือshowpageสร้างหน้าเดียว ทั้ง TeX และ Postscript มีโครงสร้างวนลูปที่คุณสามารถใช้ได้ แต่อาจจะง่ายกว่าในการใช้ภาษาสคริปต์ที่คุณเลือกเพื่อทำซ้ำคำสั่งด้วยจำนวนครั้งที่เหมาะสม
Henning Makholm

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
Victoria Stuart

2

สุดท้ายนี้คือวิธี Ghostscript ในการสร้าง PDF ที่แสดงหน้าว่าง:

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

ขนาดหน้ากระดาษน่าจะเป็นตัวอักษร หากคุณต้องการ A4 ให้ใช้สิ่งนี้:

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

พื้นหลัง:-cพารามิเตอร์สามารถตามด้วยสตริง PostScript ถูกต้องใด ๆ ซึ่ง Ghostscript จะพยายามที่จะตีความ และหน้าว่างใน PostScript จะถูกแสดงด้วยบล็อกรหัสสั้น ๆ นี้:

%!PS
showpage
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.