Когда строка моих отчетов становится слишком длинной для одной страницы, она продолжается на следующей странице, однако граница обрезается, как показано на этом изображении.
Любые идеи?
Я использую JRPdfExporter
для экспорта отчетов в PDF.
ОБНОВЛЕНО :
DynamicReport dynamicReport;
...
fastReportBuilder.setPageSizeAndOrientation(Page.Page_A4_Landscape());
fastReportBuilder.setUseFullPageWidth(true);
//margin 50
fastReportBuilder.setMargins(MARGIN, MARGIN, MARGIN, MARGIN);
fastReportBuilder.setDefaultStyles(getTitleStyle(), null, getColumnHeaderStyle(), getColumnDetailsStyle());
private Style getColumnHeaderStyle() {
Style hStyle = new Style();
hStyle.setBorder(Border.THIN());
hStyle.setTransparent(false);
hStyle.setBackgroundColor(new Color(0, 142, 175));
hStyle.setTextColor(Color.WHITE);
hStyle.setHorizontalAlign(HorizontalAlign.CENTER);
hStyle.setVerticalAlign(VerticalAlign.MIDDLE);
hStyle.setFont(new Font(10, MY_FONT, false));
return hStyle;
}
private Style getColumnDetailsStyle() {
Style cStyle = new Style();
cStyle.setBorder(Border.THIN());
cStyle.setFont(new Font(10, MY_FONT, false));
cStyle.setVerticalAlign(VerticalAlign.TOP);
return cStyle;
}
1 ответ
Граничные артефакты в JasperReport PDF Разработаны с помощью iReport 5.1. 0 подсказал мне идею.
В итоге я расширил JRPdfExporter. По какой-то причине, когда данные обрезаются и продолжаются на следующей странице, высота и нижняя граница рамки ячейки, где данные обрезаются, не совпадают с соседней ячейкой слева. Чтобы исправить это, я сохраняю предыдущие данные о границах ячеек, поэтому, когда они достигают несовпадающих данных о границах ячеек, их можно исправить.
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfContentByte;
import net.sf.jasperreports.engine.JRLineBox;
import net.sf.jasperreports.engine.JRPrintElement;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import java.awt.*;
public class CustomPdfExporter extends JRPdfExporter {
private float previousTop;
private float previousHeight;
private float prevY1;
private float prevY2;
private static final float FLOAT_ZERO = 0F;
protected void exportBox(JRLineBox box, JRPrintElement element) {
if (!isBoxVisible(box)) return;
pdfContentByte.setLineCap(PdfContentByte.LINE_CAP_PROJECTING_SQUARE);
float x1 = element.getX() + getOffsetX();
float y1 = jasperPrint.getPageHeight() - element.getY() - getOffsetY();
float x2 = element.getX() + getOffsetX() + element.getWidth();
float y2 = jasperPrint.getPageHeight() - element.getY() - getOffsetY() - element.getHeight();
Rectangle r = new Rectangle(x1, y2, x2, y1);
if (previousTop == r.getTop() && previousHeight != r.getHeight()) {
r.setBottom(prevY2);
} else {
prevY2 = y2;
prevY1 = y1;
previousHeight = r.getHeight();
previousTop = r.getTop();
}
int borderFlag = 0;
float lineWidth = 0;
Color lineColor = null;
if (box.getLeftPen().getLineWidth().floatValue() > FLOAT_ZERO) {
borderFlag |= Rectangle.LEFT;
lineWidth = box.getLeftPen().getLineWidth().floatValue();
lineColor = box.getLeftPen().getLineColor();
}
if (box.getTopPen().getLineWidth().floatValue() > FLOAT_ZERO) {
borderFlag |= Rectangle.TOP;
if (lineWidth == 0) {
lineWidth = box.getTopPen().getLineWidth().floatValue();
lineColor = box.getTopPen().getLineColor();
}
}
if (box.getRightPen().getLineWidth().floatValue() > FLOAT_ZERO) {
borderFlag |= Rectangle.RIGHT;
if (lineWidth == 0) {
lineWidth = box.getRightPen().getLineWidth().floatValue();
lineColor = box.getRightPen().getLineColor();
}
}
if (box.getBottomPen().getLineWidth().floatValue() > FLOAT_ZERO) {
borderFlag |= Rectangle.BOTTOM;
if (lineWidth == 0) {
lineWidth = box.getBottomPen().getLineWidth().floatValue();
lineColor = box.getBottomPen().getLineColor();
}
}
r.setBorder(borderFlag);
r.setBorderColor(lineColor);
r.setBorderWidth(lineWidth);
pdfContentByte.rectangle(r);
pdfContentByte.stroke();
pdfContentByte.setLineDash(FLOAT_ZERO);
pdfContentByte.setLineCap(PdfContentByte.LINE_CAP_ROUND);
}
private boolean isBoxVisible(JRLineBox box) {
return box.getLeftPen().getLineWidth().floatValue() > FLOAT_ZERO
|| box.getTopPen().getLineWidth().floatValue() > FLOAT_ZERO
|| box.getRightPen().getLineWidth().floatValue() > FLOAT_ZERO
|| box.getBottomPen().getLineWidth().floatValue() > FLOAT_ZERO
;
}
}
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.