java之pdf打印

前言

网上搜了一堆如何把打印的纸张横向,发现颇为花费时间,特再次记录一下

解决办法

Document pdfDoc = new Document(PageSize.A4.rotate());

说明:加上 rotate()函数即可

教程

知识点:

1、新建 完整pdf文档

依赖:

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

上代码:

public ByteArrayOutputStream generatePDF(){
	Document pdfDoc = new Document(PageSize.A4);	//新建 文档
	ByteArrayOutputStream buffer = new ByteArrayOutputStream(); //新建输出流 
	PdfWriter writer = PdfWriter.getInstance(pdfDoc, buffer); //实例化 文档写对象,写入到 buffer 输出流中
	pdfDoc.open();	//打开文档对象

	pdfDoc.newPage();	//新建一个 Page页面
	
	ContentFont cf = new ContentFont();	//新建字体
	//定义段落
	Paragraph paraTitle = new Paragraph();
	paraTitle.setAlignment(Element.ALIGN_CENTER);
	//设置段落前后间距
	paraTitle.setSpacingAfter(5);
	paraTitle.setSpacingBefore(5);
	//设置缩进
	paraTitle.setIndentationLeft(50);
	paraTitle.setIndentationRight(50);
	paraTitle.setFont(cf.getTitleFont());	//设置字体
	Chunk chunk = new Chunk(title);		//新建行内块元素
	paraTitle.add(chunk);				//将块加入 段落对象
	Chunk spaceChunk = new Chunk(" ");
	float f = 100f;
	spaceChunk.setCharacterSpacing(f);	//表示在 块元素之间添加固定距离 的空白
	paraTitle.add(Chunk.NEWLINE);		//表示 换行
	Image image2 = Image.getInstance(bys);	//新建 图片对象
	image2.setAlignment(Image.MIDDLE| Image.TEXTWRAP); 	//设置图片垂直居中,文字环绕在图片周围
	Chunk chunkImage = new (image2,0,0,true);	//将图片初始化在块对象
	paraTitle.add(chunkImage); 			//将块添加到 段落对象
	document.add(paraTitle);			//将段落 加入到 文档


	//定义表格对象
	PdfPTable table = new PdfPTable(4);
    table.setTotalWidth(400);
	table.setWidths(new float[] {100,100,100,100});
	table.setLockedWidth(true);

  		PdfPCell cell;	//定义 单元格对象
		cell = new PdfPCell(new Phrase("标题", cf.getTitleFont()));		//初始化,内容与字体
		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);		//设置水平方向
		cell.setHorizontalAlignment(Element.ALIGN_CENTER);		//设置垂直方向
		cell.setFixedHeight(45);								//设置行高
		cell.setBorder(0);										//表示边框宽为 0 ,表示去掉边框
		cell.setColspan(4);										//表示合并行单元格
		cell.setRowspan(2);										//表示合并 列方向的单元格
		table.addCell(cell);									//将单元格加入到表格中

		/*有的时候,只加了一个单元格对象,生成pdf会报错*/
		cell = new PdfPCell(new Phrase("内容", cf.getTitleFont()));		//初始化,内容与字体
		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);		//设置水平方向
		cell.setHorizontalAlignment(Element.ALIGN_CENTER);		//设置垂直方向
		cell.setFixedHeight(45);								//设置行高
		cell.setBorder(0);										//表示边框宽为 0 ,表示去掉边框
		cell.setColspan(4);										//表示合并行单元格
		cell.setRowspan(2);										//表示合并 列方向的单元格
		table.addCell(cell);									//将单元格加入到表格中
	pdfDoc.add(table);		


	pdfDoc.close();	//关闭文档对象
	return buffer; 
}

拓展一:将pdf 文件 以压缩包的形式返回

实现方式用 ZipOutputStream这个类

话不多说,上代码

		public void returnZipPackage(){
			String nameZip = "压缩包.zip";
			String namez;
			String userAgent = this.getRequest().getHeader("user-agent").toLowerCase();
			
			if(userAgent.contains("mise")||userAgent.contains("like gecko")) {
				namez = URLEncoder.encode(nameZip,"UTF-8");
			}else {
				namez = new String(nameZip.getBytes("UTF-8"),"ISO-8859-1");
			}
			this.getResponse().setHeader("Content-Disposition", "attachment;filename="+namez);
			ZipOutputStream zo = new ZipOutputStream(this.getResponse().getOutputStream());
			for(int i=0;i<100;i++){
				zo.putNextEntry(new ZipEntry("demo"+i+".pdf"));
				int len=0;
				byte[] buf = new byte[1024];
				ByteArrayOutputStream buffer = generatePDF();	
				ByteArrayInputStream inputStream= new ByteArrayInputStream(buffer.toByteArray());
				while((len=inputStream.read(buf,0,1024))!=-1) {
					zo.write(buf,0,len);
				}
				zo.closeEntry();
				inputStream.close();
			}
			zo.close();
		}


版权声明:本文为weixin_43976226原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。