itextpdf实践与问题


文章内容: PDF文档的处理以及碰到的问题


需求:合成图片到pdf文档

代码:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

public class MergeFileTest {
	
	public static void main(String[] args) throws Exception {
		mergeImage(
				getImage("D:/exercise/pic/lisi-01.png"), 
				readFile("D:/exercise/pdf/20161213-001.pdf"), 
				"D:/exercise/pdf/merged20161213-001.pdf");
	}
	
	/**
	 * 合并图片到pdf文档
	 * @param img
	 * @param document
	 * @param savePath
	 * @throws Exception
	 */
	public static void mergeImage(Image img, byte[] document, String savePath) throws Exception{
		PdfStamper stamper = new PdfStamper(
				getPdfReader(document), new FileOutputStream(savePath));		
		PdfContentByte content = stamper.getOverContent(1);
		
		content.addImage(img);
		System.out.println("Merge completed.");
		stamper.close();
	}
	
	private static Image getImage(String imgPath) throws Exception{
		//获取图片
		Image img = Image.getInstance(imgPath);
		//设置缩放比例
		img.scalePercent(20f);
		//设置位置
		img.setAbsolutePosition(156, 545);
		
		return img;
	}
	
	/**
	 * 读取文件
	 * @param filePath
	 * @return
	 */
	private static byte[] readFile(String filePath) {
		FileInputStream file=null;
		try {
			file = new FileInputStream(filePath);
			byte[] fileByte = new byte[file.available()];
			file.read(fileByte);
			
			return fileByte;
		} catch (Exception e) {
			System.out.println(String.format(
					"fail to read file [%s], exception=%s", filePath, e.getMessage()));
		}finally {
			try {
				file.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return null;
	}
	
	private static PdfReader getPdfReader(byte[] document) throws IOException{
		PdfReader pdfReader = new PdfReader(document);
		pdfReader.unethicalreading = true;
		
		return pdfReader;
	}
	
}


文档合并前:



文档合并后:



Tips : 为了不覆盖文字,请确保png图片背景透明

----------------------------------------------------------------------------------------------------------


依赖的jar配置如下:

<!-- PDF处理JAR -->
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.3.2</version>
		</dependency>
		
		<dependency>
		    <groupId>org.bouncycastle</groupId>
		    <artifactId>bcprov-ext-jdk15on</artifactId>
		    <version>1.51</version>
		</dependency>

问题一:读取被加密的PDF文档时报错:

com.itextpdf.text.exceptions.BadPasswordException:: PdfReader not opened with owner password (未设置加密密码)或是

com.itextpdf.text.exceptions.BadPasswordException: PdfReader not opened with owner passwor (设置正确加密密码后)

解决方案:

设置PdfReader的静态属性unethicalreading为true, 无需设置加密密码,示例代码:

	PdfReader pdfReader = new PdfReader(document);
	pdfReader.unethicalreading = true;




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值