PDF作为日常常见的文件格式之一,有时候经常需要使用到。在Java中生成PDF的方式一般有:itext-PdStamper pdfStamper(根据模板生成PDF),itext-Document document(使用代码编写)等。

使用IText生成PDF:IText是一个能够快速生成PDF文件的Java类库,IText的Java类对于那些要生成包括文本,表格,图形的只读文档是很好用的。

IText依赖jar包 (百度云下载)

https://pan.baidu/s/1ymVgFjE6oSoS4VI2UKRCWg

API接口地址:https://api.itextpdf/itex/

在java项目导入依赖jar包,如下

itext-asian.jar 中文支持

 

Document对象 构造方法

Document(Rectangle pageeSize,float marginLeft,float marginTop,float marginBottom) 分别代表PDF页面大小,内容距离文档边的距离。

默认 Document() 无参 默认为 A4 ,36,36,36,36

属性

版本(PdfVersionImp)、标题(Title)、作者(Author)、主题(Subject)、关键字(Keywords)、创建者(Creator)等

方法

add() 向文档添加内容  newPage()添加下一页 getPageSize()页面大小等等方法

Rectangle对象 (页面对象)

常用的构造方法 Rectangle(PageSize.A4)

属性:NO_BORDER (无边框) ,

方法:rotate()横向打印 setBackgroundColor()设置背景色 setBorder()设置边框 setBorderColor()设置边框颜色

Element接口

内容对象差不多都实现了该接口,可以设置一些方位参数,如居中对齐。

Paragraph段落对象 方法  add(Element)添加 以及一些设置段落文字格式的方法

 

PDF文档生成(不使用模板)

FileOutputStream out;

       @Test

 public void test() throws DocumentException, MalformedURLException, IOException {

           out = new FileOutputStream("D:\\Demo\\.pdf");

            // 设置页面的属性 

            Rectangle tRectangle = new Rectangle(PageSize.A4); // 页面大小 

            tRectangle.setBackgroundColor(BaseColor.WHITE); // 页面背景色 

            tRectangle.setBorder(1220);// 边框 

            tRectangle.setBorderColor(BaseColor.BLUE);// 边框颜色 

            tRectangle.setBorderWidth(244.2f);// 边框宽度 

            Document doc = new Document(tRectangle);// 定义文档  

            doc = new Document(tRectangle.rotate());// 横向打印 

            PdfWriter writer = PdfWriter.getInstance(doc, out);// 书写器 

            writer.setPdfVersion(PdfWriter.PDF_VERSION_1_2);//版本(默认1.4) 

            //设置PDF文档属性 

            doc.addTitle("");// 标题 

            doc.addAuthor("朱自清");// 作者 

            doc.addSubject("春天的脚步近了");// 主题 

            doc.addKeywords("");// 关键字 

            doc.addCreator("田野上的风筝");// 创建者 

            Paragraph tParagraph = new Paragraph(""  , getChineseFont()); 

            tParagraph.setAlignment(Element.ALIGN_JUSTIFIED);// 对齐方式 

Paragraph  tParagraphs = new Paragraph("盼望着,盼望着,东风来了春天的脚步近了。一切都像刚睡醒的样子,欣欣然张开了眼。山朗润起来了,水涨起来了,太阳的脸红起来了", getChineseFont()); 

            tParagraph.setAlignment(Element.ALIGN_CENTER);// 居中

            tParagraph.setIndentationLeft(12);// 左缩进 

            tParagraph.setIndentationRight(12);// 右缩进 

            tParagraph.setFirstLineIndent(24);// 首行缩进 

            tParagraph.setLeading(20f);// 行间距 

            tParagraph.setSpacingBefore(5f);// 设置上空白 

            tParagraph.setSpacingAfter(10f);// 设置段落下空白

            doc.setMargins(10, 20, 30, 40);// 页边空白 

            Image img = Image.getInstance("D:\\Demo\\spring.png"); 

            img.setAlignment(Image.MIDDLE);  //设置图片居中

            img.setBorder(Image.BOX); 

            img.setBorderWidth(10); 

            img.setBorderColor(BaseColor.WHITE); 

            img.scaleToFit(900, 350);// 设置图片大小 

            doc.open();// 打开文档 

            ///  doc.add(tRectangle);

            doc.add(tParagraph); //添加段落

            doc.add(tParagraphs); 

            doc.add(img); //添加img

          //  doc.newPage();    //添加下一页 

          //  writer.setPageEmpty(true);// fasle-显示空内容的页;true-不会显示 

            doc.close();  //记得关闭document

      }

//支持中文 设置字体,字体颜色、大小等

public Font getChineseFont() { 

            BaseFont simpChinese

            Font ChineseFont = null

            try

            simpChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); 

            ChineseFont = new Font(simpChinese, 12, Font.NORMAL, BaseColor.BLUE); 

            } catch (DocumentException e) { 

                e.printStackTrace(); 

            } catch (IOException e) { 

                e.printStackTrace(); 

            } 

            return ChineseFont

        } 

使用IText生成PDF文件(无模板),仔细看官方API文档即可轻松创建PDF文档。

运行

 

 

使用模板生成PDF文件(准备一个PDF模板)

模板的制作;使用word文档新建一个内容文档,如在文档放一个表格,将文档转为PDF格式,转为PDF文件后,使用PDF编辑器打开(工具可以使用Adobe Acrobat Pro),在PDF编辑器里添加表单域,一般如果是内容是表格的话,该工具会自动识别并添加域。也可以自己添加域,建议自己添加文本域,(这样比自动添加要稳)并设置字体属性,属性包括字体大小,样式。对齐等。

如下,高亮部分代表表单域。

下面直接上代码

public void fillTemplate() {

        try {

FileOutputStream out = new FileOutputStream("D:\\is\\夏季.pdf");// 输出流

PdfReader reader = new PdfReader("F:\\Java\\PDF模板\\夏季.pdf");//读取pdf模板

ByteArrayOutputStream  bos = new ByteArrayOutputStream();

PdfStamper stamper = new PdfStamper(reader, bos);

AcroFields form = stamper.getAcroFields();

String[] str = { "星火小学", "2019-8-1", "8:00-20:00"};//定义数组,用于赋值

BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); //设置中文

ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();

fontList.add(bf); //添加字体

form.setSubstitutionFonts(fontList); //设置替换字体

Iterator<String> it=form.getFields().keySet().iterator();//得到字段迭代器

while (it.hasNext()) {//遍历输出表单域名与值

                String name = it.next().toString();

                form.setField(name, str[i]);

                System.out.println("name="+name+";str="+str[i++]);

            }

            stamper.setFormFlattening(true);// 设置为fasle,生成PDF将不能编辑

            stamper.close();//关闭PdfStamper

            Document doc = new Document();//实例化Document对象

            PdfCopy copy = new PdfCopy(doc, out);

            doc.open();//打开文档

            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);

            copy.addPage(importPage);

            doc.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

运行上面方法

总结:不使用模板生成PDF文件,模板不固定,可以根据代码进行调整,但维护的代码比较多,使用模板生成PDF文件:代码简单明了,但花在准备模板的时间也很多,而且表单域的长度也固定,超出可能会显示不全

更多推荐

Java生成PDF文件