使用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。

  1. 有可能吗?
  2. 这是最好的方法吗?

编辑:我正在使用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模板并进行填充

使用Itext搜索和替换PDF

java利用itext导出pdf

记:解决itext5使用html模板生成PDF时,中文不显示的问题。

Freemarker+IText生成pdf文件

itext API无法从Adobe生命周期工具生成的动态pdf中获取字段