gpt4 book ai didi

java - COSStream 已关闭且无法读取。也许其随附的 PDDocument 已关闭?

转载 作者:行者123 更新时间:2023-11-30 01:40:56 25 4
gpt4 key购买 nike

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

到目前为止,我已经成功地利用我对 PDFBox 的基本知识快速地抓取了一些东西。

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

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

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

如果您需要知道,我实例化该类的方式如下:

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

此外,我认为一定是垃圾收集的某种问题引发了该问题,但我不再认为情况是这样。

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 后会关闭底层流它。

此外,还将 new_page 作为 mainBody 的参数,而不是依靠静态变量来保存它。

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

关于java - COSStream 已关闭且无法读取。也许其随附的 PDDocument 已关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60036290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com