gpt4 book ai didi

java - iText连续PDF编辑java

转载 作者:行者123 更新时间:2023-11-29 05:43:16 24 4
gpt4 key购买 nike

我正在使用 iText 库创建 PDF 并将数据添加到 PDF。

我想多次向 PDF 添加一些文本行和图像,直到我关闭文件。

 numOfSamples = timeIHitTheButton();
.
.
.
*a loop tha call it the number of times choosen by numOfSamples*
DSM.saveData();

DataStore(DSM 是一个 DataStore 实例)类正确创建文档 doc.pdf 并且 DSM.addText() 和 DSM.addPicture() 正确打印文件上的三个文本行和一个图像,但前提是我按下按钮就一次!!

我想在每次按下按钮时写入相同的字符串和图像(如果我按下一次我有一个样本,如果我有两次样本等)。如果我只按一次并终止,我会得到带有字符串和图片的 PDF,但如果我按多次,我会得到一个无法读取且已损坏的 PDF 文件。我不知道为什么。怎样才能继续写图片和字符串,直到样本数写完?

如果有用,我会在这里发布一些代码(“newPic1.jpg”“newPic2.jpg”等是存储的图片,要与文本一起添加到 PDF。):

public class DataStore{ ....
.
.
.

public DataStore(String Str1, String Str2, String Str3, int numOfSemples)
throws Exception{

document = new Document();
String1 = str1;
String2 = str2;
String3 = str3;
Samples = numOfSemples;

document.open();
}


privatevoid saveData(){

if(!created){
this.createFile();
created=true;
}
this.addText();
this.addPicture();
}
private void createFile(){

try {
OutputStream file = new FileOutputStream(
new File("Doc.pdf"));
PdfWriter.getInstance(document, file);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}

private void addText(){

try {
if(Samples > 0)
document.open();
document.add(new Paragraph(Double.toString(String1)));
document.add(new Paragraph(Double.toString(String2)));
document.add(new Paragraph(Double.toString(String3)));
} catch (DocumentException e) {
e.printStackTrace();
}
}

private void addPicture(){

try {
Image img = Image.getInstance("NewPic" + Samples + ".jpg");
document.add(img);
} catch (BadElementException bee) {
bee.printStackTrace();
} catch (MalformedURLException mue) {
mue.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (DocumentException dee) {
dee.printStackTrace();
}
if(Samples == 0)
document.close();
else Samples--;
}
}

最佳答案

您以错误的顺序使用了 iText 命令:

  • 您的 DataStore 构造函数创建一个新的 Document 并调用其 open 方法 (这太早了,因为还没有编写器).
  • 一段时间后,在第一个 saveData 调用中,您调用 createFile 创建 PdfWriter
  • 在所有 saveData 调用中 addText 被调用,对于 Samples > 0 每次 再次打开文档(这在第一次但不得多次)。
  • 最后,在使用 Samples == 0saveData 调用中,您关闭了文档。

因此,本质上您是这样做的:

document = new Document();
document.open();
[...]
PdfWriter.getInstance(document, file);
[...]
[for `Samples` times]
document.open();
[add some paragraphs]
[add an image]
[end for]
document.close();

将此与应该如何完成进行比较:

// step 1
Document document = new Document();
// step 2
PdfWriter.getInstance(document, new FileOutputStream(filename));
// step 3
document.open();
// step 4
[add content to the PDF]
// step 5
document.close();

(copied from the HelloWorld.java sample from iText in Action — 2nd Edition)

仅对于 Samples == 1 而言,您是正确的(构造函数中多余的 document.open() 被忽略,因为还没有编写器);但是,对于较大的 Samples 值,,您在编写器在场的情况下多次打开文档,这可能会一遍又一遍地将 PDF 开始附加到输出流。

您很可能可以通过删除所有当前 document.open() 调用(包括 addText( 中的 if(Samples > 0))来解决此问题)) 并在 PdfWriter.getInstance(document, file) 之后的 createFile() 中添加一个。

关于java - iText连续PDF编辑java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16776799/

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