Apache PDFBox 分段数字显示不起作用

问题描述 投票:0回答:1

我有一个可填写的 pdf,其中有一个要填写的字段 IFSC 代码。

这是我填写 acroform 的代码

public String generatePreFilledMandateForm(PnachDownloadRequestDto request) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try {
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern(Constants.DATE_FORMAT_DD_MM_YYYY);
            LocalDateTime now = LocalDateTime.now();
            String currentDate = dtf.format(now);
            String currentDateAdded10Years = dtf.format(now.plusYears(10));

            PDDocument pdfDocument = PDDocument.load(new ClassPathResource("templates/IDFCPnachForm.pdf").getInputStream());

            ByteArrayOutputStream byteData = new ByteArrayOutputStream();

            PDAcroForm acroForm = pdfDocument.getDocumentCatalog().getAcroForm();
            setTextField(acroForm,"date",currentDate,true);
            setTextField(acroForm,"rectangleWithBank",request.getBankName().toUpperCase(),false);
            setTextField(acroForm,"rectangleBankAcNumber",request.getAccountNumber(),true);
            setTextField(acroForm,"rectangleIfscMicr",request.getIfscCode(),true);
            setTextField(acroForm,"rectangleAmountWords",MoneyConverterDigitToWordsUtil.convertToWord(request.getAmountInRupees().toString()),false);
            setTextField(acroForm,"rectangleAmount",request.getAmountInRupees().toString() + "/-",false);
            setTextField(acroForm,"rectangleReference1",request.getLoanNo(),false);
            setTextField(acroForm,"rectangleMobileNo",request.getPhoneNo(),false);
            setTextField(acroForm,"rectanglePrimaryNameField",request.getCustomerName(),false);
            setTextField(acroForm,"fromDate",currentDate,true);
            setTextField(acroForm,"toDate",currentDateAdded10Years,true);

            acroForm.flatten();

            pdfDocument.save(byteArrayOutputStream);

            pdfDocument.close();
            String base64EncodedPdf = Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());

            return base64EncodedPdf;
        } catch (Exception e) {
            log.error("Exception in generatePreFilledMandateForm {}",e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

private void setTextField(PDAcroForm acroForm, String fieldName, String value,boolean isCombField) throws IOException {
        if (value != null) {
            List<PDField> fields = acroForm.getFields();
            for (PDField field : fields) {
                if (field.getFullyQualifiedName().equals(fieldName)) {
                    if (isCombField) {
                        ((PDTextField) field).setComb(true);

                    }
                    field.setValue(value);
                }
            }
        }
    }

但是填充和压平后。响应 pdf 没有适当的梳结构。 PFB 响应。

还有, 我正在使用 Apache PDFBox 2.0.29。

预期形式:

java pdf pdfbox fillable
1个回答
0
投票

这是我使用的 pdf 的问题。拼合 pdf,然后使用 adobe acrobat 重新创建表单字段使其工作。

此外,对 setTextField 方法进行了较小的优化(由 @TilmanHausherr 建议)

private void setTextField(PDAcroForm acroForm, String fieldName, String value,boolean isCombField) throws IOException {
    if (value != null) {
        acroForm.getField(fieldName).setValue(value);
        if(isCombField) {
            ((PDTextField)acroForm.getField(fieldName)).setComb(true);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.