我正在使用iText库创建数据并将数据添加到PDF。
我想多次将一些textLines和一个图像添加到PDF中,直到我关闭文件。
numOfSamples = timeIHitTheButton();
.
.
.
*a loop tha call it the number of times choosen by numOfSamples*
DSM.saveData();
DataStore(DSM是一个DataStore实例)类正确创建Document 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--;
}
}
答案 0 :(得分:3)
您以错误的顺序使用iText命令:
DataStore
构造函数会创建一个新的Document
并调用其open
方法(现在还没有编写者这么早)。 saveData
来电中,您拨打createFile
来创建PdfWriter
。saveData
次调用中addText
调用Samples > 0
每次时再次打开文档(第一次就可以,但不能多次执行) 强> saveData
与Samples == 0
的通话中,您关闭了文档。因此,实质上你这样做:
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();
只有Samples == 1
你才能得到它(构造函数中多余的document.open()
被忽略,因为还没有编写者);但是,对于较大的Samples,
值,您可以使用存在的编写器多次打开文档,这可能会一次又一次地将PDF连接到输出流。
您很可能通过删除所有当前document.open()
来电(包括if(Samples > 0)
中的addText()
)并在createFile()
之后的PdfWriter.getInstance(document, file).
中添加一个来解决问题}}