精华内容
下载资源
问答
  • laravel生成pdf

    2018-05-30 15:17:52
    laravel生成pdf文件,laravel生成pdf文件,laravel生成pdf文件,laravel生成pdf文件,laravel生成pdf文件,
  • Android生成PDF

    2017-12-04 15:49:56
    Android生成PDF/Android生成PDF/Android生成PDF/Android生成PDF
  • POI按word模版生成合同并生成PDF。模版替换符为:{年}修复生成pdf功能
  • itext5.5.10生成PDF

    2018-04-20 11:51:32
    itext5.5.10生成PDF。itext5.5.10生成PDF。itext5.5.10生成PDF。itext5.5.10生成PDF
  • java生成pdf

    2018-12-03 10:06:34
    iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
  • SWF生成PDF

    2014-06-04 19:57:05
    SWF生成PDF 多个SWF文件生成PDF
  • 利用wkhtmltopdf 生成pdf

    2018-12-28 13:59:25
    利用wkhtmltopdf htl生成pdf
  • itext 生成pdf 目录

    2017-12-19 16:54:29
    itext 生成pdf 目录,itext 生成pdf 目录,itext 生成pdf 目录
  • freemarker生成pdf

    2017-04-24 16:09:52
    freemarker生成pdf
  • JAVA根据PDF模板生成PDF文件(支持文本内容,图片,条形码,二维码), 用于JAVA Web 动态根据模板生成PDF并打印
  • HTML生成PDF文件

    2018-01-09 11:34:38
    在项目中实现HTML页面转PDF文件输出,HTML生成PDF文件,HTML生成PDF文件
  • java生成pdf,java生成pdf,pdf的demo,java生成pdf,java生成pdf,pdf的demo
  • C#生成PDF 读取PDF文本内容 获取PDF内图片
  • .NET生成PDF 读取PDF文本内容 获取PDF内图片
  • iTextSharp生成pdf

    热门讨论 2013-01-21 14:08:03
    此源码主要为一个生成pdf的集成类库,(其中:生成水印,页眉,页脚,图形,图片,表格-PdfPTable ,文本...) 还包括html生成图片的功能 推荐说明: 我敢说,此类库绝对是(iTextSharp 5.1.2.0)完美的案例实现,将...
  • java实现pdf的生成下载打印,java生成pdf电子账单,java生成pdf合同模板,Itext编辑pdf,java使用itext

    最近公司要做个生成pdf电子账单凭证的功能,由于这个公司没有任何代码可借鉴,这个时候我就必须得自己搞明白具体的每一步应该怎么做,引什么jar包?用什么方式去实现?这篇博客中会给出从头到尾及其详细的代码和工具类以及jar包,方便大家需要时直接粘贴到自己项目中,此功能完成加调试1天即可完成,此案列可以用模板套打的方式完成合同以及账单或是单纯的文案式pdf。下面先给一张最终实现的效果图片。


    在看到此图的时候我首先想到两种方案,第一个是直接由java生成pdf,每一行的生成都由java代码控制。第二种使用模板套打的方式,即我有个空白的pdf模板,把需要改变的地方的值置为空白,然后通过程序去写入。很明显第二种方案简单,且效率高。java实现对pdf的编辑用到了itext技术,引用了itext的相关jar包如下:

            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itextpdf</artifactId>
                <version>5.5.10</version>
            </dependency>
            <dependency>
            <groupId>com.itextpdf</groupId>
                <artifactId>itext-asian</artifactId>
                <version>5.2.0</version>
            </dependency>

    大家如果不是maven的项目可以去下载相应的jar包。

    触发下载pdf的肯定是页面的某个按钮等,jsp页面代码如下:

     function printPDF(outOrderId,serialNumber){//outOrderId,serialNumber 这是参数,可根据自己的项目需求来,window.open默认是get方式,所以参数大家需要注意一下
            window.open("${ctx}/pdf/print?templateName=certificate.pdf&outOrderId="+outOrderId+"&serialNumber="+serialNumber,'_blank',
                    'left=0,top=0,width='+ (screen.availWidth - 10) +',height='+ (screen.availHeight-50) +',scrollbars,resizable=yes,toolbar=yes');
        }

    window.open方法中就不在此解释了,前面参数是访问后台的url,后面的是打开浏览器的一个新的页面和窗口。

    紧跟着代码进入到后台的controller控制层,--------------------------------------------------

        @RequestMapping(value = "/print")
        @ResponseBody
        public void pdfPrint(@RequestParam(required=false,value="templateName") String templateName,
                HttpServletRequest request, HttpServletResponse response,AgentPayDetailInfo agentForm) throws Exception {
        

           //agentPayInfo  这个对象可以根据具体的需求换成你们自己的java对象,Text1-Text13,是pdf模板上空白处的表单的key值,通过该值可以用程序编辑pdf

            //组装模板所需数据HashMap
            HashMap<String, String> mapPDF = new HashMap<String, String>();
            mapPDF.put("Text1", DateUtil.getDateFormatYH(agentPayInfo.getFinishDate()));//交易时间
            mapPDF.put("Text2", Constants.PAY_ONESELF_NAME);//付款方全称
            mapPDF.put("Text3", NumberToCN.number2CNMontrayUnit(agentPayInfo.getAmount()));//金额人民币大写  汉字
            mapPDF.put("Text4", agentPayInfo.getCardholder());//账户名称
            mapPDF.put("Text5", agentPayInfo.getBankCardNo());//银行卡号
            mapPDF.put("Text6", agentPayInfo.getBankName());//开户行
            mapPDF.put("Text7", agentPayInfo.getAmount().toString());金额人民币小写  数字
            mapPDF.put("Text8", Constants.RMB);//账户类型
            mapPDF.put("Text9", Constants.PAY_CERTIFICATE_TYPE);//交易类型
            mapPDF.put("Text10", "");//用途
            mapPDF.put("Text11", Constants.PAY_CERTIFICATE_REMARK);//备注
            String receiptNumber = DateUtil.getFDate(agentPayInfo.getFinishDate()) + agentPayInfo.getOutOrderId() + agentPayInfo.getSerialNumber();
            mapPDF.put("Text12", "电子回单编号:" + receiptNumber);//电子回单编号
            mapPDF.put("Text13", DateUtil.getFormatDate(agentPayInfo.getFinishDate()));//章子时间
            
            //生成pdf
            pdfStream = this.print(templateName, mapPDF, request);
            
            ServletOutputStream op = response.getOutputStream();
            response.setContentType("application/pdf"); 
            response.setHeader("Content-Disposition", "inline; filename=\""  
                     + new String(receiptNumber.getBytes("gb18030"), "ISO8859-1") + ".pdf" + "\"");   

            int length = 0;
            byte[] bytes = new byte[1024];
            while ((pdfStream != null) && ((length = pdfStream.read(bytes)) != -1)) {
                op.write(bytes, 0, length);
            }
            op.close();
            response.flushBuffer();
        }

        /**
         * 打印,以PDF为模板
         * @param templateName String 模板名字
         * @param map 模板数据HashMap
         * @return InputStream
         * @throws IOException
         */
        private InputStream print(String templateName, HashMap map, HttpServletRequest request) throws IOException {
            InputStream is = null;
            //服务器端PDF模板文件名
            //String merchId = getCurrentUser().getMerchId();
            String realPath = request.getSession().getServletContext().getRealPath("/");
            String web_info_URL = PropertyUtils.getValue("WEB_INFO_URL");
            String agentPayPath = PropertyUtils.getValue("PDF_PATH");
            String url = realPath + web_info_URL + agentPayPath;// pdf
            String templatePath = url + "/model/";//模板路径
            String serverPath = url + "/template/";//临时文件路径
            
            PdfFormater pdf = new PdfFormater(templatePath, serverPath, templateName, map);
            String PdfFilePath = pdf.doTransform();
            is = new FileInputStream(PdfFilePath);
            return is;
        }

    ------------------------------------------------------------------------------------------------------------------------

    输出给页面是用的ServletOutputStream,设置了response的.setContentType("application/pdf"); 文件为pdf,,这种方式下载和打印方法由客户端自己电脑上的flash和浏览器去完成,省去了服务端的一部分功能。

    小写数字转化大写汉字 金额的工具类可以网上搜索一个NumberToCN.number2CNMontrayUnit()这个也是我自己从网上搜索的

    PdfFormater 类-------------------------

    public class PdfFormater {
        //pdf模板和结果路径相关设置
        private String templateDir;

        private String basePath;

        private String templateFileFo;
        
        //需填充数据
        private Map dataMap;

        private String barcodeString;

        private String tempFileName;

        private String resultFileName;
        //动态数据
        private List dynData;

        /**
         * 构造器,生成PDF引擎实例,并引入相应模板文件XXX.FO、路径和报表数据HashMap
         *
         * @param templateDir
         *            模板文件所在目录
         * @param basePath
         *            模板文件工作副本及结果PDF文件所在工作目录
         * @param templateFileFo
         *            模板文件名,推荐格式为“XXXTemplate.FO”, 其文件由word模板文档在设计时转换而成
         * @param dataMap
         *            对应模板的数据HashMap,由调用该打印引擎的里程根据模板格式和约定进行准备
         */
        public PdfFormater(String templateDir, String basePath,
                String templateFileFo, Map dataMap) {
            this.templateDir = templateDir;
            this.basePath = basePath;
            this.templateFileFo = templateFileFo;
            this.dataMap = dataMap;
        }

        private BaseFont getBaseFont(Object obj) {
            // 需要根据不同的模板返回字体
            BaseFont bf = null;
            try {
                /*bf = BaseFont.createFont("simsun.ttf",
                        BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);*/
                 bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
            } catch (DocumentException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return bf;
        }

        public String doTransform() {
            long name = System.currentTimeMillis();
            tempFileName = "temp" + name + ".pdf";
            resultFileName = "best" + name + ".pdf";

            try {
                PdfReader reader;
                PdfStamper stamper;

                reader = new PdfReader(templateDir + "/" + templateFileFo);
                stamper = new PdfStamper(reader, new FileOutputStream(basePath + "/" + tempFileName));

                AcroFields form = stamper.getAcroFields();
                form.addSubstitutionFont(getBaseFont(""));
                transformRegular(form);
                stamper.setFormFlattening(true);
                stamper.close();

                postProcess();
                //FileOutputStream fos = new FileOutputStream(basePath + "/" + tempFileName);
            } catch (Exception e) {
                e.printStackTrace();
            }

            return basePath + "/" + resultFileName;
        }

        /**
         * 填充规整的表单域
         *
         * @param form
         */
        private void transformRegular(AcroFields form) {
            if (dataMap == null || dataMap.size() == 0)
                return;
            String key = "";
            Iterator ekey = dataMap.keySet().iterator();
            Object obj = null ;
            while (ekey.hasNext()) {
                key = ekey.next().toString();
                try {
                    obj = dataMap.get(key);
                    if(obj instanceof List)    {
                        //map中放的是list,为动态字段
                        dynData = (List)obj;
                        transformDynTable(form);
                    }else{
                        //非空放入
                        if( dataMap.get(key) != null)
                            form.setField(key, dataMap.get(key).toString());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (DocumentException e) {
                    e.printStackTrace();
                }
            }
        }

        /**
         * 动态table的填充
         * @param form
         */
        private void transformDynTable(AcroFields form) {
            if (dynData == null || dynData.size() == 0)
                return;
            Object obj = null;
            ReflectUtils rutil = new ReflectUtils();
            String name = "";
            String value = "";
            for (int x = 0; x < dynData.size(); x++) {
                obj = dynData.get(x);
                Field[] fld = obj.getClass().getDeclaredFields();
                for (int i = 0; i < fld.length; i++) {
                    name = fld[i].getName();
                    value = (String) rutil.getFieldValue(obj, name);
                    try {
                        form.setField(name + x, value);
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (DocumentException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        /**
         * 对生成的pdf文件进行后处理
         *
         * @throws RptException
         */
        private synchronized void postProcess() throws Exception {
            FileOutputStream fosRslt = null;
            PdfStamper stamper = null;
            try {
                PdfReader reader = new PdfReader(basePath + "/" + tempFileName);

                fosRslt = new FileOutputStream(basePath + "/" + resultFileName);
                stamper = new PdfStamper(reader, fosRslt);

                Rectangle pageSize = reader.getPageSize(1);
                float width = pageSize.getWidth();
                //float height = pageSize.getHeight();
                /*BaseFont bf = BaseFont.createFont("simsun.ttf",
                        BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);*/
                BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
                /*BaseFont bfComic = BaseFont.createFont("simhei.ttf",
                        BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);*/
                PdfContentByte over;
                int total = reader.getNumberOfPages() + 1;
                for (int i = 1; i < total; i++) {
                    over = stamper.getOverContent(i);
                    if (total <= 2)    break;
                    over.beginText();
                    over.setFontAndSize(bf, 10);
                    over.setTextMatrix(width - 92f, 32);
                    over.showText("第 " + i + " 页");
                    over.endText();
                }
            } catch (Exception ie) {
                ie.printStackTrace();
            } finally {
                if (stamper != null) {
                    try {
                        stamper.close();
                    } catch (DocumentException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fosRslt != null) {
                    try {
                        fosRslt.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                File pdfFile = new File(basePath, "/" + tempFileName);
                pdfFile.delete();
            }
        }

    }

    ---------------------------------------------------------------------------------------

    本地项目pdf模板路径:

    接下来说一下这个模板的问题,我们需要根据需求去自己编辑pdf,而编辑pdf的软件一般是收费的,我这边是用的迅捷PDF编辑器,然后加水印后用AI编辑器删除水印。给大家截图哈还是:


    这个章子是一个图片添加进去的,章子的中间是没有日期的,这个中间的日期因为是可变的,所以需要作为一个表单由程序去写入具体的值,在点击编辑内容时,如图所示,右侧有属性什么的,很好使用的。我们看到表单需要填写内容的区域为空白区域,然后我们点击编辑表单按钮出现如图所示的:


    域名就是程序中的map的key值,通过这个程序把内容写入到pdf具体的位置,可以设置字体大小,颜色,边框,对齐方式等。

    再看一下项目运行后的的效果,在点击某个按钮后,浏览器会弹出个新的窗口如图所示:

    好了,模板套打的基本说完了,在PdfFormater类中有些对页数的设置,页眉页脚都可以用类似的方法去实现,合同模板套打的案例我就不给出了。

    还有一些本地生成pdf文件的:

    public class PDFBillUtil {//(此工具类转载 http://blog.csdn.net/justinytsoft/article/details/53320225)

        public static void createBillPDF(BillPDF billPDF) {
            try {
                // 输出路径
                String outPath = "C:/Users/Administrator/Desktop/Helloworld.PDF";

                // 设置纸张
                Rectangle rect = new Rectangle(PageSize.A4);

                // 创建文档实例
                Document document = new Document(rect);

                PdfWriter.getInstance(document, new FileOutputStream(outPath));

                // 设置字体
                BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                com.itextpdf.text.Font FontChinese24 = new com.itextpdf.text.Font(bfChinese, 24,
                        com.itextpdf.text.Font.BOLD);
                com.itextpdf.text.Font FontChinese18 = new com.itextpdf.text.Font(bfChinese, 18,
                        com.itextpdf.text.Font.BOLD);
                com.itextpdf.text.Font FontChinese16 = new com.itextpdf.text.Font(bfChinese, 16,
                        com.itextpdf.text.Font.BOLD);
                com.itextpdf.text.Font FontChinese12 = new com.itextpdf.text.Font(bfChinese, 12,
                        com.itextpdf.text.Font.NORMAL);
                com.itextpdf.text.Font FontChinese11Bold = new com.itextpdf.text.Font(bfChinese, 11,
                        com.itextpdf.text.Font.BOLD);
                com.itextpdf.text.Font FontChinese11 = new com.itextpdf.text.Font(bfChinese, 11,
                        com.itextpdf.text.Font.ITALIC);
                com.itextpdf.text.Font FontChinese11Normal = new com.itextpdf.text.Font(bfChinese, 11,
                        com.itextpdf.text.Font.NORMAL);

                document.open();
                
                // table1
                PdfPTable table1 = new PdfPTable(3);
                PdfPCell cell11 = new PdfPCell(new Paragraph("费用报销", FontChinese24));
                cell11.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell11.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell11.setBorder(0);
                String imagePath = "D:/111.jpg";
                Image image1 = Image.getInstance(imagePath);

                Image image2 = Image.getInstance(imagePath);
                // 设置每列宽度比例
                int width11[] = { 35, 40, 25 };
                table1.setWidths(width11);
                table1.getDefaultCell().setBorder(0);
                table1.addCell(image1);
                table1.addCell(cell11);
                table1.addCell(image2);
                document.add(table1);
                // 加入空行
                Paragraph blankRow1 = new Paragraph(18f, " ", FontChinese18);
                document.add(blankRow1);

                // table2
                PdfPTable table2 = new PdfPTable(2);
                // 设置每列宽度比例
                int width21[] = { 2, 98 };
                table2.setWidths(width21);
                table2.getDefaultCell().setBorder(0);
                PdfPCell cell21 = new PdfPCell(new Paragraph("报销概要", FontChinese16));
                String imagePath2 = "D:/111.jpg";
                Image image21 = Image.getInstance(imagePath2);
                cell21.setBorder(0);
                table2.addCell(image21);
                table2.addCell(cell21);
                document.add(table2);
                // 加入空行
                Paragraph blankRow2 = new Paragraph(18f, " ", FontChinese18);
                document.add(blankRow2);

                // table3
                PdfPTable table3 = new PdfPTable(3);
                int width3[] = { 40, 35, 25 };
                table3.setWidths(width3);
                PdfPCell cell31 = new PdfPCell(new Paragraph("申请人:" + "XXX", FontChinese11Normal));
                PdfPCell cell32 = new PdfPCell(new Paragraph("日期:" + "2011-11-11", FontChinese11Normal));
                PdfPCell cell33 = new PdfPCell(new Paragraph("报销单号:" + "123456789", FontChinese11Normal));
                cell31.setBorder(0);
                cell32.setBorder(0);
                cell33.setBorder(0);
                table3.addCell(cell31);
                table3.addCell(cell32);
                table3.addCell(cell33);
                document.add(table3);
                // 加入空行
                Paragraph blankRow31 = new Paragraph(18f, " ", FontChinese11);
                document.add(blankRow31);

                // table4
                PdfPTable table4 = new PdfPTable(2);
                int width4[] = { 40, 60 };
                table4.setWidths(width4);
                PdfPCell cell41 = new PdfPCell(new Paragraph("公司:" + "XXX", FontChinese11Normal));
                PdfPCell cell42 = new PdfPCell(new Paragraph("部门:" + "XXX", FontChinese11Normal));
                cell41.setBorder(0);
                cell42.setBorder(0);
                table4.addCell(cell41);
                table4.addCell(cell42);
                document.add(table4);
                // 加入空行
                Paragraph blankRow41 = new Paragraph(18f, " ", FontChinese11);
                document.add(blankRow41);

                // table5
                PdfPTable table5 = new PdfPTable(1);
                PdfPCell cell51 = new PdfPCell(new Paragraph("报销说明:" + "XXX", FontChinese11));
                cell51.setBorder(0);
                table5.addCell(cell51);
                document.add(table5);
                // 加入空行
                Paragraph blankRow51 = new Paragraph(18f, " ", FontChinese18);
                document.add(blankRow51);

                // table6
                PdfPTable table6 = new PdfPTable(2);
                table6.getDefaultCell().setBorder(0);
                table6.setWidths(width21);
                PdfPCell cell61 = new PdfPCell(new Paragraph("报销明细", FontChinese16));
                cell61.setBorder(0);
                table6.addCell(image21);
                table6.addCell(cell61);
                document.add(table6);
                // 加入空行
                Paragraph blankRow4 = new Paragraph(18f, " ", FontChinese16);
                document.add(blankRow4);

                // table7
                PdfPTable table7 = new PdfPTable(6);
                BaseColor lightGrey = new BaseColor(0xCC, 0xCC, 0xCC);
                int width7[] = { 20, 18, 13, 20, 14, 15 };
                table7.setWidths(width7);
                PdfPCell cell71 = new PdfPCell(new Paragraph("费用类型", FontChinese11Bold));
                PdfPCell cell72 = new PdfPCell(new Paragraph("费用发生时间", FontChinese11Bold));
                PdfPCell cell73 = new PdfPCell(new Paragraph("详细信息", FontChinese11Bold));
                PdfPCell cell74 = new PdfPCell(new Paragraph("消费金币/币种", FontChinese11Bold));
                PdfPCell cell75 = new PdfPCell(new Paragraph("报销汇率", FontChinese11Bold));
                PdfPCell cell76 = new PdfPCell(new Paragraph("报销金额", FontChinese11Bold));
                // 表格高度
                cell71.setFixedHeight(25);
                cell72.setFixedHeight(25);
                cell73.setFixedHeight(25);
                cell74.setFixedHeight(25);
                cell75.setFixedHeight(25);
                cell76.setFixedHeight(25);
                // 水平居中
                cell71.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell72.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell73.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell74.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell75.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell76.setHorizontalAlignment(Element.ALIGN_CENTER);
                // 垂直居中
                cell71.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell72.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell73.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell74.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell75.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell76.setVerticalAlignment(Element.ALIGN_MIDDLE);
                // 边框颜色
                cell71.setBorderColor(lightGrey);
                cell72.setBorderColor(lightGrey);
                cell73.setBorderColor(lightGrey);
                cell74.setBorderColor(lightGrey);
                cell75.setBorderColor(lightGrey);
                cell76.setBorderColor(lightGrey);
                // 去掉左右边框
                cell71.disableBorderSide(8);
                cell72.disableBorderSide(4);
                cell72.disableBorderSide(8);
                cell73.disableBorderSide(4);
                cell73.disableBorderSide(8);
                cell74.disableBorderSide(4);
                cell74.disableBorderSide(8);
                cell75.disableBorderSide(4);
                cell75.disableBorderSide(8);
                cell76.disableBorderSide(4);
                table7.addCell(cell71);
                table7.addCell(cell72);
                table7.addCell(cell73);
                table7.addCell(cell74);
                table7.addCell(cell75);
                table7.addCell(cell76);
                document.add(table7);

                // table8
                PdfPTable table8 = new PdfPTable(6);
                int width8[] = { 20, 18, 13, 20, 14, 15 };
                table8.setWidths(width8);
                PdfPCell cell81 = new PdfPCell(new Paragraph("差旅报销", FontChinese12));
                PdfPCell cell82 = new PdfPCell(new Paragraph("2011-11-11", FontChinese12));
                PdfPCell cell83 = new PdfPCell(new Paragraph("XXX", FontChinese12));
                PdfPCell cell84 = new PdfPCell(new Paragraph("XXX", FontChinese12));
                PdfPCell cell85 = new PdfPCell(new Paragraph("XXX", FontChinese12));
                PdfPCell cell86 = new PdfPCell(new Paragraph("XXX", FontChinese12));
                // 表格高度
                cell81.setFixedHeight(25);
                cell82.setFixedHeight(25);
                cell83.setFixedHeight(25);
                cell84.setFixedHeight(25);
                cell85.setFixedHeight(25);
                cell86.setFixedHeight(25);
                // 水平居中
                cell81.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell82.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell83.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell84.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell85.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell86.setHorizontalAlignment(Element.ALIGN_CENTER);
                // 垂直居中
                cell81.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell82.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell83.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell84.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell85.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell86.setVerticalAlignment(Element.ALIGN_MIDDLE);
                // 边框颜色
                cell81.setBorderColor(lightGrey);
                cell82.setBorderColor(lightGrey);
                cell83.setBorderColor(lightGrey);
                cell84.setBorderColor(lightGrey);
                cell85.setBorderColor(lightGrey);
                cell86.setBorderColor(lightGrey);
                // 去掉左右边框
                cell81.disableBorderSide(8);
                cell82.disableBorderSide(4);
                cell82.disableBorderSide(8);
                cell83.disableBorderSide(4);
                cell83.disableBorderSide(8);
                cell84.disableBorderSide(4);
                cell84.disableBorderSide(8);
                cell85.disableBorderSide(4);
                cell85.disableBorderSide(8);
                cell86.disableBorderSide(4);
                table8.addCell(cell81);
                table8.addCell(cell82);
                table8.addCell(cell83);
                table8.addCell(cell84);
                table8.addCell(cell85);
                table8.addCell(cell86);
                document.add(table8);
                // 加入空行
                Paragraph blankRow5 = new Paragraph(18f, " ", FontChinese18);
                document.add(blankRow5);

                // table9
                PdfPTable table9 = new PdfPTable(3);
                int width9[] = { 30, 50, 20 };
                table9.setWidths(width9);
                PdfPCell cell91 = new PdfPCell(new Paragraph("", FontChinese12));
                PdfPCell cell92 = new PdfPCell(new Paragraph("收到的报销金额", FontChinese12));
                PdfPCell cell93 = new PdfPCell(new Paragraph("1000", FontChinese24));
                cell92.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell92.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell93.setHorizontalAlignment(Element.ALIGN_LEFT);
                cell93.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell91.setBorder(0);
                cell92.setBorder(0);
                cell93.setBorder(0);
                table9.addCell(cell91);
                table9.addCell(cell92);
                table9.addCell(cell93);
                document.add(table9);

                document.close();

            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        public static void main(String[] args) {
            BillPDF billPDF = new BillPDF();
            createBillPDF(billPDF);
        }
    }

    将图片等信息修改后可以直接运行。通过完全用java代码生成的这个案例可以更好的理解java对pdf的操作的一些属性和方法等。




    展开全文
  • Android使用iText生成pdf并读取pdf内容,iText是著名的开放源码的站点sourceforge的一个项目,可用来生成Pdf文件和读取Pdf文件内容.
  • 利用PDFLib生成PDF文档

    2013-07-24 11:16:38
    利用PDFLib生成PDF文档,生成 PDF 格式文件
  • java 生成pdf 签章

    2018-04-26 14:01:07
    java生成pdf并且进行签章,里面有三种技术,测试都可用
  • 生成pdf文件

    2014-04-29 21:23:11
    用iText,生成生成pdf,主要先制作pdf末班,添加域,在用java生成
  • Aspose.Pdf生成pdf例子

    2015-06-25 14:17:27
    Aspose.Pdf生成pdf例子,可以参考下
  • IText是用于生成PDF文档的一个java类库。 官方网站 :https://itextpdf.com/(一)通过maven引入Itext 的jar包 &lt;!-- 生成pdf --&gt; &lt;dependency&gt; &lt;groupId&gt;...

        IText是用于生成PDF文档的一个java类库。

        官方网站 :https://itextpdf.com/

    (一)通过maven引入Itext 的jar包

                    <!-- 生成pdf -->
    		<dependency>
    			<groupId>com.itextpdf</groupId>
    			<artifactId>itextpdf</artifactId>
    			<version>5.4.3</version>
    
    		</dependency>

    (二)读取PDF即模板的使用



    1、使用Adobe Acrobat 制作PDF模板(可以用word先编辑,另存为PDF格式)


    a)文本域:工具-内容编辑-编辑文本域图像(自动会选中)


    b)表单域:工具-表单-编辑-编辑-添加新域(或者编辑域)


    c)编辑表单域可以设置一个name,


    (三)实现代码

    	//申请信息表模板
    	private static String TEMPLATE_PDF_NAME="template.pdf";
    	//申请信息表模板
    	private static String APPLY_PDF_NAME="apply.pdf";
    
    public  String createPdfTest(List<LicApplyPersonEntity> personlist) {
    
    
    
    		
    		//生成申请信息表PDF
    		try {
    			String uploadPath = "E:/";
    			applicationPdf(licOrgApply, uploadPath);
    			return "yes";
    		} catch (Exception e) {
    			e.printStackTrace();
    			return "pdf处理失败,原因:"+e.getMessage();
    		} 
    		
    	}
      
     
    	/**
    	 * 生成信息表pdf
    	 */
    	public void applicationPdf(LicOrgApplyEntity licOrgApply,String uploadPath)
    			throws IOException, DocumentException {
    		
    		Gson gson = new Gson();
    		String json = gson.toJson(licOrgApply);
    		System.out.println(json);
    		Map<?, ?> map = gson.fromJson(json, HashMap.class);
    		
    		//获取模板路径  
    		//String PdfTemplateFile = "E:/"+TEMPLATE_PDF_NAME;
    		//获取 resources 中 模板文件
    		URL PdfTemplateFile =Resources.getResource(TEMPLATE_PDF_NAME);
    		// 生成的文件路径  
    		String PdfResultFile = uploadPath+ APPLY_PDF_NAME;
    		
    		// 模板pdf
    		//PdfReader pdfReader = new PdfReader(Global.getProperty("upload.path") + TEMPLATE_PDF_NAME);
    		PdfReader pdfReader = new PdfReader(PdfTemplateFile);
    		// 新pdf
    		FileOutputStream fileOutputStream = new FileOutputStream(PdfResultFile);
    		// 生成新的pdf
    		PdfStamper pdfStamper = new PdfStamper(pdfReader, fileOutputStream);
    		// 填充表单域
    		AcroFields acroFields = pdfStamper.getAcroFields();
    		
    		// 显示中文字体
    		//URL FontURL= Resources.getResource("SIMFANG.TTF");
    		//BaseFont ChineseBaseFont = BaseFont.createFont( Resources.getResource("SIMFANG.TTF"), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    		BaseFont ChineseBaseFont = BaseFont.createFont( "c://windows//fonts//simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 
    		//Font ChineseFont = new Font(ChineseBaseFont, 14, Font.NORMAL);
    		
    		acroFields.addSubstitutionFont(ChineseBaseFont);
    		
    		  
    		
    		// 循环使Map和表单域中字段对应
    		Map<String, Item> fieldmap = acroFields.getFields();
    		Set<Entry<String, Item>> set = fieldmap.entrySet();
    		Iterator<Entry<String, Item>> iterator = set.iterator();
    		while (iterator.hasNext()) {
    			Entry<?, ?> entry = (Entry<?, ?>) iterator.next();
    			String key = (String) entry.getKey();
    			}
    		}
    		  
            
            //模板中的变量赋值之后不能编辑 
    		pdfStamper.setFormFlattening(true);
    		//解析器关闭
    		pdfStamper.close();
    		//阅读器关闭
    		pdfReader.close();
    		
    	}

    参考博客:http://blog.csdn.net/u012228718/article/details/40706499


    展开全文
  • JAVA生成pdf文件

    2017-03-09 16:24:04
    java生成pdf文件
  • 1.用图片生成PDF: QPrinter printerPixmap(QPrinter::HighResolution); printerPixmap.setPageSize(QPrinter::A4); //设置纸张大小为A4 printerPixmap.setOutputFormat(QPrinter::PdfFormat); //设置输出格式为...

    1.用图片生成PDF:

     QPrinter printerPixmap(QPrinter::HighResolution);
            printerPixmap.setPageSize(QPrinter::A4);  //设置纸张大小为A4
            printerPixmap.setOutputFormat(QPrinter::PdfFormat);  //设置输出格式为pdf
            QString currentDateTime =QDateTime::currentDateTime().toString("_yyyyMMddhhmm");
            QString pdfPath=QDir::currentPath()+"/outPDF/"+sourceDir.dirName()+currentDateTime+".pdf";
            printerPixmap.setOutputFileName(pdfPath);
            QPixmap pixmap = QPixmap::grabWidget(report);  //获取界面的图片
    
            QPainter painterPixmap;
            painterPixmap.begin(&printerPixmap);
            QRect rect = painterPixmap.viewport();
            int multiple = rect.width() / pixmap.width();
            painterPixmap.scale(multiple, multiple); //将图像(所有要画的东西)在pdf上放大multiple-1倍
            painterPixmap.drawPixmap(0, 0, pixmap);  //画图
            painterPixmap.end();

    report是自定义类的对象。

    2.用文字生成PDF

     QPrinter printerText;  
        printerText.setOutputFormat(QPrinter::PdfFormat);  
        printerText.setOutputFileName("E:\\test_text.pdf");  
        QPainter painterText;  
        painterText.begin(&printerText);  
    
        QDateTime current_date_time = QDateTime::currentDateTime();  
        QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");  
    
        QPoint point(10, 10);  
        for (int i = 1; i <= 5; i++)  
        {  
            QString message = QString("%1          %2          %3").arg(QString::number(i)).arg(current_date).arg(QStringLiteral("北京"));  
            int y = point.y();  
            point.setY(y + 20);  
            painterText.drawText(point, message);  
            message.clear();  
        }  
        //printer_text.newPage();  //生成新的一页,可继续插入  
        painterText.end();  
    展开全文
  • 用途:根据PDF模板生成PDF文件,将数据库查询的数据插入到模板指定未知,然后生成新的PDF文件 原理: 代码说明:exprotPDF_Main 为主文件。调用了outpdf1的两个文件的方法。outpdf1里的方法,是通过outpdf2345678这...
  • Image2Pdf_4.3-批量生成PDF,双层PDF转换工具,有水印版。提供制作的双层PDF文件显示“文本层”识别文字功能,使用户可以直观的比对图像文字和识别文本,来判断文字识别的准确程度和效果。
  • PDFlib生成PDF文档

    2010-03-08 14:44:17
    利用PDFLib生成PDF文档 mhtl文档 含代码 PDF
  • 许多应用程序要求动态生成PDF文档。 这样的应用程序范围很广,从银行生成用于发送电子邮件的客户对账单,到购买特定书籍章节并以PDF格式接收它们的读者。 列表是无止境的。 在本文中,我们将使用iText Java库来生成...

    许多应用程序要求动态生成PDF文档。 这样的应用程序范围很广,从银行生成用于发送电子邮件的客户对账单,到购买特定书籍章节并以PDF格式接收它们的读者。 列表是无止境的。 在本文中,我们将使用iText Java库来生成PDF文档。 我们将带您看一个示例应用程序,以便您自己动手并更好地理解它。

    熟悉iText版本5.3.0

    iText是可从http://itextpdf.com免费获得的Java库。 iText库功能强大,除了生成PDF之外,还支持HTML,RTF和XML文档的生成。 您可以从文档中使用的各种字体中进行选择。 另外,iText的结构允许您使用相同的代码生成任何上述类型的文档。

    iText库包含用于生成各种字体的PDF文本,在PDF文档中生成表格,向页面添加水印等的类。 iText提供了更多功能。 不可能在一篇文章中演示所有这些内容。 我们将介绍PDF生成所需的基本知识。 有关更多详细信息,请参阅供应商提供的文档。

    我们将使用Eclipse来开发示例应用程序。 作为开放源代码的IDE,Eclipse是免费提供的并且功能强大。 您可以立即下载Eclipse。

    iText API:近距离观察

    com.itextpdf.text.Document是生成PDF文档的主要类。 这是要实例化的第一类。 创建文档后,您需要编写者才能写入文档。 com.itextpdf.text.pdf.PdfWriter是PDF编写器。 下面列出了一些其他常用的类:

    • com.itextpdf.text.Paragraph-此类表示缩进的段落。
    • com.itextpdf.text.Chapter此类表示PDF文档中的一章。 它是使用“ Paragraph作为标题并使用“ int作为章号创建的。
    • com.itextpdf.text.Font-此类包含字体的所有规范,例如字体系列,大小,样式和颜色。 在此类中,各种字体都声明为静态常量。
    • com.itextpdf.text.List-此类表示一个列表,该列表又包含多个ListItems
    • com.itextpdf.text.pdf.PDFPTable-这是一个表,可以放在绝对位置,也可以作为类Table添加到文档中。
    • com.itextpdf.text.Anchor-锚可以是参考,也可以是参考的目标。

    在Eclipse中下载和配置iText

    作为纯Java库,iText以JAR文件的形式出现。 下载该库后(假设位于路径C:\ temp),以下步骤将在Eclipse环境中配置iText库:

    1. 在Eclipse中创建一个名为iText的新Java项目。
    2. 在Package Explorer视图中右键单击iText项目,然后选择Properties
    3. 单击Java构建路径 。 在“库”选项卡上,单击“ 添加外部JAR”
    4. 浏览到C:\ temp目录,然后在此目录中选择itext-5.3.0.jar。
    5. 单击确定

    现在已配置了iText,并且Eclipse准备创建Java应用程序以生成动态PDF文档。

    样品申请

    有什么比您自己动手制作的工作样本更好地展示任何技术的呢? 现在,您已经拥有必需的工具(Eclipse IDE)和库(iText库),我们都可以设计和开发示例运行程序。

    让我们创建一个简单的PDF文档,其中包含一些基本元素,例如纯文本,带有非默认字体的彩色文本,表格,列表,章节,节等。此应用程序的目的是使您熟悉使用iText库的方式。 有很多类可以为您做很多与PDF文档生成相关的工作。 不可能涵盖所有这些课程。 iText的javadocs是有关如何使用这些类的很好的信息来源。 让我们开始编码。

    第一步是创建一个文档。 文档是PDF文档所有元素的容器。

    清单1.文档对象的实例化
    Document document = new Document(PageSize.A4, 50, 50, 50, 50);

    第一个参数是页面大小。 接下来的参数分别是左,右,上和下页边距。 该文档的类型尚未定义。 这取决于您创建的编写器的类型。 对于我们的示例,我们选择com.itextpdf.text.pdf.PdfWriter。 其他作家是HtmlWriter,RtfWriter,XmlWriter以及其他一些作家。 他们的名字充分说明了他们的目的。

    清单2.创建PdfWriter对象
    PdfWriter writer = PdfWriter.getInstance(document, \
    
    new FileOutputStream("C:\\ITextTest.pdf"));
    
    document.open();

    第一个参数是对文档对象的引用,第二个参数是将在其中写入输出的文件的绝对名称。 接下来,我们打开文档进行编写。

    现在,我们将在文档的第一页上添加一些文本。 借助com.itextpdf.text.Paragraph可以添加任何文本。 您可以使用文本以及字体,颜色,大小等的默认设置来创建默认段落。 否则,您可以提供自己的字体。 在本文中,我们还将讨论锚定(链接)到PDF文档。 在此PDF中,我们使用backToTop作为链接。 当您单击backToTop链接时,它将带您到文档的第一页。 您需要将文本设置为首页的定位目标。 让我们看看如何设置锚定目标并将字体设置为添加的段落。

    清单3.创建段落对象
    Anchor anchorTarget = new Anchor("First page of the document.");
          anchorTarget.setName("BackToTop");
          Paragraph paragraph1 = new Paragraph();
    
          paragraph1.setSpacingBefore(50);
    
          paragraph1.add(anchorTarget);
          document.add(paragraph1);
    
    document.add(new Paragraph("Some more text on the \
    
    first page with different color and font type.", 
    
    FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD,	new CMYKColor(0, 255, 0, 0))));

    图1显示了清单3中的代码示例输出。 要关闭文档,请添加document.close(); 清单3中的代码末尾。

    图1.清单3中的代码示例输出
    清单3中的代码示例输出

    您刚刚看到了如何在PDF文档中添加纯文本。 接下来,我们需要在文档中添加一些复杂的元素。 让我们从创建一个新的章节开始。 章节是一个特殊部分,从新页面开始,默认情况下显示数字。

    清单4.创建章对象
    Paragraph title1 = new Paragraph("Chapter 1", 
    
       FontFactory.getFont(FontFactory.HELVETICA, 
       
       18, Font.BOLDITALIC, new CMYKColor(0, 255, 255,17)));
       
    Chapter chapter1 = new Chapter(title1, 1);
          
    chapter1.setNumberDepth(0);

    清单4的代码中,我们创建了一个新的章对象chapter1 ,标题为“ This is Chapter 1”。 将编号深度设置为0将不会在页面上显示章节编号。

    节是章节的子元素。 在清单5的代码中,我们创建了一个标题为“这是第1章的第1节”的部分。 要在此部分下添加一些文本,我们创建另一个段落对象someSectionText ,并将其添加到该部分对象中。

    清单5.创建节对象
    Paragraph title11 = new Paragraph("This is Section 1 in Chapter 1", 
    
           FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, 
       
           new CMYKColor(0, 255, 255,17)));
       
    Section section1 = chapter1.addSection(title11);
    
    Paragraph someSectionText = new Paragraph("This 
    
    text comes as part of section 1 of chapter 1.");
    
    section1.add(someSectionText);
    
    someSectionText = new Paragraph("Following is a 3 X 2 table.");
    
    section1.add(someSectionText);

    在添加表之前,让我们看一下文档的外观。 添加以下两行以关闭图2中的文档。 然后编译并执行程序以生成PDF文档: document.add(chapter1);document.close();

    图2.本章的示例输出
    本章样本输出

    接下来,我们创建一个表对象。 表格包含行和列的矩阵。 一行中的一个单元格可以跨越多于一列。 同样,一列中的一个单元格可以跨越多于一行。

    清单6.创建表对象
    PdfPTable t = new PdfPTable(3);
    
          t.setSpacingBefore(25);
          
          t.setSpacingAfter(25);
          
          PdfPCell c1 = new PdfPCell(new Phrase("Header1"));  
          
          t.addCell(c1);
          
          PdfPCell c2 = new PdfPCell(new Phrase("Header2"));
          
          t.addCell(c2);
          
          PdfPCell c3 = new PdfPCell(new Phrase("Header3"));
          
          t.addCell(c3);
          
          t.addCell("1.1");
          
          t.addCell("1.2");
          
          t.addCell("1.3");
          
          section1.add(t);

    清单6的代码中,我们创建了一个具有三列的PDFPTable对象t ,并继续添加行。 接下来,我们创建三个具有不同文本的PDFPcell对象。 我们继续将它们添加到表中。 它们将从第一列开始添加到第一行,然后移至同一行的下一列。 该行完成后,下一个单元格将添加到下一行的第一列。 只需提供单元格的文本,例如t.addCell("1.1");也可以将单元格添加到表中t.addCell("1.1"); 。 最后,将表对象添加到节对象。

    最后,让我们看看如何将列表添加到PDF文档。 列表包含许多ListItem 。 列表可以编号或不编号。 将第一个参数传递为true意味着您要创建编号列表。

    清单7.创建列表对象
    List l = new List(true, false, 10);
    
    l.add(new ListItem("First item of list"));
    
    l.add(new ListItem("Second item of list"));
    
    section1.add(l);

    我们已经将所有内容添加到了chapter1对象中。 现在,我们在java项目中添加一个图像。 我们可以使用以下Image方法之一缩放图像:

    • scaleAbsolute()
    • scaleAbsoluteWidth()
    • scaleAbsoluteHeight()
    • scalePercentage()
    • scaleToFit()

    清单8中 ,我们使用了scaleAbsolute。 然后将图像对象添加到该部分。

    清单8.将图像添加到主文档
    Image image2 = Image.getInstance("IBMLogo.bmp");
    
          image2.scaleAbsolute(120f, 120f);
          
          section1.add(image2);

    iText中的com.itextpdf.text.Anchor类表示指向外部网站或文档内部的链接。 锚点(链接)可以像网页中的链接一样单击。 要添加锚点,我们需要创建一个新的锚点并将引用设置为清单3中创建的Anchor目标。 然后将锚点添加到该部分,并将该部分添加到文档。

    清单9.将Anchor添加到主文档
    Paragraph title2 = new Paragraph("Using Anchor", 
    
            FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, 
    
            new CMYKColor(0, 255, 0, 0)));
    
    section1.add(title2);
    
    title2.setSpacingBefore(5000);
    
    Anchor anchor2 = new Anchor("Back To Top");
    
    anchor2.setReference("#BackToTop");
    
    section1.add(anchor2);

    没有更多的元素可以添加到chapter1 ,是时候将chapter1添加到主document 。 与示例应用程序一样,我们还将在此处关闭文档对象。

    清单10.在主文档中增加一章
    document.add(chapter1);
    
    document.close();

    运行示例应用程序

    1. 下载示例应用程序j-itextsample.jar(请参阅下载 )。
    2. 将j-itextsample.jar解压缩到目录中。 例如,如果将其提取到C:\ temp,则将源文件和类文件放入C:\ temp \ com \ itext \ test。
    3. 打开命令提示符,并将目录更改为C:\ temp。
    4. 在此命令提示符下设置系统的类路径。 在系统的类路径中包含C:\temp\itext-5.3.0.jar 。 在Windows®上,执行命令set classpath=C:\temp\itext-5.3.0.jar;%classpath%
    5. 使用命令java com.itext.test.ITextTest运行该应用程序。

    该程序将在C:\处生成ITextTest.pdf文档。 图3显示了PDF文档首页的屏幕截图。

    图3. PDF文档的屏幕截图
    PDF文档的屏幕截图

    图4显示了第1章及其在PDF文档中的节,文本,表格,列表和图像的屏幕截图。

    图4. PDF文档的屏幕截图
    PDF文档的屏幕截图

    图5显示了PDF文档中Anchor链接的屏幕截图。

    图5. PDF文档的屏幕截图
    PDF文档的屏幕截图

    结论

    您刚刚看到了PDF生成的一些基本元素。 iText的优点在于,您可以在不同类型的编写器中使用相同元素的语法。 另外,您可以将编写器的输出重定向到控制台(对于XML和HTML编写器),Servlet的输出流(对于对PDF文档的Web请求的响应)或任何其他类型的OutputStream 。 在响应相同的情况下,iText也很方便,但是响应的类型因PDF,RTF,HTML或XML而异。 iText允许您创建水印,加密文档以及其他输出功能。


    翻译自: https://www.ibm.com/developerworks/java/library/os-javapdf/index.html

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 201,643
精华内容 80,657
关键字:

如何生成pdf