2015-01-09 218 views
1

迄今爲止,此工作正常,但如何爲生成的圖像添加透明度?pdfBox將pdf轉換爲透明圖像

for (img <- 0 until f.length) { 
    val inputPdf = PDDocument.load(f(img).getPath).getDocumentCatalog.getAllPages.get(0).asInstanceOf[PDPage] 

    val outputfile = new File(f(img).getName + ".png") 
    ImageIO.write(inputPdf.convertToImage(), "png", outputfile) 
} 

問候 託斯滕

+0

您實際上會將PDF頁面渲染爲位圖圖像。但是PDF頁面被指定爲在所有繪製的東西背後有一個白色背景(當談到透明度時,規範將頁面**概括爲一個透明度組,該透明度組由純粹放置在頁面上的對象組成,白色和完全不透明**)。因此,繪製整個頁面時,結果沒有任何透明度。 – mkl

+0

@mkl PDF自1.4以來似乎支持透明度。 – NiematojakTomasz

+1

@NiematojakTomasz是的,它在內部是在頁面上創建對象時完成的,否則上面「透明組」的概念將毫無意義。但預計將在白色背景上繪製一個作爲最終對象的頁面。 (雖然這只是規範,但在您自己的渲染器中,您可以使用您選擇的背景,包括完全透明的背景,但這就是爲什麼當您被要求繪製時不應該期望現有PDF庫返回透明圖像的原因一頁。) – mkl

回答

2

嘗試使用convertToImage(type, resolution)TYPE_INT_ARGB

可以偷看convertToImage代碼:http://codenav.org/code.html?project=/org/apache/pdfbox/pdfbox/1.8.4&path=/Source%20Packages/org.apache.pdfbox.pdmodel/PDPage.java(1.8.4)或https://svn.apache.org/repos/asf/pdfbox/tags/1.8.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java(1.8.8電流)

public BufferedImage convertToImage() throws IOException 
{ 
    //note we are doing twice as many pixels because 
    //the default size is not really good resolution, 
    //so create an image that is twice the size 
    //and let the client scale it down. 
    return convertToImage(8, 2 * DEFAULT_USER_SPACE_UNIT_DPI); 
} 

你可能想使用:

convertToImage(BufferedImage.TYPE_INT_ARGB, 2 * DEFAULT_USER_SPACE_UNIT_DPI); 

注意:PDF支持透明物體。但是,正如@mkl所述,它與pdf參考不兼容。

+0

這可能確實有幫助;畢竟'convertToImage(int,int)'重載使用'graphics.setBackground(TRANSPARENT_WHITE)'初始化背景,後面是整個圖像區域的'clearRect'。 – mkl

+0

解決了我的問題。非常感謝。 – wapgui