2012-05-04 39 views
6

Tôi sử dụng Ghostscript để chuyển đổi tài liệu PDF sang PCL để in. Gần đây tôi có yêu cầu bổ sung là tất cả các trang phải được xoay sang Chân dung trước khi in. Tôi đã tìm thấy một cách để làm như vậy bằng cách sử dụng Ghostscript với lệnh sau đây và chức năng postscript.Ghostscript rotate pages

"C:\Program Files (x86)\gs\bin\gswin32c.exe" "-dNOPAUSE" "-dNOPROMPT" "-dBATCH" "-sDEVICE=pxlmono" "-Ic:\Program Files (x86)\gs\fonts\;c:\Program Files (x86)\gs\lib\;c:\Program Files (x86)\gs\lib\;" "-r300" "-sOutputFile=C:\EXPORTFILE_e542e04f-5e84-4c8e-9b41-55480cd5ec52.cache" "rotate612x792.ps" "C:\EXPORTFILE_3a5de9da-d9ca-4562-8cb6-10fb8715385a.cache" 

Nội dung rotate612x792.ps

%! Rotate Pages 
<< /Policies << /PageSize 5 >> 
    /PageSize [612 792] 
    /InputAttributes currentpagedevice 
    /InputAttributes get mark exch {1 index /Priority eq not {pop << /PageSize [612 792] >>} if } forall >> 
    >> setpagedevice 

Vấn đề là chức năng này thay thế tất cả các kích cỡ trang với kích cỡ chữ. Tài liệu của tôi đôi khi là hợp pháp hoặc A4. Tôi đã cố gắng sửa đổi chức năng này để thay thế kích thước cảnh quan bằng đối tác chân dung của họ, nhưng không thể sản xuất chức năng postscript. Tôi cần phải được chỉ đúng hướng để tạo ra tương đương postscript của mã giả sau đây.

for(each page) 
{ 
    if(PageSize == [792 612]) 
     PageSize = [612 792]; 
} 

Tôi biết rằng không có Ghostscript cách xoay trang, nhưng nếu tôi có thể làm việc này phù hợp với quy trình của tôi và sẽ không giảm hiệu suất.

Đây là một mẫu của một trong những tập tin pdf của tôi: Sample1.pdf

Trả lời

2

Tôi đã tìm được giải pháp khả thi. Nó không phải là linh hoạt như tôi hy vọng, nhưng nó đạt tất cả các yêu cầu của tôi.

Tập lệnh postscript sau sẽ xoay tài liệu A4, Letter và Legal thành Portrait. Để làm cho nó để làm kích thước trang khác điều chỉnh kích thước tối thiểu và tối đa.

%!PS 
    % Sequence to set up for a single page size, auto fit all pages. 
    % Autorotate A4 Letter and Legal page sizes to Portrait 
    << /Policies << /PageSize 3 >> 
    /InputAttributes currentpagedevice /InputAttributes get %current dict 
    dup { pop 1 index exch undef } forall % remove all page sizes 
    dup 0 << /PageSize [ 595 0 612 99999 ] >> put % [ min-w min-h max-w max-h ] 
    >> setpagedevice 

Tập lệnh postscript này sẽ xoay khổ A4, thư và tài liệu pháp lý thành Landscape. Sự khác biệt duy nhất là các giá trị kích thước trang tối thiểu/tối đa.

%!PS 
    % Sequence to set up for a single page size, auto fit all pages. 
    % Autorotate A4 Letter and Legal page sizes to Landscape 
    << /Policies << /PageSize 3 >> 
    /InputAttributes currentpagedevice /InputAttributes get %current dict 
    dup { pop 1 index exch undef } forall % remove all page sizes 
    dup 0 << /PageSize [ 0 595 99999 612 ] >> put % [ min-w min-h max-w max-h ] 
    >> setpagedevice 

Giải pháp này dựa trên tệp tự động.ps tôi tìm thấy trong mã nguồn cho dự án hylafax. Dự án đó dường như được cấp phép theo BSD.

4

PostScript là một ngôn ngữ lập trình, vì vậy bạn có thể làm được rất nhiều với nó. Những gì bạn cần làm ở đây là xác định lại hành động yêu cầu kích thước trang. Trang kích thước và nội dung riêng biệt trong PostScript, vì vậy bạn cần phải làm 2 việc:

1) Thay đổi theo yêu cầu phương tiện truyền thông từ phong cảnh đến chân dung

2) xoay nội dung của trang

Cách đơn giản nhất cách để làm điều này là xác định lại toán tử 'setpagedevice'. Dưới đây là một ví dụ:

/oldsetpagedevice /setpagedevice load def %% copy original definition 

/setpagedevice { 
    dup /PageSize known {     %% Do we have a page size redefinition ? 
    dup /PageSize get      %% get the array if so 
    aload pop        %% get elements remove array copy 
    gt {         %% is width > height ? 
     dup /PageSize get aload    %% get size array, put content on stack 
     3 1 roll       %% roll stack to put array at back 
     exch        %% swap width and height 
     3 -1 roll       %% bring array back to front of stack 
     astore        %% put swapped elements into array 
     /PageSize exch      %% put key on stack and swap with value 
     2 index        %% copy the original dict 
     3 1 roll       %% move dict to back of stack 
     put         %% put new page size array in dict 
     90 rotate       %% rotate content 90 degrees anti-clockwise 
    } if 
    } if 
    oldsetpagedevice      %% call the original definition 
} bind def 

này kiểm tra những thay đổi cấu hình để xem kích thước trang đang được thay đổi, nếu nó là nó được kích thước mới, và trông thấy nếu chiều rộng> chiều cao (một định nghĩa đơn giản của phong cảnh). Nếu điều đó đúng thì nó sẽ thay đổi yêu cầu bằng cách hoán đổi chiều rộng và chiều cao, sau đó xoay nội dung trang 90 độ.

Bạn có thể sử dụng điều này với Ghostscript bằng cách đặt các nội dung nêu trên trong một tập tin (ví dụ như prolog.ps) và sau đó chạy tập tin đó trước khi công việc của riêng bạn:

gs ...... prolog.ps công việc. ps

Tôi đã thử điều này, nhưng không phải với tệp phong cảnh vì tôi không có một tệp. Cũng lưu ý rằng có thể xây dựng một chương trình PostScript sẽ đánh bại điều này.

+0

tôi đã cố gắng kịch bản này và nó đã không tạo ra một lỗi, nhưng cũng không xoay các trang. Đây là mẫu của tệp pdf đầu vào. [https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28](https://docs.google.com/open?id=0B2LzHaZ9pUynWXc2X0J3M0RvN28) – Zig158

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