2013-05-27 4 views
1

Я использую библиотеку iText для создания и добавления данных в PDF.iText непрерывное редактирование PDF java

Я хочу добавить несколько текстовых строк и изображение в PDF более одного раза, пока не закрою файл.

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

Датастор (DSM является экземпляром DataStore) класс создает doc.pdf документ правильно и DSM.addText() и DSM.addPicture() печатает правильно трех экземпляров TextLine изображение на файле, но только если Я нажимаю кнопку только один раз!

Я ХОЧУ НАПРАВЛЯТЬ ЖИВОЙ СТРОК И ИЗОБРАЖЕНИЕ КАЖДОГО ВРЕМЕНИ Я НАЖМИТЕ КНОПКУ (если я нажму его один раз, у меня будет один образец, если у меня есть два образца и т. Д.). ЕСЛИ Я ПРЕКРАТЬ ЭТО ТОЛЬКО ОДИН РАЗ, И Я ТЕРЯЮ, Я ПОЛУЧИЛ МОЙ PDF С СТРОЕЙ И ФОТОГРАФИЯМИ, НО ЕСЛИ Я ПРЕКРАТЬ ЭТО БОЛЬШЕ, ЧЕМ ОДИН РАЗ, Я ПОЛУЧИЛ НЕПРЕРЫВНЫЙ И ПОВРЕЖДЕННЫЙ PDF FILE. Я НЕ ЗНАЮ ПОЧЕМУ. КАК МОЖНО ПРОДОЛЖИТЬ ПИСЬМО ИЗОБРАЖЕНИЯ И СТРОКА НЕПРЕРЫВНО ДО ПОЛУЧИТЬ ЧИСЛО ОБРАЗЦОВ?

Здесь я отправляю код, если полезный («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--; 
} 
} 

Спасибо всем, может или хочет помочь :)

+1

Это не ясно, как именно фрагменты кода вы Отправленные используются , Пожалуйста, разместите их в контексте друг с другом. – mkl

+0

То же самое здесь: я не понимаю вопроса. Он нуждается в разъяснении. –

+0

@ mkl ..I отредактировал мой вопрос, надеюсь, что это легче понять. – 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(); 

(копируется из HelloWorld.java образца из iText in Action — 2nd Edition)

Только для Samples == 1 у вас есть это о праве (лишний document.open() в конструкторе игнорируется, поскольку еще нет писателя); для больших значений Samples,, однако, вы открываете документ несколько раз с присутствующим автором, который, вероятно, снова добавит начало PDF в выходной поток.

Вполне вероятно, что вы можете решить проблему, удалив все текущие document.open() вызовы (в том числе if(Samples > 0) в addText()) и добавьте в createFile() сразу после PdfWriter.getInstance(document, file).

+0

Спасибо, это было именно мое глупое позиционирование проблемы document.open(). Теперь он работает правильно :) – Igr

Смежные вопросы