Làm cách nào để tạo một tệp PDF trống từ dòng lệnh?


57

Gần đây tôi cần một trang PDF trống duy nhất (kích thước 8,5 "x 11") và nhận ra rằng tôi không biết cách tạo một trang từ dòng lệnh.

Phát hành touch blank.pdftạo ra một tệp PDF trống . Có một công cụ dòng lệnh tạo ra một trang PDF trống không?


Tại sao bạn cần nó? Tôi có một gói in để mô phỏng in hai mặt (in hai mặt) trên máy in không in hai mặt. Làm điều này đòi hỏi phải đưa ra một trang trống thêm khi in các trang được đánh số chẵn cho một công việc có số lượng trang lẻ. Để làm điều này, tôi chỉ cần gửi một formfeed đến lp. Đó là mẹo mà không tạo tệp trang trống, v.v.
Joe

10
@Joe Không phải việc của chúng tôi tại sao Brian muốn hoặc cần điều này.
Người giữ Iain

6
@IainHolder: Tôi muốn nhiều người dùng SE nghĩ như bạn.
Mehrdad

3
@IainHolder - Tôi không cố gắng để kinh doanh của OP! Tôi chỉ muốn đề xuất rằng nếu nó giống như những gì tôi đang làm, thì có một cách khác để làm điều đó. Thông thường những thứ như thế này là các vấn đề xy ( meta.stackexchange.com/questions/66377/what-is-the-xy-probols ), vì vậy, hỏi mục tiêu nào có thể khá phù hợp.
Joe

5
Tôi chỉ đọc qua các liên kết ở trên một cách chi tiết. Tôi đã không nhận ra đây là một vấn đề gây tranh cãi. TL; DR - nếu bạn biết bạn đang làm gì, thì bạn chỉ muốn câu trả lời cho câu hỏi bạn đã hỏi. Nếu bạn không thành thạo lắm, bạn có thể đã hỏi sai câu hỏi và làm rõ vấn đề thực sự có thể giúp gì.
Joe

Câu trả lời:


85

convert, tiện ích ImageMagick được sử dụng trong câu trả lời của Ketan, cũng cho phép bạn viết một cái gì đó như

convert xc:none -page Letter a.pdf

hoặc là

convert xc:none -page A4 a.pdf

hoặc (đối với giấy A4 nằm ngang)

convert xc:none -page 842x595 a.pdf

vv , mà không tạo ra một tập tin văn bản trống. @chbrown nhận thấy rằng điều này tạo ra một tệp pdf nhỏ hơn.

"xc:" có nghĩa là "X Constant Image" nhưng thực sự có thể được coi là "x canvas". Đó là một cách để chỉ định một khối màu duy nhất, trong trường hợp này là không. Thông tin thêm tại http://imagemagick.org/Usage/canvas/#solid là hướng dẫn "thực tế" cho ImageMagick. [bổ sung thông tin từ ống] (Những điều như pdf:athể được sử dụng để khai báo một cách rõ ràng định dạng của một tập tin. label:'some text', gradient:, rose:logo: dường như là ví dụ khác về định dạng file đặc biệt.)

Anko đề nghị đăng bài sửa đổi này như một câu trả lời riêng biệt, vì vậy tôi đang thực hiện nó.


2
ImageMagick không thực sự có một hướng dẫn hữu ích. "xc: <foo>" có nghĩa là "X Constant Image" nhưng thực sự có thể được coi là "x canvas". Đó là một cách để chỉ định một khối màu duy nhất, trong trường hợp này là không . Thông tin thêm tại fantemagick.org/Usage/canvas/#solid là hướng dẫn "thực tế" cho ImageMagick.
ống

2
Nhân tiện, điều này cũng hoạt động với A4 thay vì Letter, nếu bạn muốn kích thước giấy hợp lý.
TRiG

@TRiG: Tất nhiên rồi. Tôi xin lỗi vì tôi đã không đề cập đến bạn trong bản chỉnh sửa của mình, nhưng trong trường hợp này tôi đã biết điều đó.
BartekChom

Tôi đã thay đổi câu trả lời này thành câu trả lời được chấp nhận vì đó là câu trả lời tôi đưa vào~/bin
Brian Fitzpatrick

Lệnh này có thể được thay đổi để tạo một tệp pdf với n trang trống không?
Brian Fitzpatrick

34

Giống như GIF nhỏ nhất có thể, PDF trang trống nhỏ nhất có thể cần phải được xử lý bằng tay, bởi vì nó quá nhỏ để các siêu dữ liệu không cần thiết nhưng vô hại trở thành một phần quan trọng của kích thước tệp và nén thực sự làm cho mọi thứ lớn hơn . Nó cũng đòi hỏi sự chú ý cẩn thận đến các quy tắc trong đặc tả PDF về các bit của cấu trúc tệp là gì và không bắt buộc. (Bạn có biết rằng các đối tượng trang phải chứa một /Resourcestừ điển, ngay cả khi nó trống, nhưng không bắt buộc phải bao gồm một /Contentsluồng?)

Nếu bạn không sử dụng đối tượng PDF 1.5 và các luồng tham chiếu chéo (có lợi thế là tệp có thể in hoàn toàn ASCII) Tôi tin rằng điều tốt nhất bạn có thể làm là 317 byte. Nếu sao chép và dán, hãy lưu ý rằng cần phải có một khoảng trắng ở cả bốn mục trong bảng tham chiếu chéo (các dòng giữa 0 4trailer<<...), và không phải là một dòng mới cuối cùng sau %%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

Việc thay thế bảng tham chiếu chéo bằng luồng tham chiếu chéo v1.5 được tạo thủ công sẽ làm cho tệp nhỏ hơn một chút, với giá không thể in được ASCII: 294 byte. (Để dễ đọc, không đề cập đến việc có thể nhập nó vào, luồng xref bên dưới đã được hexdumped, nhưng điều này không được phản ánh trong từ điển luồng của nó. các byte nhị phân thô tương ứng hoặc thay đổi /Length 15thành /Length 30/Filter/ASCIIHexDecodevà chấp nhận một tệp dài 328 byte.)

%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

Tôi cũng đã thử nghiệm gói các đối tượng 1 đến 3 vào một luồng đối tượng, nhưng điều này bổ sung lại nhiều chi phí hơn mức tiết kiệm, ngay cả khi luồng được nén.

Một công thức thay thế có thể của luồng xref là

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

Đáng buồn thay, mặc dù tiết kiệm đáng kể về độ dài của dữ liệu luồng thực tế, phần bổ sung /Index[1 4]ăn hết tất cả trừ một byte tiết kiệm. Ngoài ra, tôi không rõ liệu bạn có được phép để đối tượng 0 hoàn toàn ra khỏi tệp hay không. (Nó cũng không rõ ràng với tôi cho dù đối tượng 0 phải có số thế hệ -1. Nếu đó là không cần thiết, bạn thực sự tiết kiệm nhiều hơn byte với

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

.)

Để thay đổi kích thước giấy, thay thế 612 792bằng chiều rộng và chiều cao phù hợp, được biểu thị bằng điểm PostScript (72 điểm PostScript = 1 US inch hoặc 25,4 mm). Ví dụ, 595 842đối với A4. Bạn có thể nhúng đoạn mã này vào tập lệnh shell tạo ra một tệp PDF trống với bất kỳ kích thước giấy nào mong muốn; phần khó khăn duy nhất là đảm bảo rằng phần startxrefbù vẫn chính xác ngay cả khi kích thước của đối tượng 3 thay đổi.


10
Đây có thể là một hoạt động thú vị cho codegolf.stackexchange.com
Nate Eldredge

5
Tôi đã đăng lên meta.codegolf để xem nếu một cái gì đó như thế này sẽ được đón nhận: meta.codegolf.stackexchange.com/questions/8990/ trộm
Nate Eldredge

Mặc dù đây là một giải pháp tốt để tạo một tài liệu PDF hợp lệ với một trang trống trong trình soạn thảo văn bản, nhưng đó không chính xác là những gì tôi coi là giải pháp dòng lệnh (như OP yêu cầu).
Kurt Pfeifle

23

Nếu bạn đã convertcài đặt (tiện ích ImageMagick), bạn có thể thực hiện việc này:

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

1
convertcũng có một -sizetùy chọn mà bạn có thể sử dụng để đặt kích thước của pdf đầu ra.
mkc

21
Bạn cũng có thể viết convert xc:none -page Letter a.pdfmà không tạo tập tin txt trống.
BartekChom

3
Phương pháp của @ BartekChom dường như tạo ra một trang trống thậm chí còn trống hơn. Nó tạo ra một tệp nhỏ hơn, hoàn toàn không có gì có thể lựa chọn trên đó và nó không kích hoạt bất kỳ (null)lỗi phông chữ nào .
chbrown

1
@BartekChom Tôi muốn đó là một câu trả lời riêng biệt để tôi có thể nâng cấp nó.
Anko

1
Tôi đã nhận được convert.im6: improper image header a.txt '@ error / txt.c / ReadTXTImage / 429. convert.im6: không có hình ảnh nào được xác địnha.pdf' @ error/convert.c/ConvertImageCommand/3044.
Sigur

12

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

Mang lại cho bạn bởi groff, phần mềm bị đánh giá thấp nhất thế giới.


2
Tôi nhận groff: can't find `DESC' filegroff:fatal error: invalid device `pdf'với phiên bản groff 1.22.2 trên CentOS 7.2.
gla3dr

Cùng một thông điệp cho tôi bằng cách sử dụng bash 4.1.2chạygroff 1.18.1.4
zundarz

2
@ gla3dr Cài đặt gói groff hoàn chỉnh không chỉ là groff-base.
Thuyền trưởng Hươu cao cổ

1
.bpchỉ là viết tắt của "break page", đó là lý do tại sao điều này tạo ra một tài liệu 2 trang. Để tạo một tài liệu 1 trang, chỉ cần làm đơn giản hơn echo | groff -T pdf > blank.pdf.
Faheem Mitha

Giải pháp rất hay, nhưng echo .bpthực sự nên được thay thế bằng echo, giống như @FaheemMitha đã nói
myrdd

8

Bạn có thể sử dụng pdfTeX:

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

trong đó tạo ra một trang trống texput.pdfkhoảng 900 byte, một nửa so với ImageMagick sử dụng.

Tuy nhiên, điều này đặt bạn vào vị trí của kích thước giấy mặc định của cài đặt TeX. Để đặt kích thước rõ ràng, bạn có thể truy cập LaTeX thay thế:

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

Một tùy chọn khác sẽ là sử dụng trình điều khiển PDF của Ghostscript, mặc dù ps2pdftập lệnh tiện dụng :

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

vốn yên tĩnh hơn nhiều so với TeX nhưng tạo ra đầu ra nhỏ gọn hơn (khoảng 2300 byte).


1
Tôi sử dụng các biến thể echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf. Cái này nhỏ hơn một chút, ở mức 2200 byte.
Faheem Mitha

echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry} \begin{document}\shipout\hbox{}\end{document}' | pdflatextạo ra article.pdf. Có thể có nó tạo ra blank.pdftrực tiếp?
Faheem Mitha

@FaheemMitha: Hmm, tôi sẽ mong đợi ps2pdf có đầu vào trống để tạo tệp PDF chứa các trang không - nhưng khi tôi thử thì thực sự có một trang ở đó. Tự hỏi nơi đó đến từ ...
Henning Makholm

@Faheem: Với Texlive ít nhất, bạn có thể đặt tên cơ sở của tệp đầu ra với -jobname <basename>dòng lệnh.
Henning Makholm

1
@FaheemMitha: Mỗi \shipout\hbox{}hoặc showpagetạo một trang. Cả TeX và POSTcript đều có cấu trúc lặp mà bạn có thể sử dụng, nhưng có thể đơn giản hơn khi sử dụng ngôn ngữ kịch bản bạn chọn để sao chép lệnh một số lần thích hợp.
Henning Makholm

3

Một cách dễ dàng để tạo một tệp PDF với một trang trống, là sử dụng rst2pdf:

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

chỉ lặp lại trong một không gian duy nhất sẽ không làm được, bạn sẽ kết thúc bằng một tệp PDF không có trang (không giống như một tệp trống).


2

Trên dòng lệnh, gõ:

ps2pdf blank.pdf

lệnh ps2pdfđược sử dụng để chuyển đổi tập tin PostScript thành pdf

ps2pdf file.ps file.pdf

1
ps2pdf blank.pdftrả về một lỗi, bởi vì nó mong đợi một tệp Postcript làm đối số. Và lệnh thứ hai yêu cầu có sẵn file.pdf. Tui bỏ lỡ điều gì vậy?
Faheem Mitha

1
Hãy thử điều này: 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

Cuối cùng, không kém phần quan trọng, đây là cách Ghostscript để tạo tệp PDF hiển thị một trang trống:

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

Kích thước trang rất có thể sẽ là Thư. Nếu bạn muốn A4, sử dụng này:

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

Bối cảnh: các -ctham số có thể được theo sau bởi bất kỳ chuỗi PostScript hợp lệ, mà Ghostscript sẽ cố gắng để giải thích. Và một trang trống trong PostScript được thể hiện bằng khối mã ngắn này:

%!PS
showpage
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.