2009-06-10 11 views
15

Tôi đang cố gắng, không thành công, để sử dụng Ghostscript để rasterize tệp PDF với nền trong suốt vào tệp PNG có nền trong suốt. Tôi đã tìm kiếm cao và thấp cho các câu hỏi từ những người khác đang cố gắng thực hiện cùng một điều và không có giải pháp nào được đăng, theo như tôi có thể nói xuống đến chỉ định -sDEVICE = pngalpha, đã làm việc với các tệp thử nghiệm của tôi. Tại thời điểm này Tôi thực sự sẽ đánh giá cao bất kỳ lời khuyên hoặc lời khuyên nào một bàn tay có kinh nghiệm hơn có thể cung cấp .Chuyển đổi PDF thành PNG trong suốt với GhostScript

kiểm tra PDF của tôi nằm ở đây: http://www.kolossus.com/files/test.pdf

Có thể là vấn đề là với tập tin này, nhưng tôi nghi ngờ nó. Theo như tôi có thể nói, nó không có nền được chỉ định và khi tôi mở tệp bằng ứng dụng minh bạch như Photoshop hoặc Illustrator, chắc chắn đủ hiển thị với nền trong suốt. Tuy nhiên, khi mở bằng ứng dụng như Adobe Reader, tệp được hiển thị với nền trắng. Tôi tin rằng điều này có liên quan nhiều hơn với ứng dụng hiển thị PDF so với bản PDF - các ứng dụng như Adobe Reader giả sử bạn muốn xem tài liệu được in trông như thế nào và luôn hiển thị canvas trắng phía sau tác phẩm nghệ thuật - nhưng tôi không thể chắc chắn.

Các gs lệnh Tôi đang sử dụng là:

gs -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r72 -sOutputFile=test.png test.pdf 

này tạo ra một PNG mà có điểm ảnh trong suốt bên ngoài của bounding hộp của tác phẩm nghệ thuật trong tập tin, nhưng tất cả các pixel mà bên trong tác phẩm nghệ thuật của hộp giới hạn được rasterized trên nền trắng. Đây là vấn đề đối với tôi, vì tác phẩm nghệ thuật của tôi đã thả bóng và các cạnh chống răng cưa cần được giữ nguyên ở đầu ra cuối cùng và không thể được xử lý sau bằng ImageMagick. Một mẫu đầu ra PNG của tôi ở cùng vị trí với pdf ở trên, với .png ở cuối (stackoverflow sẽ không cho phép tôi bao gồm nhiều url trong bài đăng của tôi).

Điều thú vị là tôi không thấy ảnh hưởng gì khi sử dụng cờ -dBackgroundColor, thậm chí nếu tôi đặt nó thành thứ gì đó không phải màu trắng như -dBackgroundColor = 16 # ff0000. Có lẽ sự hiểu biết của tôi về cú pháp của lá cờ này là sai.

Cũng thú vị, tôi thấy không có tác dụng khi sử dụng -dTextAlphaBits = 4 -digitalAlphaBits = 4 cờ để cố gắng bật tính năng khử răng cưa con pixel. Tôi sẽ cũng đánh giá cao bất kỳ lời khuyên nào về cách bật tính năng chống răng cưa con pixel, đặc biệt là trên văn bản.

Cuối cùng, tôi đang sử dụng GPL Ghostscript 8.64 trên Mac OS 10.5.7 và kết xuất công việc Tôi đang cố thiết lập để tạo hình ảnh PNG trong suốt từ tệp PDF do PrinceXML tạo. Tôi đang gọi Ghostscript trực tiếp cho việc rasterization thay vì sử dụng ImageMagick vì ImageMagick ủy nhiệm cho Ghostscript cho PDF rasterization và tôi sẽ có thể kiểm soát rasterization tốt hơn bằng cách gọi GS trực tiếp.

Cảm ơn sự giúp đỡ của bạn.

-Jon Wolfe

Trả lời

2

Sợ tôi không thể cho bạn biết ghostscript có thể làm gì nhưng tôi có đề xuất.Thử hiển thị tệp PDF của bạn với cả nền đen và nền trắng. Bất kỳ điểm ảnh nào xuất hiện giống nhau trong hai hình ảnh rõ ràng có nghĩa là mờ đục (tức là, alpha == 1.0). Điểm ảnh khác nhau có alpha không khác có thể được tính bằng cách trừ đi pixel nền đen từ pixel nền trắng. Đưa ra hoặc lấy một số độ chính xác, giá trị của bất kỳ thành phần màu đỏ, xanh lá cây hoặc xanh dương nào sẽ là giá trị alpha.

2

Ghostscript chỉ có thể xử lý độ trong suốt nếu lúc xây dựng tùy chọn "transpar" được chọn. Giả sử Ghostscript của bạn là phiên bản phù hợp, bạn có thể thêm thông số trên dòng lệnh:

... -c "0 .setopacityalpha" -f c:/path/to/file/to/be/converted.pdf 

(Bạn có thể sử dụng biến thể cho độ mờ trong phạm vi [0..1]).

Ngoài ra, có bạn đã cố gắng để chuyển đổi .png Ghostscript tạo của bạn (trong trường hợp đó nền thực là màu trắng thay vì trong suốt) để nền trong suốt sử dụng gm convert lệnh ImageMagick của convert hoặc GraphicMagick không? Dưới đây là một ví dụ:

convert -background transparent test.png test_transp.png 

BTW, trong trường hợp Acrobat hoặc AcroReader hiển thị tất cả hình nền trang như trắng: đây là thiết lập ngay cả đối với nền thực sự minh bạch mặc định. Bạn có thể thay đổi nó trong các tùy chọn thiết lập của ứng dụng: IIRC cài đặt nằm bên trong tùy chọn 'Hiển thị trang' và đặt tên là s.th. như 'Hiển thị raster minh bạch'. (Nếu tôi tra cứu chi tiết, nó có thể sẽ không giúp ích được gì nhiều - Adobe tiếp tục thay đổi tất cả các lựa chọn xung quanh trong mỗi bản phát hành mới. Chỉ cần tự mình mò mẫm, bạn sẽ thấy nó ngay bây giờ mà bạn biết nó ở đó.)

18

Tôi chia sẻ kinh nghiệm của bạn với các cờ -dTextAlphaBits=4-dGraphicsAlphaBits=4. Chúng dường như không hoạt động trên tất cả các văn bản. "Sửa lỗi" tôi đưa ra là chỉ hiển thị hình ảnh ở kích thước mong muốn gấp 4 lần và sau đó giảm kích thước hình ảnh xuống. May mắn là ghostscript không có vấn đề gì khi hiển thị các tệp PNG gigapixel.

cập nhật

Ghostscript (lên đến phiên bản 9) cũng dường như để thưởng thức những vấn đề lớn khi vẽ trong suốt PNG với một số điểm ảnh trên 2.500.000 (tức là 10 mb của bộ đệm pixel). Nền trong suốt đột nhiên chuyển sang màu trắng.

Khoan xuống mã nguồn của ghostscript, tôi thấy rằng khi kích thước bộ đệm pixel vượt quá 10 mb, nó chuyển sang một lược đồ phân bổ bộ nhớ khác. Cụ thể hơn, hình ảnh được hiển thị bằng thiết bị image32 thay vì pngalpha. Với cách trình điều khiển pngalpha được triển khai, toàn bộ mục đích biến mất khi gs quyết định không sử dụng pngalpha_fill_rectangle().

May mắn thay, có một công tắc được gọi là -dMaxBitmap=N để định cấu hình tham số này khi chạy. Điều này được đề cập trong một giải pháp cho một lỗi hoàn toàn khác có niên đại từ 1999-01-15, xem http://pages.cs.wisc.edu/~ghost/doc/AFPL/5.50/relnotes/index.htm.

Thêm -dMaxBitmap=2147483647 giải quyết được nhiều sự cố cho tôi. Trên hệ thống 64 bit, con số này có thể cao hơn. Tất nhiên, bản sửa lỗi thực sự sẽ làm lại trình điều khiển pngalpha để nó đặt màu nền thành 0x7f000000 bất kể đường dẫn mã thực tế, nhưng hầu hết các hệ thống đều có đủ ram trên bo mạch để lừa trên hoạt động.

+0

Chỉ muốn cảm ơn câu trả lời này. Tôi đang cố gắng để rasterize một PDF với 'gs 9.02', đó là một lớp phủ của hai PDF với đầy trong suốt (thực hiện với' pdftk'); khi tôi rasterized với '-r 150', tôi chỉ nhận được lớp trên cùng có thể nhìn thấy, trong khi phía dưới là gần như vô hình. Sau khi đọc điều này, tôi đã thử '-dMaxBitmap = 2147483647', tiếc là nó không hoạt động cho tôi - nhưng sau đó tôi bắt đầu giảm độ phân giải, cho đến khi tôi thấy rằng tại' -r80' (đối với trường hợp của tôi), cuối cùng màu sắc được hiển thị đúng - điều đó có thể có nghĩa là nó là cùng một lỗi bộ nhớ. May mắn thay, 'gimp' đã làm việc cho tôi. Chúc mừng! – sdaau

+1

Chỉ muốn nói rằng PNG trong suốt hoạt động tốt cho tôi. Tôi đang sử dụng GhostScript 9.19 trên Windows và 9.06 trên Linux. Tôi đang sử dụng các tùy chọn này: '-q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap = 500000000 -dAlignToPixels = 0 -dGridFitTT = 2 -sDEVICE = pngalpha -dTextAlphaBits = 4 -dGraphicsAlphaBits = 4 -r150'. Tôi không biết liệu có ai trong số họ có tạo ra sự khác biệt nào không, nó chỉ làm việc cho tôi, nên tôi không chơi đùa với nó. – TheStoryCoder