在不久的将来我将开发 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 文件?
非常感谢所有帮助!
您提到“尝试从 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);
}
}