【问题标题】:Itext5 document not closing properlyItext5 文档未正确关闭
【发布时间】:2019-02-21 10:29:11
【问题描述】:

为了将 pdf 文档缩放为所需的格式,采用以下方法:

 Document document = new Document(MarginsPDFHelper.DIM_PAGE, MarginsPDFHelper.MARGIN_GEN, MarginsPDFHelper.MARGIN_GEN, MarginsPDFHelper.MARGIN_TOP, MarginsPDFHelper.MARGIN_BOT);
    try {
        PdfReader reader = new PdfReader(pdfByte);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        PdfWriter writer = PdfWriter.getInstance(document, outputStream);
        document.open();
        PdfContentByte content = writer.getDirectContent();
        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            document.newPage();
            PdfImportedPage page = writer.getImportedPage(reader, i);
            Rectangle pageSize = reader.getPageSizeWithRotation(i);
            float scaleX = MarginsPDFHelper.DIM_PAGE.getWidth() / pageSize.getWidth();
            float scaleY = MarginsPDFHelper.DIM_PAGE.getHeight() / pageSize.getHeight();
            float scale = Math.min(scaleX, scaleY);
            content.addTemplate(page, scale, 0, 0, scale, 0, 0);
        }
        return outputStream.toByteArray();
    } catch (Exception e) {
        LOGGER.error("Can not scale pdf", e);
    } finally {
        if (document.isOpen()) {
            document.close();
        }

我面临的问题是对象 com.itextpdf.text.Document 在 finally 块中关闭,这样,它似乎没有正确关闭,

我得到以下异常:

Caused by: com.itextpdf.text.exceptions.InvalidPdfException: PDF header signature not found.
at com.itextpdf.text.pdf.PRTokeniser.getHeaderOffset(PRTokeniser.java:227)
at com.itextpdf.text.pdf.PdfReader.getOffsetTokeniser(PdfReader.java:486)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:176)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:250)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:240)
at be.fgov.minfin.taxi.facade.docx.utils.PdfHelper.scalePDF(PdfHelper.java:370)

但是,当我在 try 块中移动 document.close() 时,我不再遇到该异常。

我不明白为什么,因为 finally 块应该总是在 return 语句之前处理?

【问题讨论】:

  • “我不明白为什么,因为 finally 块应该总是在 return 语句之前处理?” - 不。finally 块在执行离开时执行try 块。特别是 return 语句的表达式的计算仍然发生在 inside try 块中,即 before finally 块。
  • 谢谢 mkl,我现在明白了。

标签: java itext try-catch-finally


【解决方案1】:

finally 块总是在 try 块退出时执行。 1

【讨论】:

  • 您可能想在 OP 代码的上下文中解释这意味着什么。我怀疑这句话是否对他有帮助。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2011-11-03
  • 2019-12-20
  • 2011-03-08
相关资源
最近更新 更多