当从使用ClassLoader加载源时,Apache Pdfbox拼合失败

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

我在Spring应用程序中遇到pdfbox 2.0.19的奇怪问题。

以下代码用表单输入填充pdf文档。

模板通过pdfIn加载:

  • 使用Spring App外部的路径:可以很好地工作(注释中的此部分)
  • 使用ClassLoader.getResource():将pdf展平时发生异常(请参见下面的异常)

有任何线索吗?

课程代码:

    @Override
    public File generateFeeInvoice(InvoiceData invoiceData) {
        //Load file using ClassLoader
        ClassLoader classLoader = this.getClass().getClassLoader();
        File pdfIn = new File(classLoader.getResource("invoice.pdf").getFile());

        //Load file through filesystem
        //String pathDoc = "~/Documents/invoice.pdf";
        //File pdfIn = Paths.get(pdfInPath).toFile();

        File pdfOut = Files.createTempFile(PDF_OUT_PREFIX, PDF_OUT_SUFFIX).toFile();
        PDDocument pDDocument = PDDocument.load(pdfIn);
        PDAcroForm form = pDDocument.getDocumentCatalog().getAcroForm();

        setFields(form, feeInvoiceData);

        List<PDField> fields = new ArrayList<>(form.getFields());

        //Below code fails when using pdfIn from a resource
        form.flatten(fields, true);

        pDDocument.save(pdfOut);
        pDDocument.close();

        return pdfOut;
    }

    private void setFields(PDAcroForm form, InvoiceData invoiceData) {
        String blackText = BLACK_TEXT;
        String whiteText = WHITE_TEXT;

        setField(form, blackText, FIELD_CLIENT_CODE,
                invoiceData.getClientCode());
    }

    private void setField(PDAcroForm form, String da, String fieldName, String fieldValue) throws IOException {
        PDVariableText field = (PDVariableText) form.getField(fieldName);
        field.setDefaultAppearance(da);
        field.setValue(fieldValue);
    }

Exception stacktrace:

    java.io.IOException: java.util.zip.DataFormatException: invalid block type
        at org.apache.pdfbox.filter.FlateFilter.decode(FlateFilter.java:58)
        at org.apache.pdfbox.filter.Filter.decode(Filter.java:87)
        at org.apache.pdfbox.cos.COSInputStream.create(COSInputStream.java:84)
        at org.apache.pdfbox.cos.COSStream.createInputStream(COSStream.java:246)
        at org.apache.pdfbox.cos.COSStream.createInputStream(COSStream.java:234)
        at org.apache.pdfbox.pdmodel.common.PDStream.createInputStream(PDStream.java:236)
        at org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.<init>(PDTrueTypeFont.java:198)
        at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:89)
        at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:146)
        at org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.validateAndEnsureAcroFormResources(AppearanceGeneratorHelper.java:143)
        at org.apache.pdfbox.pdmodel.interactive.form.AppearanceGeneratorHelper.<init>(AppearanceGeneratorHelper.java:104)
        at org.apache.pdfbox.pdmodel.interactive.form.PDTextField.constructAppearances(PDTextField.java:263)
        at org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm.refreshAppearances(PDAcroForm.java:430)
        at org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm.flatten(PDAcroForm.java:295)
java pdfbox
1个回答
1
投票

感谢Tilman,此异常是由Maven资源过滤引起的,该消息会更改pdf模板。

© www.soinside.com 2019 - 2024. All rights reserved.