`
zhuchengzzcc
  • 浏览: 441782 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

iText 操作Pdf 简单整理

    博客分类:
  • java
阅读更多

      iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

     下面简单的整理几个操作pdf相关实例。

 

1.PDF模版填充

     首先需要有一个pdf文件作为模版,可以用如adobe acrobat等工具,添加几个文本域在pdf中,下面就是模版完成后的部分截图。



 

	/**
	 * @throws IOException
	 * @throws DocumentException
	 */
	@SuppressWarnings("unchecked")
	@Test
	public void fillTemplate()
			throws IOException, DocumentException {
		PdfReader reader = new PdfReader(templateFile); // 模版文件目录
		PdfStamper ps = new PdfStamper(reader, new FileOutputStream(
				"f:/fillTemplate.pdf")); // 生成的输出流
		// ByteArrayOutputStream bos = new ByteArrayOutputStream();
		// PdfStamper ps = new PdfStamper(reader, bos);

		AcroFields s = ps.getAcroFields();

		Map<String, Object> fieldMap = s.getFields(); // pdf表单相关信息展示
		for (Map.Entry<String, Object> entry : fieldMap.entrySet()) {
			String name = entry.getKey(); // name就是pdf模版中各个文本域的名字
			Item item = (Item) entry.getValue();
			System.out.println("[name]:" + name + ", [value]: " + item);
		}

		s.setField("CUSTOMERNAME", "as该多好公司");
		s.setField("TEL", "123456asdzxc");
		s.setField("CONTACT", "我是联系人123");

		ps.setFormFlattening(true); // 这句不能少
		ps.close();
		reader.close();
	}

 

 

效果如下所示:

 

[name]:CUSTOMERNAME, [value]: com.lowagie.text.pdf.AcroFields$Item@1690726
[name]:CONTACT, [value]: com.lowagie.text.pdf.AcroFields$Item@5483cd
[name]:TEL, [value]: com.lowagie.text.pdf.AcroFields$Item@1befab0

 

输出的pdf文件内容:

 

注:默认情况下如果填充的字段值含中文时,将提示报错,这是因为没有IText相应的中文语言包,需要下载亚洲语言包,ITextAsian.jar。

 

如不想生成文件流(临时文件),可用ByteArrayOutputStream代替。

 

 

2.多个PDF合并

 

	/**
	 * 多个PDF合并功能
	 * 
	 * @param files
	 *            多个PDF的文件路径
	 * @param os
	 *            生成的输出流
	 */
	public static void mergePdfFiles(String[] files, OutputStream os) {
		try {
			Document document = new Document(
					new PdfReader(files[0]).getPageSize(1));
			PdfCopy copy = new PdfCopy(document, os);
			document.open();
			for (int i = 0; i < files.length; i++) {
				PdfReader reader = new PdfReader(files[i]);
				int n = reader.getNumberOfPages();
				for (int j = 1; j <= n; j++) {
					document.newPage();
					PdfImportedPage page = copy.getImportedPage(reader, j);
					copy.addPage(page);
				}
			}
			document.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

 

如果想要直接合并输出流,可以换成输出流的集合

 

	/**
	 * 多个PDF合并功能
	 * 
	 * @param osList
	 * @param os
	 */
	public static void mergePdfFiles(List<ByteArrayOutputStream> osList,
			OutputStream os) {
		try {
			Document document = new Document(new PdfReader(osList.get(0)
					.toByteArray()).getPageSize(1));
			PdfCopy copy = new PdfCopy(document, os);
			document.open();
			for (int i = 0; i < osList.size(); i++) {
				PdfReader reader = new PdfReader(osList.get(i).toByteArray());
				int n = reader.getNumberOfPages();
				for (int j = 1; j <= n; j++) {
					document.newPage();
					PdfImportedPage page = copy.getImportedPage(reader, j);
					copy.addPage(page);
				}
			}
			document.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

 

 

3.PDF分割

 

	/**
	 * 单个Pdf文件分割成N个文件
	 * 
	 * @param filepath
	 * @param N
	 */
	public static void partitionPdfFile(String filepath, int N) {
		Document document = null;
		PdfCopy copy = null;

		try {
			PdfReader reader = new PdfReader(filepath);
			int n = reader.getNumberOfPages();
			if (n < N) {
				System.out.println("The document does not have " + N
						+ " pages to partition !");
				return;
			}
			int size = n / N;
			String staticpath = filepath.substring(0,
					filepath.lastIndexOf("\\") + 1);
			String savepath = null;
			List<String> savepaths = new ArrayList<String>();
			for (int i = 1; i <= N; i++) {
				if (i < 10) {
					savepath = filepath.substring(
							filepath.lastIndexOf("\\") + 1,
							filepath.length() - 4);
					savepath = staticpath + savepath + "0" + i + ".pdf";
					savepaths.add(savepath);
				} else {
					savepath = filepath.substring(
							filepath.lastIndexOf("\\") + 1,
							filepath.length() - 4);
					savepath = staticpath + savepath + i + ".pdf";
					savepaths.add(savepath);
				}
			}

			for (int i = 0; i < N - 1; i++) {
				document = new Document(reader.getPageSize(1));
				copy = new PdfCopy(document, new FileOutputStream(
						savepaths.get(i)));
				document.open();
				for (int j = size * i + 1; j <= size * (i + 1); j++) {
					document.newPage();
					PdfImportedPage page = copy.getImportedPage(reader, j);
					copy.addPage(page);
				}
				document.close();
			}

			document = new Document(reader.getPageSize(1));
			copy = new PdfCopy(document, new FileOutputStream(
					savepaths.get(N - 1)));
			document.open();
			for (int j = size * (N - 1) + 1; j <= n; j++) {
				document.newPage();
				PdfImportedPage page = copy.getImportedPage(reader, j);
				copy.addPage(page);
			}
			document.close();

		} catch (IOException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

 

 

4.在Servlet中调用IText返回给客户端

 

a.将文件流直接返回给客户端

 

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setContentType("application/pdf");
		ServletOutputStream sos = resp.getOutputStream();
		FileInputStream in = new FileInputStream("f:/fillTemplate.pdf");
		byte data[] = new byte[1024];

		int len = 0;
		while ((len = in.read(data)) != -1) {
			sos.write(data, 0, len);
		}

		sos.flush();
		in.close();
		sos.close();
	}

 

b.填充模版文件后将输出流返回给客户端

 

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setContentType("application/pdf");

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		PdfReader reader = null;
		PdfStamper ps = null;
		try {
			reader = new PdfReader(""); // 模版文件目录
			ps = new PdfStamper(reader, baos);
			AcroFields s = ps.getAcroFields();
			s.setField("CUSTOMERNAME", "as该多好公司");
			s.setField("TEL", "123456asdzxc");
			s.setField("CONTACT", "我是联系人123");

			ps.setFormFlattening(true); // 这句不能少
			ps.close();
			reader.close();
		} catch (DocumentException e) {
			e.printStackTrace();
		}

		ServletOutputStream sos = resp.getOutputStream();
		baos.writeTo(sos);
		sos.flush();
		sos.close();
	}

 

  • 大小: 5.7 KB
  • 大小: 11.4 KB
分享到:
评论
3 楼 bawanglb 2017-09-14  
six six six
2 楼 guanqing123 2016-11-29  
如果pdf模板里面有一个 条码字段,那么应该怎么赋值呢?setField?
1 楼 johngreen 2013-09-22  
itext操作带有表单域的pdf文件,会嵌入字体。导致文件很大,有没有好的解决方式?求指教

相关推荐

    iText操作Pdf简单整理

    在实际开发中,`iText操作Pdf简单整理.txt`可能包含了关于如何使用这些功能的示例代码和说明,通过学习和实践,开发者能够熟练掌握iText,满足各种PDF文档处理需求。 总的来说,iText是一款功能丰富的PDF处理工具,...

    itextpdf.jar包与Jsoup.jar包

    `iTextPDF.jar` 和 `Jsoup.jar` 都是这样的库,分别专注于PDF操作和网页解析。这两个库在开发过程中扮演着重要的角色,使得开发者能够方便地处理相关的任务。 首先,我们来看`iTextPDF.jar`。这是一个用于生成、...

    itext导出word整理

    iText是一款用于处理PDF、XML等格式文档的Java类库,同时也支持对DOCX文件进行读写操作。在本例中,虽然提到的是“itext”,但实际上可能是指iText的某个版本或分支,因为iText官方并不直接支持DOCX格式。不过,这里...

    java实现图片转pdf文件

    总的来说,Java结合iText库可以方便地实现图片到PDF的转换,这是一个实用且常见的功能,尤其适合那些需要整理大量图像资料的场景。通过理解和掌握这些知识,你可以灵活地处理各种PDF相关的编程需求。

    iText实战第二版_源代码阅读

    例如,清单中提到的CreateHsqldbTables.java、DatabaseConnection.java、HsqldbConnection.java以及MySqlConnection.java等文件名暗示了这些...,涉及在Java中通过iText操作数据库连接以及操作HSQLDB和MySQL数据库...

    javaPDF教程

    开发者可以根据项目需求选择合适的工具,例如,如果需要在服务器端进行大量PDF操作,那么使用PDFBox或iText这样的库会非常有用。同时,对于跨平台的字体渲染或简单的文件转换,XPDF和Poppler则提供了实用的命令行...

    c# pdf 图片转pdf dll

    图片转PDF是常见的文件处理需求,特别是在文档整理和报告制作中。本压缩包中的"itextsharp.dll"是一个库文件,专门用于处理PDF操作,包括将图片转换成PDF。 iTextSharp是一个开源的.NET库,它是iText Java库的C#...

    简单的java本地工具,Pdf批量合并,ofd批量转pdf

    本话题聚焦于一个简单的Java本地工具,它提供了两个核心功能:PDF批量合并以及OFD批量转换为PDF。这个工具对于需要处理大量这类文件的用户来说,无疑是一个高效且实用的解决方案。 首先,我们来看PDF批量合并功能。...

    PDFBinderV1.2绿色汉化版(PDF合并工具)

    PDFBinder V1.2提供了一个直观且易操作的界面,使得这一过程变得简单快捷。用户只需将需要合并的PDF文件拖放到程序界面上,软件就会自动按照添加的顺序进行合并。此外,该工具可能还支持自定义合并顺序,以便满足...

    html2pdf:html转换为pdf

    itext7的一些简单操作(二维码、水印、表格、HTML代码生成PDF) itext7解决中文显示问题有两种解决方式: 1 引入对应的语言包,火狐浏览器预览生成的pdf可能存在部分中文乱码问题,同时因为加载了语言包,生成的pdf更大 ...

    java:图片列表合并转pdf完整示例

    在Java编程环境中,将图片列表合并转换为PDF文档是一项常见的任务,特别是在报告生成、文档整理或数据可视化等场景。这个示例将详细讲解如何通过Java实现这一功能,包括必要的库引用、代码实现以及可能遇到的问题。 ...

    freemaker导出word的doc_docx_带动态图片及word转pdf工具类_jar_万能整理汇总rengm.zip

    本资料包“freemaker导出word的doc_docx_带动态图片及word转pdf工具类_jar_万能整理汇总rengm.zip”提供了关于如何使用Freemarker处理动态图片并转换Word为PDF的详细工具和教程。 首先,我们关注“doc_docx”部分。...

    PDF页面切割.rar

    首先,`itextsharp.dll`是一个基于.NET Framework的PDF处理库,由iText公司开发。这个库提供了丰富的API,可以用于创建、修改和解析PDF文档。在PDF页面切割的场景下,我们可以使用iTextSharp库来读取PDF文件,选择要...

    图片转PDF小工具

    在使用Python或Java编程时,确实有许多库可以实现图片到PDF的转换,例如Python的PIL(Pillow)库和PyPDF2库,Java的Apache PDFBox和iText等。这些库提供了强大的功能,允许开发者自定义转换过程,但对非程序员来说,...

    PDF书籍拆分

    2. **PDF页面操作**:在拆分过程中,关键是要能够访问并操作PDF的页面。这可能包括提取单个页面、选择连续的页面范围或者根据某些条件(如标签、书签)来分割页面。 3. **PDF库与API**:为了实现这些功能,开发者...

    freemaker导出word的doc_docx_带动态图片及word转pdf工具类_jar_万能整理汇总.rar

    在实际应用中,开发者需要理解Freemarker模板的语法,学会如何构建数据模型,以及如何使用提供的工具类来操作Word文档和转换PDF。通过这个资源,开发者可以大大简化生成复杂Word文档的工作流程,提高工作效率。

    CalibreCatalog:来自导出的 Calibre XML 数据的简单 PDF 目录-开源

    1. **iTextSharp.dll**:这是一个.NET框架下的PDF处理库,由iText公司开发,主要用于创建、修改和操作PDF文档。在这里,iTextSharp被用作生成PDF的基础工具,负责布局、样式和内容的输出。 2. **...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    PDF格式扫描版,全书分为24章,共817页。2011年1月出版。 全书压缩打包成4部分,这是第3部分 注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可...

Global site tag (gtag.js) - Google Analytics