Itext填写pdf中的复选框对勾问题解决

本文介绍了一种使用Java和iText库自定义填写并生成包含中文内容的PDF文档的方法。通过修改PDF表单字段,包括复选框,并设置字体以支持中文显示,实现了动态生成带有特定数据的PDF文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先用Acrobat Pro工具将复选框的样式修改成勾形;导出值设为true

 

data.put("self_way","true");将其设为true就可以啦
package com.pdf3;

import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.AcroFields.Item;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

public class PDFUtils {


    /**
     * @param fields
     * @param data
     * @throws IOException
     * @throws DocumentException
     */
    private static void fillData(AcroFields fields, Map<String, String> data) throws IOException, DocumentException {
        List<String> keys = new ArrayList<String>();
        Map<String, Item> formFields = fields.getFields();
        for (String key : data.keySet()) {
            if(formFields.containsKey(key)){
                String value = data.get(key);
                fields.setField(key, value,"true"); // 为字段赋值,注意字段名称是区分大小写的
                keys.add(key);
            }
        } //fields.setGenerateAppearances(true);

        Iterator<String> itemsKey = formFields.keySet().iterator();
        while(itemsKey.hasNext()){
            String itemKey = itemsKey.next();
           /* if (itemKey.contains("yes")){

            }*/
            if(!keys.contains(itemKey)){
                fields.setField(itemKey, " ");

            }
        }
    }

    /**
     * @param templatePdfPath
     *            模板pdf路径
     * @param generatePdfPath
     *            生成pdf路径
     * @param data
     *            数据
     */
    public static String generateChinesePDF(String templatePdfPath, String generatePdfPath, Map<String, String> data) {
        OutputStream fos = null;
        ByteArrayOutputStream bos = null;
        try {
            PdfReader reader = new PdfReader(templatePdfPath);
            bos = new ByteArrayOutputStream();
            /* 将要生成的目标PDF文件名称 */
            PdfStamper ps = new PdfStamper(reader, bos);
            /* 使用中文字体 */
            /* 使用中文字体 */
            // BaseFont baseFont = BaseFont.createFont("C:/Windows/Fonts/seguisym.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);         
            //BaseFont bf = BaseFont.createFont("/Users/huangxiaogen/Downloads/seguisym.ttf", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);

            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
            ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
            fontList.add(bf);
            /* 取出报表模板中的所有字段 */
            AcroFields fields = ps.getAcroFields();
            fields.setGenerateAppearances(true);
            fields.setSubstitutionFonts(fontList);
            fillData(fields, data);
            /* 必须要调用这个,否则文档不会生成的  如果为false那么生成的PDF文件还能编辑,一定要设为true*/
            ps.setFormFlattening(true);
            ps.close();
            fos = new FileOutputStream(generatePdfPath);
            fos.write(bos.toByteArray());
            fos.flush();
            return generatePdfPath;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (bos != null) {
                try {
                    bos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }



    public static void main(String[] args) {
        Map<String, String> data = new HashMap<String, String>();
        Map<String, String> checkData = new HashMap<String, String>();
        //key为pdf模板的form表单的名字,value为需要填充的值
      /*  data.put("title", "在线医院");
        data.put("case", "123456789");
        data.put("date", "2018.12.07");
        data.put("name", "gitbook");
        data.put("sex", "男");
        data.put("age", "29");
        data.put("phone", "13711645814");
        data.put("office", "内科");
        data.put("cert", "身痒找打");
        data.put("drug", "1、奥美拉唑肠溶胶囊             0.25g10粒×2板 ");
        data.put("dose", "×2盒");
        data.put("cons", "用法用量:口服 一日两次 一次2粒");
        data.put("tips", "温馨提示");
        data.put("desc", "尽量呆在通风较好的地方,保持空气流通,有利于病情康复。尽量呆在通风较好的地方");*/
        data.put("check_name", "张三");
        data.put("date", "2019-01-04");
     
        data.put("self_way","true");//复选框问题解决


        


        generateChinesePDF("c:/Downloads/1343.pdf",
                "c:/test1.pdf", data );




    }


}
<think>好的,用户的问题是关于在Java中生成PDF文件,并实现在框内添加符号(√)。我需要先确定用户的需求,然后找到合适的库和方法来解决这个问题。 首先,用户提到了生成PDF,Java中常用的库有iText和Apache PDFBox。这两个库都是比较成熟的选择,但iText在功能上可能更强大一些,尤其是在处理表单和复选框方面。不过需要注意iText的许可证问题,商业用途可能需要购买许可证,而Apache PDFBox是开源的,更适合开源项目。 接下来,用户需要添加符号到复选框内。这里的关键是如何在PDF中正确渲染这个符号,特别是字体支持的问题。标准的PDF字体可能不包含对符号,或者编码方式不同,导致显示问题。因此,可能需要使用支持Unicode的字体,比如Arial Unicode MS或其他包含对符号的字体。同时,需要注意字符编码,确保使用正确的Unicode码点,如“\u2713”或“\u2714”。 然后,我需要考虑用户可能的实际应用场景,比如生成表单、报告或者需要用户交互的PDF文档。复选框通常用于表单中,用户可能需要将表单字段设置为已选状态,或者静态地在PDF上绘制对符号。如果是表单字段,使用iText的AcroForm功能可能更合适;如果是静态内容,直接绘制文本或图形即可。 用户可能遇到的问题包括字体不支持对符号,导致显示为方框或乱码,或者复选框的位置和大小调整不当。因此,在示例代码中需要明确指定字体,并确保字体文件可用。同时,可能需要处理不同PDF库之间的API差异,比如iTextPDFBox在创建复选框的方法上有所不同。 此外,用户可能对许可证有疑问,尤其是如果项目是商业性质的,需要提醒他们注意iText的AGPL许可证,可能需要购买商业许可证,而PDFBox的Apache许可证则更为宽松。 最后,生成相关问题需要考虑用户可能进一步的需求,比如如何自定义复选框样式、处理动态表单、导出数据等,以及与其他库的对比和性能问题。这些相关问题可以帮助用户更深入地理解和应用解决方案。</think>### Java生成带选符号的PDF实现方法 在Java中生成PDF添加选符号,推荐使用**iText**或**Apache PDFBox**库。以下是两种实现方案: --- #### 方案一:使用iText库(推荐版本7+) ```java import com.itextpdf.kernel.pdf.*; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.Document; public class PdfWithCheckbox { public static void main(String[] args) throws Exception { PdfWriter writer = new PdfWriter("output.pdf"); PdfDocument pdf = new PdfDocument(writer); Document doc = new Document(pdf); // 添加选框的段落 Paragraph p = new Paragraph("同意条款: ") .add(new Paragraph("✓").setFont(PdfFontFactory.createFont(StandardFonts.HELVETICA))); doc.add(p); doc.close(); } } ``` #### 方案二:使用Apache PDFBox ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; public class PdfCheckboxExample { public static void main(String[] args) throws Exception { PDDocument doc = new PDDocument(); PDPage page = new PDPage(); doc.addPage(page); try (PDPageContentStream content = new PDPageContentStream(doc, page)) { content.beginText(); content.setFont(PDType1Font.HELVETICA_BOLD, 12); content.newLineAtOffset(100, 700); content.showText("同意条款: ✓"); content.endText(); } doc.save("checkbox.pdf"); doc.close(); } } ``` --- ### 关键问题说明 1. **符号显示问题**:必须使用支持Unicode的字体(如`ArialUnicodeMS`),否则号可能显示为方块。iText中可通过`PdfFontFactory.createFont("fonts/arialuni.ttf")`指定自定义字体[^1]。 2. **复选框对齐**:精确控制位置时需使用`content.newLineAtOffset(x,y)`调整坐标。 3. **动态表单字段**:iText支持创建可交互的PDF表单复选框: ```java PdfButtonFormField checkbox = PdfFormField.createCheckBox(pdf, new Rectangle(100,700,15,15), "agree", "Yes"); checkbox.setValue("Yes"); PdfAcroForm.getAcroForm(pdf, true).addField(checkbox); ``` --- ### 运行环境配置(以Maven为例) ```xml <!-- iText 7依赖 --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>7.2.5</version> </dependency> <!-- PDFBox依赖 --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.29</version> </dependency> ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值