使用 Java Apache PdfBox 在 PDF 模板中生成边框

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

在不久的将来我将开发 PDF 生成服务。这都是关于使用来自请求的数据填充一个简单的模板。 在我的研究过程中,我听说了 Apache PDFBox,目前我正在测试它 - 看起来非常方便,但我有一些恼人的问题 - 当生成 PDF 时,它有这种奇怪的灰色边框。 我做了研究,但没有找到摆脱它们的方法。

我的示例 DataDTO:

@Data
public class DocumentDataDto {
    private int documentNumber;
    private LocalDate date;
    private String creatorFirstName;
    private String creatorLastName;
}

控制器示例:

@RestController
@RequiredArgsConstructor
public class PdfController {
    private final PdfService pdfService;

    @PostMapping(value = "/generatePdf")
    public ResponseEntity<ByteArrayResource> generatePdf(@RequestBody DocumentDataDto data) {
        ByteArrayResource pdf = pdfService.generatePdf(data);

        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=generated.pdf");
        headers.add(HttpHeaders.CONTENT_TYPE, "application/pdf");

        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(pdf.contentLength())
                .body(pdf);
    }
}

样品服务:

@Service
public class PdfService {

    public ByteArrayResource generatePdf(DocumentDataDto data) {
        try {
            ClassPathResource pdfResource = new ClassPathResource("templates/template1.pdf");

            try (InputStream inputStream = pdfResource.getInputStream();
                 PDDocument document = PDDocument.load(inputStream)) {

                PDAcroForm form = document.getDocumentCatalog().getAcroForm();

                if (form != null) {
                    PDField field = form.getField("Text1");
                    if (field != null) {
                        field.setValue(String.valueOf(data.getDocumentNumber()));
                    }

                    field = form.getField("Text2");
                    if (field != null) {
                        field.setValue(String.valueOf(data.getDate()));
                    }

                    field = form.getField("Text3");
                    if (field != null) {
                        field.setValue(data.getCreatorFirstName() + " " + data.getCreatorLastName());
                    }

                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                    document.save(byteArrayOutputStream);

                    return new ByteArrayResource(byteArrayOutputStream.toByteArray());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ByteArrayResource(new byte[0]);
    }
}

*注意:上面的代码只是一个示例 - 我知道应该有一些异常处理而不是返回空字节数组:) *

我的 PDF 模板看起来很简单:

使用 https://www.pdfescape.com 创建

我尝试从 AcroForm 中删除样式,并使其不可见。不幸的是,我的任何一种方法都没有帮助。最终的输出总是这样的:

输出

我必须承认,这是我第一次为PDF创建这样的服务。 如果您有任何建议,请告诉我 - 也许有更直接的方法来实现纯文本填充的 PDF 文件?

非常感谢所有帮助!

java spring templates pdf pdfbox
1个回答
0
投票

您提到“尝试从 AcroForm 中删除样式,并使它们不可见”但您的代码不包含类似的内容。所以只是为了确定一下。你尝试过这样的事情吗?根据您的模板,您实际上可能不需要调用所有这些。

private void removeFieldBorders(PDField field) throws IOException {
    for (PDAnnotationWidget widget : field.getWidgets()) {
        widget.setBorderStyle(null);
        widget.setColor(null);
        widget.setHighlightingMode(PDHighlightingMode.NONE);
        PDAppearanceCharacteristicsDictionary appearance = new PDAppearanceCharacteristicsDictionary(new COSDictionary());
        appearance.setBorderColour(null);
        widget.setAppearanceCharacteristics(appearance);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.