Когда строка моих отчетов становится слишком длинной для одной страницы, она продолжается на следующей странице, однако граница обрезается, как показано на этом изображении.

Любые идеи?

Я использую JRPdfExporter для экспорта отчетов в PDF.

enter image description here

ОБНОВЛЕНО :

        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;
    }
0
villager 20 Авг 2014 в 08:15

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
                ;
    }
}
0
Community 23 Май 2017 в 15:12