2014-02-12 5 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

Благодарю вас, мистер Лоуджи, я ценю, что вы нашли время, чтобы ответить на мой вопрос. Это 'rect.setBorder (Rectangle.BOX);' строка - недостающий компонент из всего, что я пытался заставить эту работу работать. – Set

Смежные вопросы