COSStream 已关闭,无法读取.也许它的封闭 PDDocument 已关闭? [英] COSStream has been closed and cannot be read. Perhaps its enclosing PDDocument has been closed?

查看:104
本文介绍了COSStream 已关闭,无法读取.也许它的封闭 PDDocument 已关闭?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

本质上,我试图用 Java 创建一个小工具,我从某种用户输入中获取文本,考虑一个普通的文本框,然后用它创建一个 PDF 文件.

Essentially, I am attempting to create a small tool in Java where I take the text from some kind of user input, think of an ordinary text box, and create a PDF file with it.

到目前为止,我已经用我对 PDFBox 的准系统知识快速地抓取了一些东西.

So far, I managed to scrape something really quickly with my barebones knowledge of PDFBox.

在我的应用程序中,我正在另一个具有 GUI 元素的类中实例化此类(如下所示的类),如果我输入文本,则在一个文本框中,然后运行此 PDFLetter 脚本一次- 它就像一个魅力,但第二次运行它,它崩溃并给我这个恼人的错误:

In my application, I am instantiating this class(the one shown below) in another one with GUI elements and if I input text, in let's say a text box, and running this PDFLetter script once - it works like a charm but running it a second time, it crashes and gives me this annoying error:

COSStream 已关闭,无法读取.也许它封闭PDDocument 已关闭?

COSStream has been closed and cannot be read. Perhaps it's enclosing PDDocument has been closed?

我真的没有看到可以在我的代码中触发此错误的任何方式.我认为这与我基本的跳转到下一页"解决方案有关,但它在当前状态下有效,所以我不知道该相信什么了.

I do not really see any way that I could trigger this error in my code. I thought it had something to do with my rudimentary 'jump to next page' solution but it works in its current state, so I do not know what to believe anymore.

我实例化类的方式,如果你需要知道,是这样的:

The way I am instantiating the class, in case you need to know, is like this:

PDFLetter.PDFLetterGenerate(textInput.getValue().toString());   

另外,我认为一定是垃圾收集的某种问题引发了这个问题,但我不再认为是这种情况.

Additionally, I thought it had to be some kind of a problem with garbage collection that triggered the problem but I no longer think that this is the case.

public class PDFLetter {
    private static final int PAGE_MARGIN = 80;

    static float TABLE_HEIGHT;  

    static Boolean newPage = false;

public static String text = // null;
        "Ding Dong ding dong Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et "
        + "Imperdiet dui accumsan sit amet. Risus in hendrerit gravida rutrum quisque non tellus orci ac.";

static List<String> textList = new ArrayList<String>();

PDDocument document = new PDDocument();
static PDPage main_page = new PDPage();
static PDPage new_page = new PDPage(); 

static File file = new File("C:/PDFTests/temp.pdf"); 

public void PDFLetterGenerate (String args) throws Exception {
    text = args;
    text = text.replace("\n", "").replace("\r", "");

    if(file.exists()) file.delete();
    file.createNewFile();
    //Creating PDF document object 
    PDDocument document = new PDDocument();       
    document.addPage(main_page);  
    mainBody(document, main_page);      
    document.addPage(new_page);                          
    if(!newPage) document.removePage(new_page);

    document.save(file);
    document.close(); 
}

public static void mainBody(PDDocument doc, PDPage page) throws Exception { 
        final float width = page.getMediaBox().getWidth()-(2*PAGE_MARGIN);
        int fontSize = 11;
        float leading = 1.5f * fontSize;
        final float max = 256;
        PDFont pdfFont = PDType1Font.HELVETICA;

        @SuppressWarnings("deprecation")
        PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true);

        int lastSpace = -1;
        while (text.length() > 0){
            int spaceIndex = text.indexOf(' ', lastSpace + 1);
            if (spaceIndex < 0) spaceIndex = text.length();
            String subString = text.substring(0, spaceIndex);
            float size = fontSize * pdfFont.getStringWidth(subString) / 1000;

            if (size > width){
                if (lastSpace < 0) lastSpace = spaceIndex;
                subString = text.substring(0, lastSpace);
                textList.add(subString);
                text = text.substring(lastSpace).trim();
                lastSpace = -1;
            }

            else if (spaceIndex == text.length()){
                textList.add(text);
                text = "";
            }

            else{
                lastSpace = spaceIndex;
            }
        }

        contentStream.beginText();
        contentStream.setFont(pdfFont, fontSize);
        contentStream.newLineAtOffset(PAGE_MARGIN, TABLE_HEIGHT);


        @SuppressWarnings("deprecation")
        PDPageContentStream newStream = new PDPageContentStream(doc, new_page, true, true);

        int nextPage_i = 0;

        for (int i=0; i<textList.size(); i++)//String line: textList){
            System.out.println("HEIGHT: "+ TABLE_HEIGHT);
            nextPage_i = i;
            String line = textList.get(i);
            float charSpacing = 0;

            if (line.length() > 1){         
                float size = fontSize * pdfFont.getStringWidth(line) / 1000;
                float free = width - size;
                if (free > 0){
                    charSpacing = free / (line.length() - 1);
                }
                TABLE_HEIGHT = TABLE_HEIGHT - 10;
            }

            contentStream.setCharacterSpacing(charSpacing); 
            contentStream.showText(line);
            contentStream.newLineAtOffset(0, -leading);

            if(TABLE_HEIGHT <= 280){  
                contentStream.endText();  
                contentStream.close(); 
                newPage = true;
                break; 
            } 
        } 

        if(!newPage){
            contentStream.endText();  
            contentStream.close(); 
        }

        else if (newPage){          
            float NEW_HEIGHT = 600;             
            newStream.beginText();
            newStream.setFont(pdfFont, fontSize);
            newStream.newLineAtOffset(PAGE_MARGIN, NEW_HEIGHT);

            for (int j=nextPage_i; j<textList.size(); j++)//String line: textList){
                System.out.println("HEIGHT: "+ NEW_HEIGHT);
                nextPage_i = j;
                String line = textList.get(j);
                float charSpacing = 0;

                if (line.length() > 1){         
                    float size = fontSize * pdfFont.getStringWidth(line) / 1000;
                    float free = width - size;
                    if (free > 0)
                    {
                        charSpacing = free / (line.length() - 1);
                    }
                    NEW_HEIGHT = NEW_HEIGHT - 10; 
                }
                newStream.setCharacterSpacing(charSpacing); 
                newStream.showText(line);
                newStream.newLineAtOffset(0, -leading);
            }
            newStream.endText();  
            newStream.close();
        }
        lastSpace = -1;
    }

推荐答案

PDPage 实例化拉入 PDFLetterGenerate:

public void PDFLetterGenerate (String args) throws Exception {
    PDPage main_page = new PDPage();
    PDPage new_page = new PDPage(); 

    text = args;
    text = text.replace("\n", "").replace("\r", "");

    if(file.exists()) file.delete();
    file.createNewFile();
    //Creating PDF document object 
    PDDocument document = new PDDocument();       
    document.addPage(main_page);  
    mainBody(document, main_page);      
    document.addPage(new_page);                          
    if(!newPage) document.removePage(new_page);

    document.save(file);
    document.close(); 
}

在您的代码中,页面被实例化一次,并且在将页面添加到本地 PDDocument 文档 后,在第一次运行 PDFLetterGenerate 后关闭底层流

In your code the pages are instantiated once and the underlying streams are closed after the first run of PDFLetterGenerate when the local PDDocument document is closed after having the pages added to it.

此外,还要让 new_page 成为 mainBody 的参数,而不是依靠一个静态变量来保存它.

Furthermore, also make new_page an argument of mainBody instead of counting on a static variable to hold it.

您的代码中还有许多其他问题,但上述更改应该可以帮助您入门.

There are a number of other issues in your code, but the changes above should get you started.

这篇关于COSStream 已关闭,无法读取.也许它的封闭 PDDocument 已关闭?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆