2011-09-30 48 views
4

目前我使用的Ghostscript 轉換彩色PDF的灰度PDF的。現在我正在尋找可靠的.NET 商業或非商業組件/庫 ghostscript替換。我搜索了一下,但沒有找到任何能夠輕鬆完成或完成這些任務的組件/庫。.NET組件灰度轉換

編輯#1:

Ghostscript的,爲什麼不爲我工作:

我實現Ghostscript的,我使用它的原生API的。問題在於Ghostscript在單個進程中不支持解釋器的多個實例。 -dJOBSERVER模式也不適用於我,因爲我不收集所有工作,並且他們一次處理它們。發生Ghostscript正在處理大型工作需要大約20分鐘,同時我得到一些小型工作,必須儘快處理,不能等待20分鐘。其他問題是,Ghostscript頁面處理的事件不容易捕捉。我爲ghostscript stdout消息編寫了一個解析器,我可以讀出處理過的頁碼,但是當它作爲ghostscript爲處理的頁面組推送消息處理時,不會爲每個頁面讀取。有幾個問題比較多使用Ghostscript像生產壞的PDF文件,複製字體問題.....

你可以找到更多的一個問題,我與ghostscript的位置:Ghostscript - PS to PDF - Inverted images problem

-

一年更新後:

一年之前,去我問過這個問題。後來我使用iTextSharp製作了自己的解決方案。

你可以看看PDF轉換爲灰度這裏的解決方案:在大多數情況下

http://habjan.blogspot.com/2013/09/proof-of-concept-converting-pdf-files.html

https://itextsharpextended.codeplex.com/

爲我工作:)

+2

http://blog.stackoverflow.com/2010/11/qa-is-hard-lets-go-shopping/ –

+0

我改變了商業或非商業問題。現在好嗎?我那個問題是在正確的地方。 – HABJAN

+0

你能告訴我們爲什麼ghostscript不再可行嗎? –

回答

0

經過大量調查,我發現約ABCpdfWebsupergoo。它們的組件可以通過簡單地調用Recolor方法輕鬆地將任何PDF頁面轉換爲灰度。該組件是商業的。

+0

xfinium-pdf也是用於重新着色的最佳和簡單的一種。(http://www.xfiniumpdf.com/xfinium-pdf-wpf-silverlight-winrt/xfinium-pdf-features。html) – Jay

2

這不是一個.net庫,而是一個潛在的解決方法。您可以安裝能夠編寫PDF文件的虛擬打印機。我建議使用CutePDF,因爲它是免費的,易於使用,並且將大量文件格式「打印」爲PDF格式。你可以用CutePDF做幾乎所有的事情,你可以用普通的打印機來完成,包括打印到灰度。

安裝在虛擬打印機後,您可以使用C#來「打印」灰度版本。

編輯:我只記得免費版本不沉默。一旦你打印到CutePDF打印機,它會要求你'另存爲'。他們確實有可用於購買的SDK,但我不能說它是否能夠幫助您轉換爲灰度。

+0

感謝您的回答,我已經考慮過這種選擇,並且這裏的限制是您不能同時轉換多個pdf文檔。無論如何,+1爲您提供幫助。謝謝 – HABJAN

1

如果一個商業產品,是你有效的選項,讓我推薦Amyuni PDF Creator .Net。通過使用它,您將能夠枚舉頁面內的所有項目並相應地更改其顏色,圖像也可以設置爲灰度。 平時免責聲明使用Amyuni PDF創建的ActiveX應用

示例代碼,.NET版本是相似的:

 pdfdoc.ReportState = ReportStateConstants.acReportStateDesign; 
     object[] page_items = (object[])pdfdoc.get_ObjectAttribute("Pages[1]", "Objects"); 

     string[] color_attributes = new string[] { "TextColor", "BackColor", "BorderColor", "StrokeColor" }; 
     foreach (acObject page_item in page_items) 
     { 
      object _type = page_item["ObjectType"]; 
      if ((ACPDFCREACTIVEX.ObjectTypeConstants)_type == ACPDFCREACTIVEX.ObjectTypeConstants.acObjectTypePicture) 
      { 
       page_item["GrayScale"] = true; 
      } 
      else 
       foreach (string attr_name in color_attributes) 
       { 
        try 
        { 
         Color color = System.Drawing.ColorTranslator.FromWin32((int)page_item[attr_name]); 
         int grayColor = (int)(0.3 * color.R + 0.59 * color.G + 0.11 * color.B); 
         int newColorRef = System.Drawing.ColorTranslator.ToWin32(Color.FromArgb(grayColor, grayColor, grayColor)); 
         page_item[attr_name] = newColorRef; 
        } 
        catch { } //not all items have all kinds of color attributes 
       } 
     } 
+0

我看到了Amyuni PDF Creator,我找不到方便將項目轉換爲灰度的方法。無論如何,感謝您的建議。 – HABJAN

0

iTextPdf好的產品,用於創建/管理PDF它已得到商業和免費版本。

看看aspose.pdf for .net它提供了以下功能和更多。從PDF文檔

  • 添加和刪除水印
  • 設置頁邊距,大小,方向,過渡類型,縮放係數和PDF文檔
  • 的外觀..

而且here是一個列表的開源PDF庫。

+0

嗨,iText是Java庫。在aspose.pdf中我找不到任何顏色轉換功能。謝謝。 – HABJAN

3

不是一個答案,但我認爲你快速解僱Ghostscript。

您是否知道GhostScript API(用於進程內Ghostscript)?或者-dJOBSERVER模式可以將一系列PS命令傳送到其標準中?

但是,它仍然不會讓你的回調,但它仍然不是多線程。


如前所述,iText的可能做到這一點,但它會通過所有的內容,尋找非灰度色彩空間圖像行走,在一個特定空間的方式將它們轉換的問題。

您還必須替換可能找到的任何圖像中的像素數據。

好消息是,iText [Sharp]能夠在多個線程中運行,前提是每個線程一次使用每個文檔。

我懷疑建議的商業圖書館也是這種情況,這並不是一件好事。


然後一道光照在我頭上......畫成灰色。

混合模式和透明度組!

取出所有當前頁面內容,並將其粘貼到一個透明組中,該組與一個覆蓋該頁面的純黑色矩形進行混合。我認爲alpha混合模式甚至是光明的......讓我們看看這裏。

是的PDF參考部分11.6.5.2「軟面膜字典」。你會想要一個「光度」組。

現在,壞消息。如果您在切換到灰度級的目標是爲了節省空間,這將完全失敗。它實際上會使每個文件稍大一點,比如每個頁面有100個字節。

使PDF更好的軟件也是相當熱門的東西。你的表弟的本科生渲染項目不需要申請。這是高級圖形的東西,Common PDF文件很少使用,所以最後要實施的東西。

所以......對於每一個原始頁面

  1. 創建一個新的頁面。

  2. 用黑色背景覆蓋它。

  3. 用白色矩形覆蓋它(弄錯了更早)在使用軟掩模詞典設置爲原始頁面的內容的亮度一個透明度組(在X對象格式現在藏)。

因爲這是您自己的所有代碼,您將有充足的機會在每個頁面的開頭或結尾處執行任何您想要執行的操作。

通過golly,這足夠瘋狂的工作!它確實需要一些PDF-Fu,但幾乎不如「在逐步瀏覽文檔時以各種方式轉換每個顏色空間和圖像」。更深的知識,更少的代碼編寫。

+0

嗨,我知道Ghostscript API,問題在於你可以初始化每個應用程序實例只有一個ghostscript實例。 JOBSERVER模式也不適用於我,因爲我必須在他們來到時處理作業。所以,雖然我正在處理需要20分鐘的大型工作,但同時我可以獲得3個更多的工作,必須等待,直到第一個工作完成。使用iTextSharp遍歷PDF並將內容和圖像轉換爲灰度很複雜。透明度,陰影和顏色混合可能存在很多問題。 – HABJAN

+0

關於你最後的建議,我不知道打印機是否會識別PDF頁面爲灰度,如果我使用建議的邏輯。 – HABJAN

+0

+1這是非常有創意的,它應該工作。 – yms

1

在去年之前,我問了這個問題。後來我使用iTextSharp製作了自己的解決方案。

你可以看看PDF轉換爲灰度這裏的解決方案:https://itextsharpextended.codeplex.com/

+0

我看到了你的解決方案,對於「很多情況」(我不會說大多數情況下)聽起來很好,這是一個很好的起點。但是,這個解決方案在許多情況下都不起作用:彩色光柵圖像(特別是帶有自定義調色板的圖像),使用非標準色彩空間的PDF圖紙,PDF註釋,PDF XForms,PDF圖案等。 – yms