iText PdfCopy使文件越来越大

时间:2017-09-18 13:07:45

标签: java arrays itext

我试图将多个字节数组合并到一个PDF并使其正常工作,但是当它应该只替换文件时,它似乎变得越来越大。它似乎也没有正确关闭文件。我不知道我是否错过了合并逻辑中的列表,但这是我认为唯一的地方。

public class MergePDF {

    private static final Logger LOGGER = Logger.getLogger(MergePDF.class);

    private static ByteArrayOutputStream baos = new ByteArrayOutputStream();

    public static byte[] mergePDF (List<byte[]> pdfList) {

        try {
            Document PDFCombo = new Document();
            PdfSmartCopy copyCombo = new PdfSmartCopy(PDFCombo, baos);
            PDFCombo.open();
            PdfReader readInputPdf = null;
            int num_of_pages = 0;
            for (int i = 0; i < pdfList.size(); i++) {
                readInputPdf = new PdfReader(pdfList.get(i));
                num_of_pages = readInputPdf.getNumberOfPages();
                for (int page = 0 ; page < num_of_pages;) {
                    copyCombo.addPage(copyCombo.getImportedPage(readInputPdf, ++page));
                }
            }
            PDFCombo.close();
        } catch (Exception e) {
            LOGGER.error(e);
        }

        return baos.toByteArray();
    }
}

我认为我在这个过程中错过了某种关闭,因为当我稍后保存文件时,它似乎会对大小有所影响,但我查看的PDF并没有添加任何其他页面。

以下是我在将PDF发送给第三方之前将其保存的方法。发送时,它是一个字节数组。

    try {
        FileOutputStream out = new FileOutputStream(outMessage.getDocumentTitle());
        out.write(outMessage.getPayload());
        out.close();
    } catch (FileNotFoundException e) {
        return null;
    } catch (IOException e) {
        return null;
    }       

我被告知在我发送的bytearray中有多个PDF标题和EOF。

1 个答案:

答案 0 :(得分:0)

根据@ mkl的评论,事实证明确实如此:

  

@ mkl的建议结合你提到的“关闭”   问题确实可能表明您没有替换一组字节   通过另一组字节,但事实上,你正在添加一个新的集合   字节到旧的字节集。

这是如何解决问题的:

public class MergePDF {

    private static final Logger LOGGER = Logger.getLogger(MergePDF.class);

    public static byte[] mergePDF (List<byte[]> pdfList) {

        try {
            Document PDFCombo = new Document();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PdfSmartCopy copyCombo = new PdfSmartCopy(PDFCombo, baos);
            PDFCombo.open();
            PdfReader readInputPdf = null;
            int num_of_pages = 0;
            for (int i = 0; i < pdfList.size(); i++) {
                readInputPdf = new PdfReader(pdfList.get(i));
                num_of_pages = readInputPdf.getNumberOfPages();
                for (int page = 0 ; page < num_of_pages;) {
                    copyCombo.addPage(copyCombo.getImportedPage(readInputPdf, ++page));
                }
            }
            PDFCombo.close();
        } catch (Exception e) {
            LOGGER.error(e);
        }

        return baos.toByteArray();
    }
}

现在您可能已经理解为什么教你如何编码的人解释说在大多数情况下使用static变量是一个坏主意。