使用itext获取pdf模板,生成pdf
Posted Wonderchn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用itext获取pdf模板,生成pdf相关的知识,希望对你有一定的参考价值。
前置
使用itext前请往pom中管理相关依赖包
<!-- 生成pdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
<!-- <version>5.5.13</version>-->
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.11</version>
<scope>compile</scope>
</dependency>
利用itext在线获取pdf模板,并通过反射进行相关模板值的插入
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
@Controller
public class PdfController
@GetMapping("/generate-pdf")
public void generatePdf(HttpServletResponse response) throws Exception
// 从网站上获取PDF文件的URL
String pdfUrl = "http://example.com/sample.pdf";
URL url = new URL(pdfUrl);
// 读取PDF文件
InputStream input = url.openStream();
PdfReader reader = new PdfReader(input);
input.close();
// 填充表单
ByteArrayOutputStream output = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, output);
AcroFields form = stamper.getAcroFields();
//设置中文
// 设置中文字体并嵌入到PDF文件中
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf);
//取出报表模板中的所有字段
AcroFields fields = stamper.getAcroFields();
fields.setSubstitutionFonts(fontList);
// 获取实体类属性与PDF表单字段的映射关系
Map<String, String> fieldMappings = getFieldMappings();
// 从MyBatis查询得到实体类
MyEntity entity = mybatisMapper.getEntityById(1L);
// 使用反射机制填充表单
for (Field field : entity.getClass().getDeclaredFields())
String fieldName = field.getName();
String pdfFieldName = fieldMappings.get(fieldName);
if (pdfFieldName != null && form.getFieldType(pdfFieldName) == AcroFields.FIELD_TYPE_TEXT)
field.setAccessible(true);
String value = String.valueOf(field.get(entity));
form.setField(pdfFieldName, value);
stamper.setFormFlattening(true);
stamper.close();
// 输出PDF文件
ByteArrayInputStream bais = new ByteArrayInputStream(output.toByteArray());
IOUtils.copy(bais, response.getOutputStream());
response.setContentType(MediaType.APPLICATION_PDF_VALUE);
response.setHeader("Content-Disposition", "attachment; filename=sample-filled.pdf");
response.flushBuffer();
bais.close();
private Map<String, String> getFieldMappings()
// 这里返回实体类属性与PDF表单字段的映射关系
// 左侧是实体类字段 右侧是对应pdf字段
// 例如:Map<String, String> fieldMappings = new HashMap<>();
// fieldMappings.put("name", "nameField");
// fieldMappings.put("email", "emailField");
// return fieldMappings;
利用反射机制优化iText生成PDF文件
使用Itext搜索和替换PDF
我需要根据一些用户输入生成PDF。输出PDF有一些图像,表格和文本。我认为Itext对于以编程方式生成此报告不是用户友好的。
由于我需要生成的报告非常复杂,我想知道是否可以创建模板PDF然后加载 - >搜索 - >替换我想要的字符串/图像。
模板PDF可以是标记的pdf。
- 有可能吗?
- 这是最好的方法吗?
编辑:我正在使用WPF + MVVM + .Net 3.5
答案
替换PDF文件中的文本并不简单。 PDF fileformat在文件末端使用字典,其中元素在文件中以其字节偏移进行侦听,还有一些元素具有一个字段,其中它们以字节为单位给出它们自己的长度。如果不满足这些偏移量,读者可能会报告破损的pdf。
您应该查看为这些任务制作的报告:
http://msdn.microsoft.com/en-us/library/bb885185%28v=vs.100%29.aspx
您可以使用报表设计器创建模板,设置数据并将其导出为pdf。
以上是关于使用itext获取pdf模板,生成pdf的主要内容,如果未能解决你的问题,请参考以下文章
使用itext7简单的生成一个pdf,创建一个pdf模板并进行填充