2011-01-28 42 views
16

Tôi đang sử dụng API thư viện Ghostscript (gói từ C#) để in tài liệu PDF từ ứng dụng của mình.
Với tham số '-dFirstPage' và '-dLastPage' Tôi có thể chọn một loạt các trang cần in, nhưng tổng số trang của PDF như thế nào?Ghostscript: PDF tổng số trang

Nó không phải là rất tốt đẹp để cho phép một người dùng để chọn một khoảng thời gian trang 2-10 khi, hãy để tôi nói, tài liệu PDF chỉ có 4 trang.

Hãy xem xét rằng tôi đang sử dụng thư viện Ghostscript thông qua cuộc gọi thư viện API gsapi_init_with_args API.

+1

PDF phải khai báo số lượng trang trong danh mục siêu dữ liệu của chúng. Bạn có thể als chạy s.th. như * gs -q -c "(in.pdf) (r) tệp runpdfbegin pdfpagecount = quit" * để làm cho Ghostscript đếm các trang. –

+0

@pipitas Xin chào và cảm ơn sự giúp đỡ của bạn; nếu tôi understud, tôi phải sử dụng "(in.pdf) (r) tập tin runpdfbegin pdfpagecount = quit" như tham số đầu vào của một cuộc gọi GS? Nếu có, 'in.pdf' sẽ là tệp đầu vào nhưng còn về '(r)' thì sao? Cảm ơn một lần nữa. – lorenzoff

+0

Chỉ cần sử dụng '(r)'. Đó là một macro nội bộ Ghostscript cho Ghostscript đọc/chạy tập tin '(in.pdf)' ... Có, biến duy nhất là 'in.pdf' - thay thế nó bằng [path +] tên tập tin PDF của bạn. –

Trả lời

31

Ghostscript có thể đếm và hiển thị số lượng trang của PDF trên stdout. Dòng lệnh là

gswin32c^
    -q^
    -dNODISPLAY^
    -c "(input.pdf) (r) file runpdfbegin pdfpagecount = quit" 

Ở đây tất cả các công cụ -c "..." là một đoạn mã lệnh PostScript (sử dụng một vài phần mở rộng lệnh nội bộ GS). Và input.pdf là tên tệp PDF (cũng có thể là đường dẫn đầy đủ như (c:/path/to/my.pdf)).

Tuy nhiên, công cụ tốt hơn và nhanh hơn cho loại công việc này sẽ sử dụng pdfinfo (một phần của tiện ích XPDF, cũng có sẵn trên Windows).


Cập nhật:

@ebyrob muốn biết liệu người ta có thể thay đổi dòng lệnh ví dụ của tôi để nó cũng màn PDF trong một hoạt động đơn lẻ. Hãy thử điều này:

gswin32c^
    -q^
    -c "(input.pdf) (r) file runpdfbegin pdfpagecount ="^
    -f input.pdf 

Vâng, nó không phải là một thao tác duy nhất - nó chỉ là hai hoạt động khác nhau trong một dòng lệnh duy nhất.

+0

Cảm ơn bạn một lần nữa – lorenzoff

+0

Điều này có thể được sửa đổi để đọc siêu dữ liệu trong khi cũng hiển thị hình ảnh PDF trong một hoạt động không? (Nói với '-sDEVICE = display' và bạn bè được chỉ định) Và cũng có thể, khi đọc tập tin từ' stdin'? (Ví dụ: gswin32 filename of '-') Chỉ chạy:' -c "pdfpagecount" 'dường như cho tôi lỗi" hoạt động không tồn tại ". Bao gồm 'runpdfbegin' trò chơi tôi tên tập tin không hợp lệ. –

+0

@ebyrob: bạn cần mọi ký tự đơn trong ví dụ lệnh của tôi (bạn chỉ có thể thay đổi '* input.pdf *' thành tên tệp hoặc đường dẫn hiện có khác. Bạn không thể bỏ qua bất kỳ phần nào bạn muốn ... –

0

Tôi cố gắng để làm cho kịch bản này:

gswin32c^
    -q^
    -c "(input.pdf) (r) file runpdfbegin pdfpagecount ="^
    -f input.pdf 

làm việc trong một C# quấn giải pháp và giữ nhận được lỗi "/ undefinedfilename". Trong trường hợp này đảm bảo rằng filepath của bạn có Slashes "/" là DirectorySeperator và không phải là dấu gạch chéo ngược "\". Tôi biết Kurt Pfeifle đã viết nó, nhưng nó đã xảy ra với tôi tôi chỉ bỏ qua nó.

+0

Nếu bạn muốn sử dụng dấu gạch chéo ngược, bạn phải sử dụng hai trong số chúng mỗi lần ... –

Các vấn đề liên quan