Untitled

 avatar
unknown
plain_text
8 months ago
5.9 kB
3
Indexable
private void generateDvirDocument(DvirEntity dvir) throws IOException {
        try {

            InputStream resourceStream = getClass().getClassLoader().getResourceAsStream(dvirProperties.getPdfTemplate());
            PdfDocument pdfDoc = new PdfDocument(new PdfReader(resourceStream), new PdfWriter("output.pdf"));
            PdfAcroForm acroForm = PdfAcroForm.getAcroForm(pdfDoc, true);

            PdfPage page = pdfDoc.getFirstPage();
            PdfCanvas canvas = new PdfCanvas(page);
            PdfFont font = PdfFontFactory.createFont();

            var truckDvirEffects = dvirDefectRepository.findAllByType(DvirDefectType.TRUCK_DEFECT);
            var trailerDvirEffects = dvirDefectRepository.findAllByType(DvirDefectType.TRAILER_DEFECT);

            LocalDateTime dateTime = LocalDateTime.ofInstant(dvir.getDate(), ZoneId.systemDefault());
            var formatedDateTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy dd MMMM  HH:mm"));

            createText(canvas, font, 88, 1305f, formatedDateTime);
            createText(canvas, font, 212, 1275f , String.valueOf(dvir.getTruck().getId()));

            createDvirEffectCheckboxes(pdfDoc, acroForm, canvas, 38f, 1220f, truckDvirEffects);
            createDvirEffectCheckboxes(pdfDoc, acroForm, canvas, 38f, 740f, trailerDvirEffects);
            markCheckboxes(acroForm, dvir.getDefects());

            List<String> trailerIds = dvir.getTrailers().stream()
                    .map(trailer -> String.valueOf(trailer.getId()))
                    .collect(Collectors.toList());
            String trailerIdsString = String.join(",", trailerIds);

            createText(canvas, font, 186, 792, trailerIdsString);
            createText(canvas, font, 110, 584, dvir.getComment());
            createDefaultEnumCheckboxes(pdfDoc, canvas, acroForm);

            acroForm.getField(dvir.getStatus().getSlug()).setValue("On");

            ImageData imageData = ImageDataFactory.create(dvir.getDriverSignature());
            imageData.setHeight(30);
            imageData.setWidth(120);

            canvas.addImageAt(imageData, 890, 510, false);

            pdfDoc.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void createDefaultEnumCheckboxes(PdfDocument pdfDoc, PdfCanvas canvas, PdfAcroForm acroForm) throws IOException {
        PdfButtonFormField conditionCheckbox = createCheckBox(pdfDoc, new Rectangle(40, 517, 18, 18),
                "CONDITION OF THE ABOVE VEHICLES IS STATISFACTORY", "NO_DEFECTS", "Off", 16, canvas);
        PdfButtonFormField correctedCheckbox = createCheckBox(pdfDoc, new Rectangle(40, 469, 18, 18),
                "ABOVE DEFECTS CORRECTED", "ABOVE_DEFECTS_CORRECTED", "Off", 16, canvas);
        PdfButtonFormField needCorrect = createCheckBox(pdfDoc, new Rectangle(40, 422, 18, 18),
                "ABOVE DEFECTS NEED NOT BE CORRECTED FOR SAFE OPERATION OF VEHICLE", "ABOVE_DEFECTS_NEED_TO_BE_CORRECTED", "Off", 16,
                canvas);

        acroForm.addField(conditionCheckbox);
        acroForm.addField(correctedCheckbox);
        acroForm.addField(needCorrect);
    }

    private void createText(PdfCanvas canvas, PdfFont font, float textX, float textY, String text) {
        canvas.beginText()
                .setFontAndSize(font, 14)
                .moveText(textX, textY)
                .showText(text)
                .endText();

    }

    private void markCheckboxes(PdfAcroForm acroForm, List<DvirDefectEntity> defectList) {
        defectList.forEach(defect -> {
            acroForm.getField(defect.getSlug()).setValue("On");
        });

    }

    private void createDvirEffectCheckboxes(PdfDocument pdfDoc, PdfAcroForm acroForm, PdfCanvas canvas,
                                            float startX, float startY, List<DvirDefectEntity> dvirDefects) throws IOException {
        int chunkSize = Math.max(dvirDefects.size() / 3, 1);

        for (int col = 0; col < 3; col++) {
            int fromIndex = col * chunkSize;
            int toIndex = Math.min(fromIndex + chunkSize, dvirDefects.size());
            List<DvirDefectEntity> sublist = dvirDefects.subList(fromIndex, toIndex);
            float x = startX + (col * 300);
            createCheckboxes(pdfDoc, acroForm, canvas, sublist, x, startY, 30f);
        }
    }


    private void createCheckboxes(PdfDocument pdfDoc, PdfAcroForm acroForm, PdfCanvas canvas,
                                  List<DvirDefectEntity> sublist, float startX, float startY, float offsetY) throws IOException {

        for (int i = 0; i < sublist.size(); i++) {
            var dvirObj = sublist.get(i);
            float x = startX;
            float y = startY - (i * offsetY);

            Rectangle checkboxRectangle = new Rectangle(x, y, 18, 18);
            PdfButtonFormField checkbox = createCheckBox(pdfDoc, checkboxRectangle, dvirObj.getName(), dvirObj.getSlug(),
                    "Off", 14, canvas);
            acroForm.addField(checkbox);
        }
    }


    private PdfButtonFormField createCheckBox(PdfDocument pdfDoc, Rectangle rectangle, String name, String slug,
                                              String value, Integer fontSize, PdfCanvas canvas) throws IOException {

        PdfButtonFormField checkbox = PdfFormField.createCheckBox(pdfDoc, rectangle, slug, value);

        checkbox.setBorderColor(new DeviceGray(0.75f));
        checkbox.setCheckType(PdfFormField.TYPE_CHECK);
        checkbox.regenerateField();

        float textX = rectangle.getX() + rectangle.getWidth() + 5;
        float textY = rectangle.getY() + rectangle.getWidth() - 14;
        PdfFont font = PdfFontFactory.createFont();

        canvas.beginText()
                .setFontAndSize(font, fontSize)
                .moveText(textX, textY)
                .showText(name)
                .endText();

        return checkbox;
    }
Editor is loading...
Leave a Comment