本质上,我试图用Java创建一个小工具,从某种用户输入中获取文本,想象一个普通的文本框,并用它创建一个PDF文件。
到目前为止,我用我对pdfbox的基本知识很快地学到了一些东西。
在我的应用程序中,我在另一个带有GUI元素的应用程序中实例化这个类(如下所示),如果我输入文本,比方说在一个文本框中,并且运行这个pdfletter
脚本一次--它运行起来非常好,但是第二次运行它,它就会崩溃,并给我带来这个恼人的错误:
COSStream已关闭,无法读取。可能是随附的PDDocument已经关闭了?
我看不出有什么方法可以在代码中触发这个错误。我认为这与我的基本“跳转到下一页”解决方案有关,但它在当前状态下工作,所以我不知道该相信什么了。
如果您需要了解,我实例化类的方式如下所示:
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();
}
在您的代码中,页面被实例化一次,并且在首次运行PDFletterGenerate
之后关闭基础流,此时本地PDDocument文档
在添加页面之后关闭。
此外,还要使new_page
成为mainbody
的参数,而不是依赖静态变量来保存它。
在您的代码中还有许多其他问题,但是上面的更改应该可以让您开始。
我尝试用apache PDFBox保存PDF文件,但出现错误 java.io.IOException:COSStream已关闭,无法读取。也许它所附的PDDocument已经关闭了? 出什么事了?
我做过研究,在运行workingdocument.save(文件名)命令之前,似乎有一个PDDocument正在关闭。我不是很确定如何修复这个,我也有点迷路如何找到一个变通办法。我对我的编程有点生疏,所以任何帮助都将非常感谢!此外,任何关于如何使未来的帖子更多信息的反馈都将是很好的。 提前致谢
我在我的项目中有下一个代码,它时不时地与
我正在用Java生成一个PDDocument,代码如下... 然后保存并关闭文档,如下所示... 有没有一种方法可以关闭流并创建多个PDF,而不会出现抓取文件错误?
我正在尝试用PDFBOX填充重复的表单。我正在使用树状图并用单个记录填充表单。pdf表格的格式是在第一页列出六个记录,在第二页插入一个静态页。(对于大于6条记录的树映射,该过程重复)。Im获得的错误与TreeMap的大小有关。这就是我的问题所在。我不明白为什么当我用35个以上的条目填充TreeMap时,我会得到以下警告: 2018年4月23日2:36:25 AM org.apache.pdfbox
我在springboot应用程序中使用webclient来调用外部restful web服务。间歇性地获取此异常。 在收到此异常之前,我在日志中看到以下警告。 这是完整的堆栈跟踪: 这是MessageServiceImpl.java 这里是客户端组件类 在下面的配置中,我在SSLContext中添加了信任存储。 下面是应用程序属性文件 我已经尝试通过下面链接中给出的解决方案来解决这个问题,但是没有