方法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>
在这种情况下,可以使用iTextPDF库以及其针对亚洲字符集的扩展iText-Asian。这两个库提供了强大的功能,让我们能够方便地处理PDF文档,包括添加中文文字水印。以下是对这两个库以及如何在Java中实现这一功能的详细...
在本案例中,我们关注的是两个特定版本的JAR包:`itext-asian-5.2.0.jar` 和 `itextpdf-5.5.5.jar`。 `itext-asian-5.2.0.jar` 是iText的一个扩展,专门针对亚洲语言,如简体中文、繁体中文、日语和韩语等。这个...
在这个场景中,我们关注的是两个特定版本的iText库:`itext-asian-5.2.0.jar` 和 `itextpdf-5.5.5.jar`。 `itext-asian-5.2.0.jar` 是iText的一个扩展版本,特别针对亚洲语言的支持。这个版本包含了对中文、日文、...
3. iText-5.0.6.jar 和 itext-2.1.7.jar:这两个版本的iText核心库,分别对应于iText的两个不同版本。iText 2.x系列是早期版本,而iText 5.x带来了许多改进和新特性,例如更全面的PDF/A支持,更好的XML处理,以及更...
通过引入iText-Asian,我们可以确保"STSong-Light"等特定字体被正确地嵌入到PDF中,从而避免了中文字符显示为问号或其他乱码的情况。 在实际应用中,解决"STSong-Light"问题的步骤大致如下: 1. **导入iText-Asian...
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的基本库,主要用于生成PDF文件,而`itext-rtf-2.1.7.jar`是其RTF扩展,使我们能够创建和编辑RTF格式的文件,包括Word文档。 1. **创建RTFWriter对象** 要开始生成Word文档,首先需要创建...
本文将深入探讨如何使用`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是Java开发中处理PDF和RTF文档的重要工具,它们提供了全面的API来满足各种文档处理需求,无论是创建、编辑还是转换,都为开发者带来了极大的便利。
iText是一款开源的Java库,主要用于创建和修改PDF文档,而iText-asian则是其针对亚洲文字特性的增强版,解决了在PDF中正确显示和处理东亚字符集的问题。 首先,我们要理解iText的基本功能。iText提供了一系列API,...
这是曾经在项目中做pdf导出时用过的itext的包,有包含asian包,可解决中文输出问题。内容包含:itext-4.2.1&&itext;-asian-5.2.0&&itext;-pdfa-5.5.13
此外,通过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` 是两个关键的Java库,专门解决这个问题。 `itext-asian-5.2.0.jar` 是iText库的一个扩展,主要针对亚洲语言的支持,包括中文、日文和韩文。这个库包含了处理中文...
在实际开发中,当你需要处理包含中文内容的PDF文档时,应当同时引入`iText-5.5.8.jar`和`itext-asian.jar`。这样,你就可以利用iText的强大功能,同时确保中文字符的正确显示和处理。 总结来说,这个压缩包提供了...
这个压缩包包含了两个主要的JAR文件:`itext-asian-5.2.0.jar`和`itextpdf-5.5.13.1.jar`,它们在处理PDF文件时扮演着重要的角色。 `itext-asian-5.2.0.jar`是iText的一个扩展,主要是为了支持亚洲语言,如中文、...
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
itext-2.1.7.js1.jar、itext-2.1.7.js2.jar、itext-2.1.7.js3.jar、itext-2.1.7.js4.jar、itext-2.1.7.js5.jar、itext-2.1.7.js6.jar、itext-2.1.7.js7.jar、itext-2.1.7.js8.jar、itext-2.1.7.js9.jar、itext-2.1.7...