2014-01-27 7 views
2

У меня есть этот кодДобавить номер страницы в формате PDF с использованием PdfStamper (IText)

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     ByteArrayOutputStream output = new ByteArrayOutputStream(); 
     try{ 
     response.setContentType("application/pdf"); 
     response.setHeader("Content-Disposition", "inline; filename=details.pdf"); 
     try{ 
     Document document = new Document(PageSize.A4, 20, 20, 130, 20); 
     PdfWriter writer=PdfWriter.getInstance(document, output); 
     document.open(); 
     BaseFont bf = BaseFont.createFont("c:/windows/fonts/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 
     writer.setPageEvent(new HeaderAndFooter(date)); 
     XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); 
     List arrlist = new ArrayList(); 
     List arrlist1 = new ArrayList();//user list 
     List arrlist2 = new ArrayList();//time list 
     Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/765a", "root", "root"); 
     Statement st=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 
     ResultSet rs=st.executeQuery("SELECT * FROM user_start2 where date='"+date+"' "); 
     while(rs.next()){ 
     arrlist.add(rs.getString("data")); 
     arrlist1.add(rs.getString("users")); 
     arrlist2.add(rs.getString("strtime")); 
     } 
     for(int i=0;i<interval+1;i++){ 
      String str =(String) arrlist.get(i); 
      String str1 ='\n'+(String) arrlist1.get(i); 
      String str2 =(String) arrlist2.get(i); 
      String string =str.replace("<p>","\n").replace("</p>", "\n"); 
      document.add(new Paragraph(str1+"("+str2+")",new com.itextpdf.text.Font(bf, 10))); 
      document.add(new Paragraph(str2,new com.itextpdf.text.Font(bf, 10))); 
      document.add(new Paragraph(string,new com.itextpdf.text.Font(bf, 12))); 
     } 
     document.close(); 
     response.setContentLength(output.size()); 
     OutputStream os = response.getOutputStream(); 
     output.writeTo(os); 
     os.flush(); 
     os.close(); 
     con.close(); 
     }catch(IOException e){e.printStackTrace();} 
      }catch(IOException e){e.printStackTrace();} 
     catch(DocumentException e) {} 
     catch(Exception e) {  
    } 
     //PDF READER 
      // Create a reader 
     try{ 
     OutputStream out = new ByteArrayOutputStream(); 
     PdfReader reader = new PdfReader(output.toByteArray()); 
     PdfStamper stamper = new PdfStamper(reader, out); 
     Document document = new Document(); 
     document.open(); 
     int n = reader.getNumberOfPages(); 
     PdfContentByte cbq; 
     Font headerFont = new Font(FontFamily.COURIER, 13, Font.UNDERLINE); 
     for (int i = 1; i <= n; i++) { 
      cbq = stamper.getOverContent(i); 
      ColumnText ct = new ColumnText(cbq); 
      ct.setSimpleColumn(300 , 300, 50, 50 , 150, Element.ALIGN_CENTER); 
       ct.addElement(new Paragraph("Mathias" , headerFont)); 
       ct.go(); 
     } 
     // Close the stamper 
      stamper.close(); 
      reader.close(); 
      document.close(); 
     } catch (DocumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

} 

Я пытаюсь добавить номера страниц в моем PDF, но это выше код оленья кожа work.Right Теперь в качестве примера я просто добавить текст «Матиас», чтобы проверить, если он работает, но текст «Матиас» не появляется на Pdf page.Everything еще работает отлично, заголовки, текст на PDF получить отображается , но не данные из стампера.

Я также попытался использовать этот

for (int i = 1; i <= n; i++) { 
      getHeaderTable(i, n).writeSelectedRows(0, -1, 34, 803, stamper.getOverContent(i)); 
     } 

public static PdfPTable getHeaderTable(int x, int y) { 
      PdfPTable table = new PdfPTable(2); 
      table.setTotalWidth(527); 
      table.setLockedWidth(true); 
      table.getDefaultCell().setFixedHeight(20); 
      table.getDefaultCell().setBorder(Rectangle.BOTTOM); 
      table.addCell("FOOBAR FILMFESTIVAL"); 
      table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); 
      table.addCell(String.format("Page %d of %d", x, y)); 
      return table; 
     } 

Но ничего не видно из матрицы.

Я что-то упустил?

+0

Ваш штамп пишет 'out', но вы не используете его позже. Таким образом, ваши штампованные изменения теряются. – mkl

+0

Так что я должен добавить? –

+0

Вы имеете в виду, что мне нужно закрыть его? Также мне нужно создать новый документ во время чтения? –

ответ

2

Что mkl пытается объяснить, очень просто. Вы отправляете PDF документ в браузере с помощью:

response.setContentLength(output.size()); 
OutputStream os = response.getOutputStream(); 
output.writeTo(os); 

Однако, этот документ представляет собой PDF документ перед тем штамповки, поэтому это не должно удивлять, что вы не видите каких-либо изменений, применяемые к документу с PdfStamper. Пожалуйста, удалите эти строки и посмотрите на этот код:

//PDF READER 
// Create a reader 
try{ 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    PdfReader reader = new PdfReader(output.toByteArray()); 
    PdfStamper stamper = new PdfStamper(reader, out); 
    int n = reader.getNumberOfPages(); 
    PdfContentByte cbq; 
    Font headerFont = new Font(FontFamily.COURIER, 13, Font.UNDERLINE); 
    for (int i = 1; i <= n; i++) { 
     cbq = stamper.getOverContent(i); 
     ColumnText ct = new ColumnText(cbq); 
     ct.setSimpleColumn(300 , 300, 50, 50 , 150, Element.ALIGN_CENTER); 
     ct.addElement(new Paragraph("Mathias" , headerFont)); 
     ct.go(); 
    } 
    // Close the stamper 
    stamper.close(); 
    reader.close(); 
    response.setContentLength(out.size()); 
    OutputStream os = response.getOutputStream(); 
    out.writeTo(os); 
} catch (DocumentException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Обратите внимание, что я удалил Document document = new Document(); из этого фрагмента. Пожалуйста, прочитайте the documentation. При использовании PdfStamper вам не нужен экземпляр Document.

+0

, но используя 'OutputStream out', я получаю ошибки в out.size() (' Метод size() не определен для типа OutputStream') и out.writeTo (os) ('Метод writeTo (OutputStream) не определен для тип OutputStream') –

+0

Просто объявите 'ByteArrayOutputStream out' вместо этого. Вы установили его в 'ByteArrayOutputStream' после всех ... – mkl

+0

Я обновил свой ответ. Пожалуйста, не используйте такие заявления, как «это не работает», будьте более конкретными! http://lowagie.com/doesntwork –

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