2013-05-20 34 views
0

使用SSJS我已經使用iText附帶的簡單HTML解析器成功創建了一個PDF,但簡單的HTML解析器並不尊重CSS,而且非常有限。我從iText網站下載了XMLWorker類,並嘗試使用它,但是我瞭解如何調用Java包的知識太有限了。我可以找到的所有示例都使用Java並直接引用類,例如。Xpages使用XMLWorker類創建PDF

Document newPDF = new Document();

但在SSJS我們必須使用點符號,例如。

var newPDF:com.itextpdf.text.Document = new com.itextpdf.text.Document();

這 - 我認爲 - 是我絆倒。我的代碼如下所示:

function createLPO2(pReqDoc:NotesDocument) { 

importPackage(com.itextpdf); 
//importPackage(com.itextpdf.tool.xml.XMLWorkerHelper); 
importPackage(java.io); 

var con = facesContext.getExternalContext(); 
var response:com.ibm.xsp.webapp.XspHttpServletResponse = con.getResponse(); 

response.setContentType("application/pdf"); 
response.setHeader("Cache-Control", "no-cache"); 
response.setDateHeader("Expires", -1); 
response.setHeader("Content-Disposition","attachment; filename=\"LPO_" + pReqDoc.getItemValueString("RequisitionNo") + ".pdf\""); 

var newPDF:com.itextpdf.text.Document = new com.itextpdf.text.Document(); 
var writer = com.itextpdf.text.pdf.PdfWriter.getInstance(newPDF,response.getOutputStream()); 
var xmlWorkerHelper = com.itextpdf.tool.xml.XMLWorkerHelper.getInstance(); 

var strHTML = getTestHTML(); //this is the HTML used in the examples on the iText site 

xmlWorkerHelper.parseXHtml(writer, newPDF, new java.io.StringReader(strHTML)); 

newPDF.close(); 
writer.close(); 

facesContext.responseComplete(); 
} 

如果我按照原樣運行此腳本,則會在Domino控制檯上發生腳本錯誤。如果我刪除線路importPackage(com.itextpdf.tool.xml.XMLWorkerHelper);上的註釋,它會給出完全不同的錯誤。我懷疑我必須導入XMLWorkerHelper包,而不僅僅是com.itextpdf包。我想如果我使用7-zip這樣的工具打開jar文件,我可以找出路徑,這是我如何到達com.itextpdf.tool.xml.XMLWorkerHelper

這是正確的嗎?如果是這樣,爲什麼我的腳本失敗?

+0

你得到什麼腳本錯誤? –

+0

你必須導入一個包,而不是一個類:* importPackage(com.itextpdf.tool.xml)* –

+0

謝謝Sven - 我不知道。儘管我一直在使用Notes多年,但我對Java完全陌生。我對客戶端JavaScript有很好的瞭解,並且發現很容易獲得服務器端的JavaScript,但Java仍然是一個謎。 –

回答

1

Rob, 嚴重的是,不要試圖在SSJS中做到這一點。 iText是所有的Java,如果你試圖用不同的語言來破解它,它會讓你感到壓力。創建一個包裝類,該類包含一個方法,該方法接受一個OutputStream以及所需的任何數據(Document,View等)。獲取SSJS中的OutputStream並調用該函數。查找OpenNTF上的XAgent XSnippet和我的博客系列(最後兩篇缺少 - 請關注我)創建PDF。 謹慎的一句話:iText是GPL,因此您也可以使用GPL軟件,購買商業iText許可證,或者尋找替代產品,如Apache PDFBox或Apache FOP。第二個警告:HTML到PDF是皮塔。你可以看看一個商業工具,如從Swing軟件(或改變你的方法)

+0

觀看即將到來的關於NotesIn9上包裝的談話 – stwissel

+0

感謝您的回答。我承認你是對的,但我仍然迷失。我查看了您的博客,並找到了關於XML和XSL的文章:FO和XSLT。我理解這些原則,但是我如何創建一個「需要OutputStream的包裝類」的細節對我來說仍然是一個完全謎。我花了太長時間搜索一個初學者指南,在Xpages中實現Java沒有成功。例如,我發現了很多關於「託管bean」以及如何在「faces-config.xml」中指向它們的東西,但沒有說什麼在nsf中存儲託管bean的位置。我猜「包裝類」是一個託管bean? –

+0

Hi Rob, 要將Java類添加到XPage中,只需在代碼/ Java設計元素中編寫一個代碼(在8.5.3之前,您可以將它放在webcontent/web-inf/src中並將其添加到構建路徑中)。包裝只是一個簡單的Java類,它接受所有需要的參數。遵循[這個例子](http://www.wissel.net/blog/d6plinks/SHWL-8SLCVR)com.notessensei.tools.PDFFormatter是一個包裝類。除了實例化類之外的所有Java都在裏面,所以你的SSJS變得精益而且意味深長 – stwissel