`
kong6001
  • 浏览: 141300 次
  • 性别: Icon_minigender_1
  • 来自: 广东广州
社区版块
存档分类
最新评论

iText-带formPDF复制,乱码解决方式

    博客分类:
  • PDF
 
阅读更多

方法1:使用iText中文支持包(见附件iTextAsian-for-5.x-1.0)然后重新设置表单字体即可

 

if (fields.getFields() != null || !fields.getFields().isEmpty()) {// change field
        ByteArrayOutputStream exchangeByteOut = new ByteArrayOutputStream();
        PdfStamper stamper = new PdfStamper(originReader, exchangeByteOut);
        fields = stamper.getAcroFields();

        Set<String> keys = fields.getFields().keySet();

        // BaseFont bfChinese =
        // BaseFont.createFont("C:/Windows/Fonts/kaiu.ttf", BaseFont.IDENTITY_H,
        // BaseFont.NOT_EMBEDDED); // the file become very large

        BaseFont bfChinese =
            BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); // iTextAsian-for-5.x.jar
        for (String name : keys) {
          if (name == null || name.length() <= 0)
            continue;
          AcroFields.Item item = fields.getFieldItem(name);
      
            // log.info(name +"'s font is"+PDFUtils.FONT_ArialUnicodeMS);
            String value = fields.getField(name);
         // set the font   to  default
            fields.setFieldProperty(name, "textfont", bfChinese/* BaseFont.createFont() */, null);
         
            fields.setField(name, value);// reset value
 

        }
        exchangeByteOut.flush();
        exchangeByteOut.close();
        stamper.close();
        originReader = new PdfReader(exchangeByteOut.toByteArray());

....

使用 PdfCopyFields直接拷贝,合并文档
    byteOutStream = new ByteArrayOutputStream();
      PdfCopyFields copyFields = new PdfCopyFields(byteOutStream);
      copyFields.addDocument(originReader);
      copyFields.addDocument(signTempleteReader);
      copyFields.close();
 

 

方法2:把表单去掉

如果进行直接用PdfCopy带form的PDF,TextField字段会出现乱.所以要先把其处理为文本

 

   public static PdfReader processTextField(InputStream docIns) throws IOException,
      DocumentException {

    PdfReader reader = new PdfReader(docIns);
    AcroFields form = reader.getAcroFields();//read only
    Map<String, Item> fields = form.getFields();
    if (fields == null || fields.isEmpty())
      return reader;
    System.out.println(">>>>>>>>>Existing form.");
    ByteArrayOutputStream exchangeByteOut = new ByteArrayOutputStream();
    PdfStamper stamper = new PdfStamper(reader, exchangeByteOut);
    form=stamper.getAcroFields();//can edit form
    // find the filed name
    Set<Entry<String, Item>> fieldSet = fields.entrySet();
    List<String> keys = new ArrayList<String>();
    for (Entry<String, Item> entry : fieldSet) {
      String key = entry.getKey();
      keys.add(key);
    }

    // replace the field or set read only
    AcroFields.Item item;
    PdfDictionary dict;
    int fieldAlign = Element.ALIGN_LEFT;
    int flags;
    for (String k : keys) {//
      item = form.getFieldItem(k);
      fieldAlign = PDFUtils.getItemAlignment(item);
      dict = item.getMerged(0);
      int fieldType = form.getFieldType(k);
      PdfNumber pdfNum = dict.getAsNumber(PdfName.FF);
      flags = pdfNum == null ? 0 : pdfNum.intValue();
      if ((flags & BaseField.PASSWORD) > 0)
       // System.out.println(" -> password");
      if ((flags & BaseField.MULTILINE) > 0) {
       // System.out.println(" -> multiline");
      }

      String fieldValue = form.getField(k);
      float textSize = PDFUtils.getDefaultTextSize(item);
      //System.out.println(k + "-->" + fieldValue + ",textSize:" + textSize);
      List<FieldPosition> pos = form.getFieldPositions(k);
      if (pos == null || pos.isEmpty())
        continue;
      FieldPosition p = pos.get(0);
      Rectangle rect = p.position;
      if (fieldType == AcroFields.FIELD_TYPE_TEXT) {// a text field

        PdfContentByte content;

        content = stamper.getOverContent(p.page);
        ColumnText ct = new ColumnText(content);

        ct.setSimpleColumn(new Phrase(new Chunk(fieldValue, FontFactory.getFont(
            FontFactory.HELVETICA, textSize))), rect.getLeft(), rect.getBottom(), rect.getRight(),
            rect.getTop(), 9, fieldAlign);
        ct.go();
        form.removeField(k);// remave the field
      }   else {
       // log.info("it is't a text field,to set read only mode.Type:" + PDFUtils.getFormType(fieldType));
        form.setFieldProperty(k, "setfflags", PdfFormField.FF_READ_ONLY, null);
      }

    }
    stamper.close();
    ByteArrayInputStream byteIn = new ByteArrayInputStream(exchangeByteOut.toByteArray());
    reader = new PdfReader(byteIn);
    return reader;
  }
/**
public class PDFUtils {
  
  public static final String FONT_ArialUnicodeMS="ArialUnicodeMS";

  /**
   * get AcroFields.Item align
   * 
   * @param item
   * @return
   */
  public static int getItemAlignment(AcroFields.Item item) {
    int res = Element.ALIGN_LEFT;
    try {
      PdfNumber nfl = item.getMerged(0).getAsNumber(PdfName.Q);
      switch (nfl.intValue()) {
        case PdfFormField.Q_CENTER:
          res = Element.ALIGN_CENTER;
          break;
        case PdfFormField.Q_RIGHT:
          res = Element.ALIGN_RIGHT;
          break;
        case PdfFormField.Q_LEFT:
        default:
          res = Element.ALIGN_LEFT;
      }
    } catch (NullPointerException e) {
      res = Element.ALIGN_LEFT;
    } finally {
      return res;
    }
  }

  public static String getFormType(int type) {
    String name = "unknow type";
    switch (type) {
      case AcroFields.FIELD_TYPE_CHECKBOX:
        name = "Checkbox";
        break;
      case AcroFields.FIELD_TYPE_COMBO:
        name = "Combobox";
        break;
      case AcroFields.FIELD_TYPE_LIST:
        name = "List";
        break;
      case AcroFields.FIELD_TYPE_NONE:
        name = "None";
        break;
      case AcroFields.FIELD_TYPE_PUSHBUTTON:
        name = "Pushbutton";
        break;
      case AcroFields.FIELD_TYPE_RADIOBUTTON:
        name = "Radiobutton";
        break;
      case AcroFields.FIELD_TYPE_SIGNATURE:
        name = "Signature";
        break;
      case AcroFields.FIELD_TYPE_TEXT:
        name = "Text";
        break;
      default:
        name = "unknow type";
    }
    return name;
  }

  public static float getTextSize(AcroFields.Item item) {
    final int DA_SIZE = AcroFields.DA_SIZE;
    PdfString da = item.getMerged(0).getAsString(PdfName.DA);
    Object dab[] = AcroFields.splitDAelements(da.toUnicodeString());
    for (Object object : dab) {
      System.out.println("dab:" + object);

    }
    System.out.println("font:" + dab[AcroFields.DA_FONT]);
    float size = ((Float) dab[DA_SIZE]).floatValue();
    if (size <= 0) {// set default font size.
      size = 9;
    }
    return size;
  }

  public static String getTextFont(AcroFields.Item item) {
    PdfString da = item.getMerged(0).getAsString(PdfName.DA);
    Object dab[] = AcroFields.splitDAelements(da.toUnicodeString());
    return (String) dab[AcroFields.DA_FONT];
  }
//  public static String getTextColor(AcroFields.Item item) {
//    PdfString da = item.getMerged(0).getAsString(PdfName.DA);
//    Object dab[] = AcroFields.splitDAelements(da.toUnicodeString());
//    return (C) dab[AcroFields.DA_COLOR];
//  }
}
分享到:
评论

相关推荐

    itext-5.5.8+itext-asian+pdf jar包

    java的PDF生成jar包,包含 iText-5.5.8.jar, iTextAsian.jar, itextpdf-5.5.8, itextpdf-5.5.8-javadoc, itext-xtra-5.5.8, xmlworker-5.5.8。 已打包中文字体

    java使用itextpdf、itext-asian对pdf文件加水印

    在这种情况下,可以使用iTextPDF库以及其针对亚洲字符集的扩展iText-Asian。这两个库提供了强大的功能,让我们能够方便地处理PDF文档,包括添加中文文字水印。以下是对这两个库以及如何在Java中实现这一功能的详细...

    itext-asian-5.2.0.jar、itextpdf-5.5.5.jar JAR包

    在本案例中,我们关注的是两个特定版本的JAR包:`itext-asian-5.2.0.jar` 和 `itextpdf-5.5.5.jar`。 `itext-asian-5.2.0.jar` 是iText的一个扩展,专门针对亚洲语言,如简体中文、繁体中文、日语和韩语等。这个...

    itext-asian2.7.1+itext-asiancmaps2.7.1jar文件以及字体maven项目

    最近在做项目用到jasperreports6.5.0,该库依赖itext2.7.1版本... &lt;artifactId&gt;itext-asian &lt;version&gt;2.7.1 &lt;groupId&gt;com.lowagie&lt;/groupId&gt; &lt;artifactId&gt;itext-asiancmaps &lt;version&gt;2.7.1 &lt;/dependency&gt;

    itext-rtf-2.1.7.jar,iTextAsian.jar,iText-5.0.6.jar,itext-2.1.7.jar

    3. iText-5.0.6.jar 和 itext-2.1.7.jar:这两个版本的iText核心库,分别对应于iText的两个不同版本。iText 2.x系列是早期版本,而iText 5.x带来了许多改进和新特性,例如更全面的PDF/A支持,更好的XML处理,以及更...

    itext-asian-5.2.0.jar和itextpdf-5.5.5.jar

    在这个场景中,我们关注的是两个特定版本的iText库:`itext-asian-5.2.0.jar` 和 `itextpdf-5.5.5.jar`。 `itext-asian-5.2.0.jar` 是iText的一个扩展版本,特别针对亚洲语言的支持。这个版本包含了对中文、日文、...

    itext-asian-5.2.0.jar与itextpdf-5.5.11.jar

    pdf定位签字包(itext-asian-5.2.0.jar与itextpdf-5.5.11.jar)。专门用来做定位。参考文档:https://www.jb51.net/article/212310.htm

    itext-2.1.7.jar itext-rtf-2.1.7.jar

    `itext-2.1.7.jar`是iText的基本库,主要用于生成PDF文件,而`itext-rtf-2.1.7.jar`是其RTF扩展,使我们能够创建和编辑RTF格式的文件,包括Word文档。 1. **创建RTFWriter对象** 要开始生成Word文档,首先需要创建...

    itexpdf+itext-asian解决STSong-Light问题

    通过引入iText-Asian,我们可以确保"STSong-Light"等特定字体被正确地嵌入到PDF中,从而避免了中文字符显示为问号或其他乱码的情况。 在实际应用中,解决"STSong-Light"问题的步骤大致如下: 1. **导入iText-Asian...

    itext-2.1.7.jar和itext-rtf-2.1.7.jar

    总的来说,iText-2.1.7.jar和iText-rtf-2.1.7.jar是Java开发中处理PDF和RTF文档的重要工具,它们提供了全面的API来满足各种文档处理需求,无论是创建、编辑还是转换,都为开发者带来了极大的便利。

    itext-asian-5.2.0.jar、itextpdf-5.5.5.jar 两个JAR包

    本文将深入探讨如何使用`itext-asian-5.2.0.jar`和`itextpdf-5.5.5.jar`这两个JAR包来解决PDF导出时中文显示不正常的问题。 `iText`是一款强大的Java库,专为创建、修改和处理PDF文档而设计。`itextpdf`是iText的...

    itext-2.1.7.jar itext-rtf-2.1.7.jar 和源码

    此外,通过iText-rtf模块,它还支持创建和编辑RTF(Rich Text Format)文档,这使得iText能够与Microsoft Word无缝对接。在iText 2.1.7版本中,我们可以利用其提供的API来构建复杂的文档结构,如段落、表格、图像...

    itext-asian-5.2.0.jar和itextpdf-5.5.5.jar两个JAR包

    `itext-asian-5.2.0.jar` 和 `itextpdf-5.5.5.jar` 是两个关键的Java库,专门解决这个问题。 `itext-asian-5.2.0.jar` 是iText库的一个扩展,主要针对亚洲语言的支持,包括中文、日文和韩文。这个库包含了处理中文...

    官方最新itextpdf-5.5.8.jar+中文支持包itext-asian.jar

    在实际开发中,当你需要处理包含中文内容的PDF文档时,应当同时引入`iText-5.5.8.jar`和`itext-asian.jar`。这样,你就可以利用iText的强大功能,同时确保中文字符的正确显示和处理。 总结来说,这个压缩包提供了...

    itext-4.2.1&&itext;-asian-5.2.0&&itext;-pdfa-5.5.13的jar包

    这是曾经在项目中做pdf导出时用过的itext的包,有包含asian包,可解决中文输出问题。内容包含:itext-4.2.1&&itext;-asian-5.2.0&&itext;-pdfa-5.5.13

    iText-2.1.7.js2.jar iTextAsian.jar iTextAsianCmaps.jar itext-rtf-2.1.7.jar

    iText-2.1.7.js2.jar iTextAsian.jar iTextAsianCmaps.jar itext-rtf-2.1.7.jar iText-2.1.7.js2.jar iTextAsian.jar iTextAsianCmaps.jar itext-rtf-2.1.7.jar 能够配合最新ireport5.6.0的全套汉字jar包

    itext-1.4.5.jar itext-2.1.7.jar itext-3.1.jar itext-5.0.6.jar

    itext-1.4.5.jar itext-2.1.7.jar itext-3.1.jar itext-1.4.5.jar itext-2.1.7.jar itext-3.1.jar itext-5.0.6.jar

    iText-2.1.7.jar+iTextAsian.jar+iTextAsianCmaps.jar+itext-rtf-2.1.7.jar.zip

    1. **iText-2.1.7.jar**: 这是iText的主要库文件,版本为2.1.7。在这一版本中,iText提供了许多核心功能,如创建PDF文档、添加文本、图像和表格,以及处理PDF表单。用户可以通过这个库来动态生成PDF报告、发票或任何...

    itext相关JARitext-asian-5.2.0及itextpdf-5.5.13.1.zip

    这个压缩包包含了两个主要的JAR文件:`itext-asian-5.2.0.jar`和`itextpdf-5.5.13.1.jar`,它们在处理PDF文件时扮演着重要的角色。 `itext-asian-5.2.0.jar`是iText的一个扩展,主要是为了支持亚洲语言,如中文、...

Global site tag (gtag.js) - Google Analytics