2014-02-12 26 views
0

我正在使用iText 2.1.7,並且正在嘗試爲我的文檔繪製一個簡單的矩形。下面的代碼塊按預期工作,繪製一個矩形,覆蓋整個頁面,不包括頁邊距。iText:PdfContentByte.rectangle(Rectangle)不像預期的那樣行爲

Document document = new Document(PageSize.A4.rotate()); 
PdfWriter writer = PdfWriter.getInstance(document, outputStream); 
document.open(); 
PdfContentByte canvas = writer.getDirectContent(); 
Rectangle pageDimensions = writer.getPageSize(); 

canvas.saveState(); 
canvas.rectangle(
     pageDimensions.getLeft(marginLeft), 
     pageDimensions.getBottom(marginBottom), 
     pageDimensions.getRight(marginRight), 
     pageDimensions.getTop(marginTop)); 
canvas.setColorStroke(Color.BLACK); 
canvas.stroke(); 
canvas.restoreState(); 

document.close(); 

但是,如果我改變的小幅這樣我定義PdfContentByte外的矩形,帆布代碼塊,然後我的代碼生成一個空白頁。

... 
Rectangle marginBox = new Rectangle(
     pageDimensions.getLeft(marginLeft), 
     pageDimensions.getBottom(marginBottom), 
     pageDimensions.getRight(marginRight), 
     pageDimensions.getTop(marginTop)); 
canvas.saveState(); 
canvas.rectangle(marginBox); 
canvas.setColorStroke(Color.BLACK); 
canvas.stroke(); 
canvas.restoreState(); 
... 

這是PdfContentByte.rectangle(Rectangle)方法的使用目的?理想情況下,我想定義Rectangles(以及它們的邊框顏色和寬度),以與directContent緊密結合的方式進行定義,並且可以在稍後將它們添加到directContent中。

回答

2

首先,我覺得有必要說你使用的是不應該使用的iText版本。有關更多信息,請參閱http://itextpdf.com/salesfaq

至於你的問題,你是在做一些錯誤的假設。例如:當您使用Rectangle對象時,使用stroke()運算符沒有意義,因爲採用Rectangle作爲參數的rectangle()方法會撫摸路徑(而不是採用4 float值的方法)。

// This draws and strokes the path: 
canvas.rectangle(marginBox); 
// There is no path to stroke anymore: 
canvas.setColorStroke(Color.BLACK); 
canvas.stroke(); 

rectangle()方法,需要一個Rectangle如果沒有邊框和無邊框寬度已爲Rectangle定義什麼都不會做。換句話說,你需要的是這樣的:

Rectangle rect = new Rectangle(36, 36, 559, 806); 
rect.setBorder(Rectangle.BOX); 
rect.setBorderWidth(2); 
canvas.rectangle(rect); 

如果沒有邊界的定義,也沒有爲邊框的寬度大於0,假設沒有邊界。

+0

謝謝Lowagie先生,感謝您花時間回答我的問題。那'rect.setBorder(Rectangle.BOX);'行是我試圖讓它工作的所有東西中缺少的組件。 – Set