使用pdfstamper(Itext)将页码添加到pdf [英] Add page number to pdf using pdfstamper(Itext)

查看:2031
本文介绍了使用pdfstamper(Itext)将页码添加到pdf的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这段代码

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,但上面的代码不起作用。现在作为一个例子,我只是添加文本mathias来检查它是否有效,但文本mathias没有出现在pdf页面上。其他一切正常,标题,pdf上的文字显示但不是来自压模的数据

I am trying to add page numbers to my pdf but this above code doesnt work.Right now as an example I am just adding text "mathias" to check if it works but the text "mathias" doesnt appear on the pdf page.Everything else works fine,the headers,text on the pdf get displayed but not the data from the stamper.

I还尝试使用此

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

但是压模没有任何显示。

But nothing appears from the stamper.

我错过了什么吗?

推荐答案

mkl试图解释的内容非常简单。您正在使用以下方法将PDF文档发送到浏览器:

What mkl is trying to explains is very simple. You are sending a PDF document to the browser using:

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

但是,此文档是之前的标记的PDF文档,因此它不应该使用 PdfStamper ,您没有看到对文档应用任何更改,这让您大吃一惊。请删除这些行并查看此代码:

However, this document is a PDF document before stamping, hence it shouldn't surprise you that you don't see any changes applied to the document with PdfStamper. Please remove these lines and take a look at this code:

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

请注意,我删除了凭证凭证=新凭证来自此代码段的(); 。请阅读文档。使用 PdfStamper 时,您不需要 Document 实例。

Note that I removed the Document document = new Document(); from this snippet. Please read the documentation. You don't need a Document instance when using PdfStamper.

这篇关于使用pdfstamper(Itext)将页码添加到pdf的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆