PDF模板打印(中文折行,包括图片)
PDF模板打印(中文折行,包括图片)
通过PDF模板,填充对象包括图片,生成pdf,包含中文折行以及图片插入
后台代码
生成pdf字节流文件
/*** turnPhotoPdf:带附件图片的pdf* @param object : 需要注入PDF模板的业务对象* @param pdfFileName : PDF模板文件名称(此处需要针对不通对象使用不同模板所以做了部分修改)* @param request : * @param fileUploadList : PDF中显示图片为附件服务器中下载的图片集合* @return byte[] : 填充后的pdf文件流转为字节数组* @throws IOException * @throws DocumentException */
public static byte[] turnPhotoPdf(Object object,String pdfFileName,List<FileUpload> fileUploadList, HttpServletRequest request) throws DocumentException, IOException{//PDF模板的文件路径String fileName=request.getServletContext().getRealPath("/")+"pdf\\pdftemplate\\"+pdfFileName;PdfReader reader = new PdfReader(fileName);ByteArrayOutputStream bos = new ByteArrayOutputStream();PdfStamper ps = new PdfStamper(reader, bos);ps.getReader().getFileLength();ps.getReader().getAcroForm();BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);bf.setCompressionLevel(11);ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();fontList.add(bf);AcroFields fields = ps.getAcroFields();fields.setSubstitutionFonts(fontList);PDFUtil.fillData(fields, object);//添加图片for(int num=0;num<fileUploadList.size();num++){if(fields.getFieldPositions("img"+(num+1)) == null){break;}//获取PDF模板中图片域信息int page = fields.getFieldPositions("img"+(num+1)).get(0).page;Rectangle signReact = fields.getFieldPositions("img"+(num+1)).get(0).position;float x = signReact.getLeft();float y = signReact.getBottom();//此处为FTP登录下载FTP服务器的图片(可以根据各自需要使用自己的图片获取方式)FtpUtils ftp=new FtpUtils(SpringContextUtil.getMessage("ftpip"),Integer.valueOf(SpringContextUtil.getMessage("ftpport")),SpringContextUtil.getMessage("ftpuser"),SpringContextUtil.getMessage("ftppassword"));InputStream is = ftp.getInputStream(fileUploadList.get(num).getPath(), fileUploadList.get(num).getRandomFileName());ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[1000]; int rc = 0; while ((rc = is.read(buff, 0, 1000)) > 0) { swapStream.write(buff, 0, rc); } byte[] in2b = swapStream.toByteArray();//图片显示位置设置Image image = Image.getInstance(in2b);PdfContentByte under = ps.getOverContent(page);image.scaleToFit(signReact.getWidth(),signReact.getHeight());float imageWidth = image.getPlainWidth();float imageLeft = (signReact.getWidth() - imageWidth)/2;image.setAbsolutePosition(x+imageLeft,y);under.addImage(image);//此处为本人业务系统中某一字段的数据处理(可以忽略)fields.setField("description"+(num+1), fileUploadList.get(num).getDescription());}//true为可编辑,false为PDF还可以修改.ps.setFormFlattening(true);ps.close();return bos.toByteArray();
}
/**
* 填充模板
*/
public static void fillData(AcroFields fields, Object data)throws IOException, DocumentException {String[] fieldNames = getFiledName(data); for(int j=0 ; j<fieldNames.length ; j++){String name = fieldNames[j];Object value = getFieldValueByName(name,data);if(value != null){fields.setField(name, fields.getField(name)+value.toString());}}
}
private static String[] getFiledName(Object o){ Field[] fields=o.getClass().getDeclaredFields(); String[] fieldNames=new String[fields.length]; for(int i=0;i<fields.length;i++){ fieldNames[i]=fields[i].getName(); } return fieldNames;
}private static Object getFieldValueByName(String fieldName, Object o) { try { String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = "get" + firstLetter + fieldName.substring(1); Method method = o.getClass().getMethod(getter, new Class[] {}); Object value = method.invoke(o, new Object[] {}); return value; } catch (Exception e) { return null; }
}
/**
* PDF文件流整合(此处为引用其他网站信息,没做更改可直接使用)
* @param streamOfPDFFiles : pdf文件流集合
* @param outputStream
* @param paginate
*/
public static void concatPDFs(List<InputStream> streamOfPDFFiles,OutputStream outputStream, boolean paginate) {Document document = new Document();try {List<InputStream> pdfs = streamOfPDFFiles;List<PdfReader> readers = new ArrayList<PdfReader>();int totalPages = 0;Iterator<InputStream> iteratorPDFs = pdfs.iterator();// Create Readers for the pdfs.while (iteratorPDFs.hasNext()) {InputStream pdf = iteratorPDFs.next();PdfReader pdfReader = new PdfReader(pdf);readers.add(pdfReader);totalPages += pdfReader.getNumberOfPages();}// Create a writer for the outputstreamPdfWriter writer = PdfWriter.getInstance(document, outputStream);document.open();BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA,BaseFont.CP1252, BaseFont.NOT_EMBEDDED);PdfContentByte cb = writer.getDirectContent(); // Holds the PDF// dataPdfImportedPage page;int currentPageNumber = 0;int pageOfCurrentReaderPDF = 0;Iterator<PdfReader> iteratorPDFReader = readers.iterator();// Loop through the PDF files and add to the output.while (iteratorPDFReader.hasNext()) {PdfReader pdfReader = iteratorPDFReader.next();// Create a new page in the target for each source page.while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {document.newPage();pageOfCurrentReaderPDF++;currentPageNumber++;page = writer.getImportedPage(pdfReader,pageOfCurrentReaderPDF);cb.addTemplate(page, 0, 0);// Code for pagination.if (paginate) {cb.beginText();cb.setFontAndSize(bf, 9);cb.showTextAligned(PdfContentByte.ALIGN_CENTER, ""+ currentPageNumber + " of " + totalPages, 520,5, 0);cb.endText();}}pageOfCurrentReaderPDF = 0;}outputStream.flush();document.close();outputStream.close();} catch (Exception e) {e.printStackTrace();} finally {if (document.isOpen())document.close();try {if (outputStream != null)outputStream.close();} catch (IOException ioe) {ioe.printStackTrace();}}
}
模板制作
将word文件转为pdf文件,通过Adobe Acrobat DC软件打开PDF然后点击准备表单生成对应文本域,此处文本域还可自行添加
这里一定要注意的是如果是图片插入的话需要将图片域添加进去之后将图片域的通用属性表单域设置为隐藏,否则图片会显示到图片域图层的下边.
用到的jar包
PDF模板打印(中文折行,包括图片)相关推荐
- springboot pdf模板打印
springboot pdf模板打印 1.下载Adobe Acrobat DC工具来制作pdf的模板 打开一个pdf 2.制作pdf模板 把自动生成的文本框删除 然后 拖入文本框并自定义键 导入mav ...
- Java 填充数据到pdf模板打印
js代码: <% String filepath = request.getRealPath("/"); %>var filepath = $("#filep ...
- 【C#】C#调用Bartender模板打印,输出图片,PDF
上篇文章:[C#]C#调用Bartender模板打印 首先,新建bt模板,再代码调用 直接上代码 public class BTHelper {/// <summary>/// 打印/// ...
- Android iText向pdf模板插入数据和图片
需求 这些日志在写App程序,有这么一个需求,就是需要生成格式统一的一个pdf文件,并向固定表格中填充数据,并且再在pdf中追加两页图片. 方案 手工设计一个pdf模板,这个具体步骤就不再赘述,可以网 ...
- itext通过pdf模板填充数据并调用打印机打印
使用itext5对生成的pdf模板进行编辑填充数据,一种是通过绝对定位去做,简单的可以,通用性太差,第二种是通过pdf域来填充字段,通用性很强 在使用过程中遇到的问题: 网上都是通过这种字体设置中文的 ...
- java使用itext将图片放到pdf模板的指定位置
java使用itext将图片放到pdf模板的指定位置 前面的准备步骤可以参考我的上一篇文章 这里直接上代码 这里用的图片是路径的形式,还有种情况是图片是base64的时候,这种情况就需要转一下图片格式 ...
- java使用itext填充pdf模板,超简单教学,有手就行
java使用itext填充pdf模板 1.先去建一个Word文件,设置好想要填充的地方,留好位置,设置好下划线 2.将Word另存为pdf 3.打开电脑中的Adobe Acrobat pro DC(这 ...
- java pdf模板填充生成pdf打印 (亲测有效)
//先要制作好pdf模板(可以在word 里面画好,导出保存pdf文件), 下载Adobe Acrobat DC 工具 后打开 pdf 里面带格式的,然后 点击 准备表单按钮 你可以拖动 文本 和文本 ...
- java pdf工具类_Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)...
Java PDF工具类(一)| 使用 itextpdf 根据设置好的PDF模板填充PDF(文字和图片) 相关文章: Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文 ...
最新文章
- Centos 6启动流程详解
- linux 进程 地址空间 内存分布 简介
- Python 格式化输出和while循环的两个小练习
- 【产品】场景化需求洞察
- java解压gz文件
- 美国36%流量背后 Netflix CDN分发算法优化
- java使用jeids实现redis2.6的list操作(4)
- 【转】设置Win32窗口背景颜色
- python lambda map reduce_简单了解python filter、map、reduce的区别
- linux下Java环境的配置
- VCSA 6.X(VMware vCenter Server Appliance)空间不足问题处理
- php dede 发布时间_DedeCMS发布时间显示多少天月年前
- 方差(variance)、标准差(Standard Deviation)、均方差、均方根值(RMS)、均方误差(MSE)、均方根误差(RMSE)
- ios真机调试出现“不受信任的开发者”解决方法
- 3.3Packet Tracer - 实施基本连接
- css网站变灰色代码
- Kibana常用搜索语法
- 第二章:1、复合函数求导
- Tribon快捷按钮图标格式
- 微信授权能获取那些数据字段,微信授权获取的字段,微信授权能获取到的数据,微信授权
热门文章
- 知道这10个软件,策划再复杂的活动都不怕
- php+微信开发实现微信图书馆图书查询
- 如何将手机中的照片制作成视频?想不到方法这么简单,涨知识了
- 1. 饶明新 校公开课六年级下册《数学广角-鸽巢问题》照片
- android视频旋转处理方法
- 榆林国号和计算机学校,榆林学院排名2021 陕西排名第26全国排名第607
- html flex布局水平居中,CSS3 Flexbox轻松实现元素的水平居中和垂直居中
- AD7606/AD7616使ZYNQ在能源电力领域如虎添翼,可实现16/32/64通道AD同步采样
- 解决Could not open input file: think问题
- 如何去除WPS文档中出现很多圆点和箭头