2013-05-27 76 views
1

我正在使用iText庫來創建和添加數據到PDF。iText連續PDF編輯java

我想添加一些textLines和圖像到PDF不止一次,直到我關閉文件。

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

數據存儲(DSM是一個數據存儲實例)類正確地創建文檔doc.pdf和DSM.addText()和DSM.addPicture()打印正確3個文本行的圖像上的文件,但僅當我只按一次按鈕!

我想每次都寫一個字符串和一個圖像我按下按鈕(如果我按下一次,我有一個樣本,如果trwice我有兩個樣本等)。如果我只是按一下和終止,我可以通過字符串和圖片獲取我的PDF,但如果我按下了一次以上的按鈕,我就會看到一個不可讀的和損壞的PDF文件。我不知道爲什麼。如何繼續編輯圖片和字符串,直至樣本數完成?

在這裏,我後,如果有用的一些代碼(「newPic1.jpg」「newPic2.jpg」等都是存儲的圖片添加到PDF togheter與文本。):

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--; 
} 
} 

感謝大家能或者希望幫助:)

+1

目前尚不清楚究竟是如何使用您發佈的代碼片段右側添加一個在createFile() 。請把它們放在一起。 – mkl

+0

同樣在這裏:我不明白這個問題。它需要澄清。 –

+0

@mkl ..我編輯我的問題,希望它更容易理解 – Igr

回答

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(); 

(從iText in Action — 2nd EditionHelloWorld.java樣本複製)

只適用於Samples == 1你對它有權利(由於沒有編寫器,構造函數中多餘的document.open()被忽略);對於Samples,的較大值,雖然您可以多次使用作者在場的文檔打開文檔,這可能會將PDF重複一遍又一遍地重複輸出到輸出流。

很可能,你可以通過刪除所有當前document.open()電話(包括addText()if(Samples > 0))解決該問題後PdfWriter.getInstance(document, file).

+0

謝謝,這正是我對「document.open()」這個問題的愚蠢定位。現在它正常工作:) – Igr