当前位置: 首页 > 知识库问答 >
问题:

PDFBox IO异常:COSStream已关闭,无法读取

尹兴生
2023-03-14
import java.io.FileInputStream;
import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.hssf.usermodel.*;

/**
 * This is a test file for reading and populating a PDF with specific forms
 */
public class JU_TestFile {

    PDPage Stick_Form;
    PDPage IKE_Form;
    PDPage BO_Form;

    /**
     * Constructor.
     */
    public JU_TestFile() throws IOException
    {
        this.BO_Form = (PDPage) PDDocument.load(new File("C:\\Users\\saf\\Desktop\\JavaTest\\BO Pole Form.pdf")).getPage(0);
        this.IKE_Form = (PDPage) PDDocument.load(new File("C:\\Users\\saf\\Desktop\\JavaTest\\IKE Form.pdf")).getPage(0);
        this.Stick_Form = (PDPage) PDDocument.load(new File("C:\\Users\\saf\\Desktop\\JavaTest\\Sticking Form.pdf")).getPage(0);
    }

    public void buildFile(String fileName, String excelSheet) throws IOException {
        // Create a Blank PDF Document and load in JU Excel Spreadsheet
        PDDocument workingDocument = new PDDocument();
        FileInputStream fis = new FileInputStream(new File(excelSheet));

        // Load in the workbook
        HSSFWorkbook JU_XML = new HSSFWorkbook(fis);

        int sheetNumber = 0;
        int rowNumber = 0;
        String cellValue = "Starting Value";

        HSSFSheet currentSheet = JU_XML.getSheetAt(sheetNumber);

        // While we have not reached the 25th row in our current sheet
        while (rowNumber <= 24) {
            // Get the value in the current row, on the 8th column in the xls file
            cellValue = currentSheet.getRow(rowNumber + 6).getCell(7).getStringCellValue();

            // If it has stuff in it, 
            if (cellValue != "") {
                // Check if it has the letters "IKE" and append the IKE form to our PDF
                if (cellValue != "IKE") {
                    workingDocument.importPage(IKE_Form);
                // If it is anything else (other than empty), append the Stick Form to our PDF  
                } else {
                    workingDocument.importPage(Stick_Form);

                }
                // Let's move on to the next row
                rowNumber++;

                // If the next row number is the "26th" row, we know we need to move on to the
                // next sheet, and also reset the rows to the first row of that next sheet
                if (rowNumber == 25) {
                    rowNumber = 0;
                    currentSheet = JU_XML.getSheetAt(++sheetNumber);
                }
            // if the 9th row is empty, we should break out of the loop and save/close our PDF, we are done
            } else {
                break;
            }
        }

        workingDocument.save(fileName);
        workingDocument.close();
    }
}

我做过研究,在运行workingdocument.save(文件名)命令之前,似乎有一个PDDocument正在关闭。我不是很确定如何修复这个,我也有点迷路如何找到一个变通办法。我对我的编程有点生疏,所以任何帮助都将非常感谢!此外,任何关于如何使未来的帖子更多信息的反馈都将是很好的。

提前致谢

共有1个答案

彭霄
2023-03-14

请试试看

PDFMergerUtility merger = new PDFMergerUtility();
PDDocument combine = PDDocument.load(file);
merger.appendDocument(getDocument(), combine);
merger.mergeDocuments();
combine.close();

更新:由于merger.mergedocuments();在最近的API中不推荐使用,请尝试使用以下重载方法使用相同的方法...

merger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());

merger.mergeDocuments(MemoryUsageSetting.setupTempFileOnly());
 类似资料:
  • 本质上,我试图用Java创建一个小工具,从某种用户输入中获取文本,想象一个普通的文本框,并用它创建一个PDF文件。 到目前为止,我用我对pdfbox的基本知识很快地学到了一些东西。 在我的应用程序中,我在另一个带有GUI元素的应用程序中实例化这个类(如下所示),如果我输入文本,比方说在一个文本框中,并且运行这个脚本一次--它运行起来非常好,但是第二次运行它,它就会崩溃,并给我带来这个恼人的错误:

  • 我在我的项目中有下一个代码,它时不时地与

  • 我有一些麻烦得到这个代码工作。目标是将pdf与PD文档对象中加载的pdf合并。我不想使用PdfBox的mergeUtics,因为它暗示要关闭PD文档对象。我有很多数据要处理,我使用循环来处理它。加载和关闭PDF文档将花费太多的时间和资源(也许我错了,但它的感觉)。 以下是我的方法: 错误发生在我试图保存文档时,在第65行。 我收到以下错误消息:

  • 我尝试用apache PDFBox保存PDF文件,但出现错误 java.io.IOException:COSStream已关闭,无法读取。也许它所附的PDDocument已经关闭了? 出什么事了?

  • 我们从运行在云中的docker容器中的pdf生成器中获得间歇性异常。生成器的一部分处理获取SVG文档并将其加载到PDF中。每100ish调用它就会从importPageAsForm(tmpSVGPdf,0)引发以下异常。 我们还没能在本地复制这个问题。 然后我们打开一个PDF流&一个svg代码转换器的输出流。 当我们点击下面的importPageAsForm时,我们会传入临时SVG文档,在该函数中

  • 存储过程工作正常。我已经在SQL导航器中测试过了,每次运行都很好。 这是我得到的异常堆栈: 组织。springframework。jdbc。UncategorizedSQLException:CallableStatementCallback;SQL的未分类SQLException[{call PKG_RPT_STE_DATA.GETCOREREPORTEXTRAS(?,,,,,,,,,,,?)}