2011-09-16 59 views
32

Tôi đang cố gắng mở rộng một tệp PDF, ví dụ như kích thước A4 nhỏ đến A4.Thay đổi kích thước tệp PDF bằng Ghostscript

Tính năng này hoạt động tốt với tài liệu dọc. Tài liệu được thu nhỏ một cách chính xác và sau đó phần đệm được thêm vào trên cùng.

Tuy nhiên, trên đệm tài liệu ngang không được thêm vào. Do đó tài liệu sẽ kết thúc là chiều cao chính xác cho A4 nhưng sau đó không đủ rộng, vì đệm không được thêm vào bên tài liệu (như tôi hy vọng).

Đây là những gì tôi sử dụng để có nó làm việc cho các tài liệu chân dung A4:

gs \ 
-sOutputFile=output.pdf \ 
-sDEVICE=pdfwrite \ 
-sPAPERSIZE=a4 \ 
-dCompatibilityLevel=1.4 \ 
-dNOPAUSE \ 
-dBATCH \ 
-dPDFFitPage \ 
    input.pdf 

Trả lời

7

lệnh của bạn không làm bất cứ nhân rộng ở tất cả, nó chỉ mất một tập tin PDF và chuyển đổi nó thành một tập tin PDF.

Tôi khuyên bạn nên thử thêm -dPDFFitPage để chia tỷ lệ trang trong tệp PDF cho phù hợp với kích thước trang hiện tại (như được chỉ định bởi -PAPERSIZE trong trường hợp này).

Điều này thường được thiết kế để làm việc với các máy in có kích thước giấy được xác định và do đó có thể không hoạt động tốt với thiết bị pdfwrite không có kích thước trang cố định, nhưng bạn nên thử.

+0

Cảm ơn bạn đã trả lời, tôi đã sử dụng đối số -dPDFFITPAGE và điều này không làm cho nó hoạt động. – Matt

+0

Có nhiều cách (những thứ xấu xí) để mở rộng đầu vào PDF, nhưng thường không bắt buộc. Bạn có thể chia sẻ một tệp ví dụ để xem không? – KenS

+0

@Matt: Tôi nghĩ nó sẽ hoạt động nếu bạn thêm công tắc '-dFIXEDMEDIA' ... –

42

Bạn nên thêm -dFIXEDMEDIA switch:

gs \ 
-o output.pdf \ 
-sDEVICE=pdfwrite \ 
-sPAPERSIZE=a4 \ 
-dFIXEDMEDIA \ 
-dPDFFitPage \ 
-dCompatibilityLevel=1.4 \ 
    input.pdf 

-dFIXEDMEDIA là luôn luôn cần thiết nếu bạn cần phải buộc một giấy/trang/size phương tiện cụ thể và bỏ qua những giấy/trang/media kích thước quy định trong tài liệu. Vì PDF luôn có kích thước giấy/trang/phương tiện được xác định (PostScript có thể có hoặc có thể không có ...).

(My -o ... là ngắn hơn và tiết kiệm một từ thêm -dBATCH -dNOPAUSE -. Nhưng chỉ hoạt động cho nhiều phiên bản gần đây của Ghostscript)

+3

Cảm ơn, đối với A5 và một dòng: 'gs -sDEVICE = pdfwrite -sPAPERSIZE = a5 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel = 1.4 -o out.pdf in.pdf' – Dorian

+1

Cảm ơn , nó hoạt động! Tôi đã sử dụng với A3: 'gs -o outputA3.pdf -sDEVICE = pdfwrite -sPAPERSIZE = a3 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel = 1.4 input.pdf' – Tenaciousd93

+0

Làm thế nào để ngăn chặn việc giảm chất lượng lớn xảy ra với lệnh này? – JohnnyFromBF

-1

Đó là một sự xấu hổ mà các tính năng của pstops, một gói phần mềm rất hữu ích cho rộng và kết hợp các trang của postscript, dường như không có sẵn cho pdf. Có một chương trình gọi là pdftopdf, nhưng nó (theo như tôi có thể thấy) làm những việc tương tự như pstops. Bạn có thể tạo một tệp ps (tôi in thành tệp trong evince), sử dụng pstops và rồi ps2pdf, nhưng điều đó khá vụng về.

5

Dường như kích thước của đầu ra có thể được (tốt nhất) bắt buộc bằng cách chỉ định kích thước theo điểm và không sử dụng -dPDFFitPage. Tôi đã nhận được kích thước điểm phân số, đó là xấu. Sau đây là cho in A5 sử dụng dịch vụ in theo yêu cầu. "Real" A5 là 420x595 điểm. Tôi thấy rằng việc sử dụng -sPAPERSIZE = a5 cho các kích thước trang điểm phân số, nhưng điều đó có thể là do bản gốc đã bị lỗi.

gs \ 
-o output.pdf \ 
-sDEVICE=pdfwrite \ 
-dDEVICEWIDTHPOINTS=419 -dDEVICEHEIGHTPOINTS=595 \ 
-dFIXEDMEDIA \ 
-dCompatibilityLevel=1.4 \ 
    input.pdf 

Để kiểm tra điều này, tôi thấy rằng việc sử dụng PDFshuffler tôi đã có thể xuất khẩu các trang cá nhân, sau đó với pdfinfo tôi đã có thể để có được kích thước chính xác của những trang đó. Điều này xác nhận rằng việc sử dụng thông số thiết bị đã giúp rõ ràng.

3

Đầu tiên, cảm ơn mọi người đã đăng ở đây.

Tôi có tập lệnh nhỏ này được gọi là pdfScale đã hấp thụ các phần của câu trả lời được đăng ở đây. Vì vậy, tôi quyết định gửi lại 2 xu của tôi. Tôi đang sử dụng một chút pha trộn các câu trả lời của Kurt và Tim. Tương tự như của Tim.Tôi đã chơi với này trong một vài ngày và đây là kết luận của một phần của tôi về các phương pháp được đăng ở đây:

Set Khổ giấy theo Tên với -sPAPERSIZE

  • Dễ dàng chỉ cần vượt qua tên giấy (Ví dụ. a4)
  • không thể sản xuất 100% chính xác kích thước điểm
  • May Lật Cảnh <> Chân dung

Đặt kích thước giấy trong PS-điểm -dDEVICEWIDTHPOINTS, -dDEVICEHEIGHTPOINTS

  • Tạo sự chắc chắn bạn sẽ có được kích thước mà bạn muốn trong điểm
  • Bạn có thể lật WIDTH <> HEIGHT mình
  • You need to know the sizes in Points
  • Không dễ dàng như vậy để viết kịch bản xung quanh nó, vì bạn sẽ cần kích thước trang mới theo điểm và cũng sẽ cần kích thước trang của nguồn nếu bạn muốn phát hiện phong cảnh/dọc.
  • Bạn cũng có thể đặt các giấy tờ tùy chỉnh được xác định (bất kỳ kích thước nào bạn muốn thực sự).
  • Tôi đã sử dụng -dDEVICEWIDTH, -dDEVICEHEIGHT thay vì phiên bản điểm dài hơn, nhưng cả hai dường như làm điều tương tự (cả hai đều nhận điểm).

Vì tập lệnh bash của tôi đã có khả năng nhận kích thước trang nguồn và tôi thích ý tưởng để có thể đặt kích thước trang tùy chỉnh, tôi quyết định tập trung vào việc đặt kích thước trang theo điểm. Tôi cũng đã bao gồm GS Paper Sizes trong tập lệnh của mình (có tên và kích cỡ). Vì vậy, nhận được thông tin đó cũng dễ dàng.

Sử dụng -dFIXEDMEDIA có vẻ là phải có trên cả hai trường hợp, như được chỉ ra trước đây.

Vì vậy, đây là cách tiếp cận của tôi đã đi (theo một cách kịch bản) kích thước

  1. Nhận trang Nguồn PDF (Đối với Detection Flip)
  2. Nhận kích thước trang của mục tiêu trong điểm (Ví dụ. A4> 595x842)
  3. Kiểm tra họ có cùng một định hướng hay flip Target nếu cần thiết
  4. Run GS với điểm hoặc lật điểm

Khi tôi đang cố khắc phục sự cố tự động xoay, I found this other Kurt response. Đây là về việc sử dụng -dAutoRotatePages. Chỉ cần sao chép một phần câu trả lời của mình tại đây:

  • -dAutoRotatePages=/None - giữ lại hướng của mỗi trang;
  • -dAutoRotatePages=/All - xoay tất cả các trang (hoặc không có) tùy thuộc vào loại "quyết định đa số";
  • -dAutoRotatePages=/PageByPage - tự động xoay trang riêng lẻ.

Tập lệnh mặc định là PageByPage nhưng điều chỉnh được. Nó hoạt động tốt trong các bài kiểm tra của tôi. Sử dụng -dAutoRotatePages cũng có vẻ làm giảm nhu cầu kích thước trang trước khi lật, mặc dù nó không giống nhau. Tôi giữ cả hai lựa chọn.

Ứng dụng nhỏ của tôi ban đầu được tạo để mở rộng các tệp PDF (mà không thay đổi kích thước trang). Sau đó, tôi thêm vào bây giờ các chức năng để làm một, khác hoặc cả hai. Tôi vẫn không thể làm tất cả trong một cuộc gọi GS duy nhất mặc dù.

Đây là những gì tôi đang gọi để thay đổi kích thước, thay đổi các biến thành giá trị thực. Đây là kích thước Portrait A4 với PageByPage tự động xoay:

gs \ 
-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \ 
-dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \ 
-dColorConversionStrategy=/LeaveColorUnchanged \ 
-dSubsetFonts=true -dEmbedAllFonts=true \ 
-dDEVICEWIDTHPOINTS=595 -dDEVICEHEIGHTPOINTS=842 \ 
-dAutoRotatePages='/PageByPage' \ 
-dFIXEDMEDIA -dPDFFitPage \ 
-sOutputFile='../myOutputFile.pdf' \ 
-f '../input.pdf' 

Xin lưu ý rằng tôi cũng đang sử dụng -dFIXEDMEDIA-dPDFFitPage. Bởi vì điều này phù hợp với trang, phần khác của kịch bản của tôi có thể hữu ích để mở rộng nội dung bên trong PDF sau khi thay đổi kích thước (đặc biệt nếu tỷ lệ PDF thay đổi rất nhiều). Và đó là một trong những lý do tôi luôn chạy quy mô sau khi thay đổi kích thước trong kịch bản của tôi (trong chế độ hỗn hợp).

Về vấn đề phân số khi sử dụng Tên giấy, tôi đã xảy ra với tôi trước khi tôi làm tròn các chuyển đổi từ mm/inch thành điểm. Sau khi tôi bắt đầu làm tròn chúng, chúng dường như luôn là thứ cần thiết. Có vẻ kỳ lạ rằng GS sẽ sàn những giá trị đó mặc dù.

Vì vậy, kết luận của tôi là phần khó khăn là tìm một giải pháp hoạt động trên bảng trên các tài liệu khác nhau với các kích thước và định hướng khác nhau. Tôi vẫn không chắc tôi đang sử dụng giải pháp thích hợp. Nhưng bằng cách cho phép người dùng thay đổi Flip Detection và GS Auto-Rotation tôi hy vọng sẽ có một giải pháp cho ít nhất là hầu hết các trường hợp.

Tôi cũng đã xây dựng lại hầu hết mã trong quy trình và rất dễ đọc ngay bây giờ. Có thể hữu ích khi kiểm tra nếu bạn muốn tự động hóa tác vụ như vậy. Cũng hữu ích để chỉ quy mô/thay đổi kích thước tập tin PDF cũng tất nhiên:

https://github.com/tavinus/pdfScale

PS: pdfScale có nguồn gốc từ on this StackOverflow thread.

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