java - 在 itext7 中,如何通过 ColumnRenderer 绘制边框?
解决方案
我自己解决了这个问题。
这是我关于列文档渲染器的代码。
在此代码的 updateCurrentArea 方法中,获取 currentPage 并将画布添加到其中。
并且只是画线。
这是我的代码。
@Override
protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
if (overflowResult != null
&& overflowResult.getAreaBreak() != null
&& overflowResult.getAreaBreak().getType()
!= AreaBreakType.NEXT_AREA) {
nextAreaNumber = 0;
nextHeadAreaNumber = 0;
nextBodyAreaNumber = 0;
}
if (isBody) {
if (
(nextBodyAreaNumber > 0 && nextBodyAreaNumber % columns.length == 0)
) {
super.updateCurrentArea(overflowResult);
}
if (nextBodyAreaNumber == 0 && null != currentArea && !currentArea.isEmptyArea()) {
lastHeaderEmptyHeight = currentArea.getBBox().getHeight();
}
currentAreaNumber = nextAreaNumber + 1;
nextAreaNumber++;
currentBodyAreaNumber = nextBodyAreaNumber + 1;
Rectangle newArea = columns[nextBodyAreaNumber++ % columns.length].clone();
if (currentBodyAreaNumber < 3 && lastHeaderEmptyHeight > 30) {
newArea.setHeight(lastHeaderEmptyHeight - LAYOUT_CONFIG.COLUMN_PADDING * 2);
}
PdfPage currentPage = document.getPdfDocument().getPage(currentPageNumber);
if (currentBodyAreaNumber == 1) {
PdfCanvas horizontalLineCanvas = new PdfCanvas(currentPage);
float horizontalLineStartX = newArea.getX();
float horizontalLineStartY = newArea.getY() + newArea.getHeight() + LAYOUT_CONFIG.COLUMN_PADDING;
float horizontalLineEndX = newArea.getX() + LAYOUT_CONFIG.HEADER_COLUMN_WIDTH;
float horizontalLineEndY = horizontalLineStartY;
horizontalLineCanvas.setLineWidth(0.5F).setStrokeColor(ColorConstants.BLACK)
.moveTo(horizontalLineStartX, horizontalLineStartY)
.lineTo(horizontalLineEndX, horizontalLineEndY).stroke();
}
if (currentBodyAreaNumber % columns.length == 0) {
PdfCanvas verticalLineCanvas = new PdfCanvas(currentPage);
float verticalLineStartX = newArea.getX() - LAYOUT_CONFIG.COLUMN_PADDING;
float verticalLineStartY = newArea.getY() + LAYOUT_CONFIG.COLUMN_PADDING;
float verticalLineEndX = verticalLineStartX;
float verticalLineEndY = verticalLineStartY + newArea.getHeight() - LAYOUT_CONFIG.COLUMN_PADDING * (currentBodyAreaNumber == 2 ? 1 : 2);
verticalLineCanvas.setLineWidth(0.5F).setStrokeColor(ColorConstants.BLACK)
.moveTo(verticalLineStartX, verticalLineStartY)
.lineTo(verticalLineEndX, verticalLineEndY).stroke();
}
return (currentArea = new RootLayoutArea(currentPageNumber, newArea));
} else {
super.updateCurrentArea(overflowResult);
currentAreaNumber = nextAreaNumber + 1;
nextAreaNumber++;
currentHeadAreaNumber = nextHeadAreaNumber + 1;
nextHeadAreaNumber++;
return (currentArea = new RootLayoutArea(currentPageNumber, headerColumn.clone()));
}
}
推荐阅读
- react-native - 使用 React Native 检测时间戳并使其在文本中可点击,就像 youtube 所做的那样
- laravel - 如何删除 Laravel cookie,使其即使在同一个请求中也消失了
- c# - Entity Framework Core:从相关表中获取数据,包括
- c# - 停靠在 winform selenium 实例而不是 cefsharp
- git - 如何将一个 git 功能分支合并到另一个?
- ios - 当我尝试调试时 XCODE 12 崩溃
- ios - 颤振升级后:'!_debugLocked':不正确。- 未处理的异常:在构建期间调用 setState() 或 markNeedsBuild() - dev
- mongodb - 猫鼬中的 FindOneAndUpdate 子文档数组删除文档而不是更新
- sql - 查询雪花中的半结构化字段
- r - R Formattable -> 导出的 .png 和导出的 html 小部件不匹配