2015-08-12 4 views
2

Привет всем Я знаю, что это может быть простая проблема, с которой я столкнулся, но я застрял на этом какое-то время. Я новичок в использовании itext. В основном я работаю над небольшим проектом, в котором я пытаюсь использовать существующий pdf, чтобы заполнить данные из базы данных. Но прежде чем я это сделаю, я просто хотел убедиться, что могу скопировать данные из базы данных, чтобы уже представить pdf, используя itext. Но я столкнулся с этой проблемой: «невозможно преобразовать из void в pdf writer». Я попробовал посмотреть в списке рассылки itext и попытался получить образец кода, но ничего не мог помочь, поэтому я здесь прошу помощи. Просьба помочь мне в моей проблеме и дать общее представление о том, как получить данные из базы данных и заполнить форму.писатель не может быть разрешен itext

например, форма имеет последнее имя, которое осталось пустым, поэтому мне нужно вытащить фамилию из базы данных и поставить вместо нее фамилию в формате pdf. следующий мой код.

/** 
* 
*/ 

package itext.sample; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
//import com.itextpdf.text.BaseColor; 
//import com.itextpdf.text.Chunk; 
import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Image; 
//import com.itextpdf.text.Font; 
//import com.itextpdf.text.Font.FontFamily; 
//import com.itextpdf.text.Paragraph; 
import com.itextpdf.text.pdf.AcroFields; 
import com.itextpdf.text.pdf.PdfImportedPage; 
import com.itextpdf.text.pdf.PdfPTable; 
import com.itextpdf.text.pdf.PdfReader; 
//import com.itextpdf.text.pdf.PdfStamper; 
import com.itextpdf.text.pdf.PdfWriter; 
import com.itextpdf.text.DocWriter; 

/** 
* @author prithvi 
* 
*/ 
public class FirstPdf { 

    private static final String Result = "D:/Eclipse Java/image.pdf"; 

    public static String main(String[] args) throws SQLException,IOException,DocumentException { 
     try { 

      Class.forName("com.mysql.jdbc.Driver"); 

     } catch (ClassNotFoundException e) { 

      System.out.println("Where is your MySQL JDBC Driver?"); 
      e.printStackTrace(); 
      return null; 

     } 
     System.out.println("MySQL JDBC Driver Registered!"); 
     Connection connection = null; 
     try { 
      connection = DriverManager 
        .getConnection("jdbc:mysql://69.167.139.172/bluedb", 
          "color", "prithvi"); 

     } catch (SQLException e) { 
      System.out.println("Connection Failed! Check output console"); 
      e.printStackTrace(); 
      return null; 
     } 

     if (connection != null) { 
      System.out.println("You made it, take control your database now!"); 
     } else { 
      System.out.println("Failed to make connection!"); 
     } 
     // creating pdf document 
    Document document = new Document(); 
    try { 
      //writing to the outputfile 
      PdfWriter writer= PdfWriter.getInstance(document,new FileOutputStream(Result)) .setInitialLeading(16); 
      document.open(); //opening the document to do the action 
      Statement stm = null; 
      stm = connection.createStatement();//creating database query 
      ResultSet rs = null; 
      rs = stm.executeQuery("SELECT * FROM Sec1"); 
      PdfPTable table = new PdfPTable(2); 
      PdfReader reader =new PdfReader ("D:/Eclipse Java/HiltonForms2014_r.pdf"); 
      AcroFields form = reader.getAcroFields(); 
      form.setField("LASTNAME", rs.getCursorName()); 
      int n = reader.getNumberOfPages(); 
      PdfImportedPage page; 
      for(int i= 1; i <=n;i++) 
      { 
       page = writer.getImportedPage(reader,i); 
       table.addCell(Image.getInstance(page)); 
      } 
      document.add(table); 
      document.close(); 
      connection.close(); 
      reader.close(); 


      /*while (rs.next()){ 

         document.add(new Chunk(rs.getString(Result))); 
         document.add(new Chunk("")); 
         Font font = new Font(FontFamily.TIMES_ROMAN, 10,Font.BOLD, BaseColor.WHITE); 
         Chunk id = null; 
         id = new Chunk(rs.getString("Sec1ID"), font); 
         id.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f , 1.5f); 
         id.setTextRise(6); 
         document.add(id); 
         document.add(Chunk.NEWLINE); 
         document.add(new Paragraph("hey there! you created a new pdf")); 
         stm.close(); 
         connection.close(); 
         document.close(); 
        }*/ 



    } 

       catch (DocumentException | SQLException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        } 
       } 


} 
+0

В какой строке вы получите сообщение об ошибке? – Jens

+0

первая строка в блоке try после создания документа PdfWriter.getInstance (document, new FileOutputStream (Результат) .setInitialLeading (16); –

ответ

1

Извините, но ваш код не соответствует действительности.

Если вы хотите заполнить форму, вам необходимо использовать PdfStamper. Смотри, например: How to fill out a pdf file programatically?

В вашем случае код будет:

PdfReader reader = new PdfReader("D:/Eclipse Java/HiltonForms2014_r.pdf"); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(Result)); 
AcroFields form = stamper.getAcroFields(); 
form.setField("LASTNAME", rs.getCursorName()); 
stamper.setFormFlattening(true); 
stamper.close(); 
reader.close(); 

Вот некоторые вопросы, я Обнаруженные в вашем коде:

Выпуск № 1:

PdfReader reader =new PdfReader ("D:/Eclipse Java/HiltonForms2014_r.pdf"); 
AcroFields form = reader.getAcroFields(); 
form.setField("LASTNAME", rs.getCursorName()); 

Вы действительно можете создать экземпляр AcroFields от PdfReader, но в этом случае поля будут быть только для чтения, а это значит, что метод setField() ничего не сделает. Для установки полей может использоваться только экземпляр AcroFields, полученный от PdfStamper.

Выпуск № 2:

Вы хотите, чтобы заполнить поля, которые являются интерактивными функциями, но вы используете writer.getImportedPage(reader,i) где writer является экземпляром PdfWriter. Это означает, что вы выбрасывая все интерактивные функции ...

Выпуск № 3:

Я предполагаю, что вы хотите 2-вверх по заполнял документ. Вы создаете таблицу с 2 столбцами, и вы добавляете страницы существующего документа в виде ячеек в эту таблицу, но:

  • Вы создаете документ размером A4 в портретной ориентации. Это будет неудобно.
  • iText не отображает неполные строки, поэтому, если ваш существующий PDF-файл имеет только одну страницу, таблица не будет отображаться. Если существующий PDF имеет нечетное количество страниц, последняя страница пропадет.
  • Процент по умолчанию, равный PdfPTable, составляет 80%. Добавьте поля по полдюйма каждый, и в итоге вы получите много свободного места слева и справа от импортированных страниц.

Я думаю, что вы должны заполнить форму, используя вышеуказанный код, в первый раз, а затем N-вверх по документу во второй раз.

+0

Благодарим вас за исправление, где я ошибаюсь. Думаю, что я могу понять отсюда. –

+0

I модифицировал кодирование, как вы предполагали, но теперь я получаю сообщение об ошибке в конструкторе PdfStamper. «Конструктор FileOutputStream не определен» –

+0

@Dean В моем ответе была ошибка копирования/вставки. Спасибо, что сообщили об этом. –

1

PdfWriter.getInstance(document, new FileOutputStream(Result).setInitialLeading(16); - пустота.

Таким образом, вы должны изменить на:

PdfWriter writer= PdfWriter.getInstance(document,new FileOutputStream(Result)) 
writer.setInitialLeading(16); 
+0

Это действительно причина исключения (отсюда и голосование), но в целом код неправильный. Невозможно, чтобы фрагмент кода мог работать, потому что 'PdfReader.getAcroFields()' возвращает поля в режиме только для чтения Кроме того, метод 'setInitialLeading (16)' не имеет никакого смысла в контексте этого примера. –

+0

спасибо Я очень ценю вашу помощь. –

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