方法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];
// }
}
分享到:
相关推荐
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。 已打包中文字体
最近在做项目用到jasperreports6.5.0,该库依赖itext2.7.1版本... <artifactId>itext-asian <version>2.7.1 <groupId>com.lowagie</groupId> <artifactId>itext-asiancmaps <version>2.7.1 </dependency>
java使用itextpdf、itext-asian对pdf文件加中文文字水印,此demo只提供参考,希望给需要的朋友带来帮助,谢谢支持!
itext-rtf-2.1.7.jar,iTextAsian.jar,iText-5.0.6.jar,itext-2.1.7.jar
itext-asian-5.2.0.jar、 itextpdf-5.5.5.jar 两个JAR包
多个版本的itext-jar包, itext-2.0.4/itext-2.1.5/itext-2.1.7
itext-asian-5.2.0.jar和itextpdf-5.5.5.jar 用于java生成pdf的各种开发 1
pdf定位签字包(itext-asian-5.2.0.jar与itextpdf-5.5.11.jar)。专门用来做定位。参考文档:https://www.jb51.net/article/212310.htm
java操作pdf和rtf文件所需的jar包。包含: itext-2.1.7.jar itext-rtf-2.1.7.jar
iText-2.1.7.jar+iTextAsian.jar+iTextAsianCmaps.jar+itext-rtf-2.1.7.jar.zip
这是曾经在项目中做pdf导出时用过的itext的包,有包含asian包,可解决中文输出问题。内容包含:itext-4.2.1&&itext;-asian-5.2.0&&itext;-pdfa-5.5.13
赠送jar包:itext-2.1.7.jar; 赠送原API文档:itext-2.1.7-javadoc.jar; 赠送源代码:itext-2.1.7-sources.jar; 赠送Maven依赖信息文件:itext-2.1.7.pom; 包含翻译后的API文档:itext-2.1.7-javadoc-API文档-...
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-1.4.5.jar itext-2.1.7.jar itext-3.1.jar itext-5.0.6.jar
这两个jar ,可以解决导出PDF,不能显示中文问题。 pdf文档jar包 itext-asian-5.2.0.jaritextpdf-5.5.5.jar 读取PDF文件,PDF签名文件
适用于android,编译提示有问题的话,在app的Build.gradle的android下加如下代码: packagingOptions { exclude 'com/itextpdf/text/pdf/fonts/cmap_info.txt' }
赠送jar包:itext-2.1.7.jar; 赠送原API文档:itext-2.1.7-javadoc.jar; 赠送源代码:itext-2.1.7-sources.jar; 赠送Maven依赖信息文件:itext-2.1.7.pom; 包含翻译后的API文档:itext-2.1.7-javadoc-API文档-...
官方最新itextpdf-5.5.8.jar+中文支持包itext-asian.jar
java导出word文档,使用itext包,可以生成pdf,word,生成段落,插入图图片,页码