对java导出PDF进行图片,(图片/文字)水印,页眉页脚的添加

可直接复制粘贴到测试类中,进行测试,当做随手笔记了,用的时候方便

jar:
iText-2.0.8.jar
iTextAsian.jar

import java.awt.Color;
import java.awt.FontMetrics;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.swing.JLabel;

import com.lnlic.credit.common.core.util.ItextUtil;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Image;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfGState;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;

/**
 * 测试PDF添加水印
 * 
 * @Description:
 * @ClassName: TestPDF
 * @Author 我的花儿
 * @DateTime 2019年12月3日 下午1:41:03
 */
public class TestPDF {

	private static final float IAMGE_HEIGHT = 200; // 水印图片的的高度
	private static final float IAMGE_WIDTH = 200; // 水印图片的的宽度

	public static void main(String[] args) throws DocumentException, IOException {
		// 将pdf文件先加水印然后输出
		setWatermark("E:/dataquerywatermark.pdf", "E:/abc.pdf", "水印水印水印");
	}

	/**
	 * 
	 * @Description:
	 * @Title: setWatermark
	 * @param input 原PDF位置 E:/dataquerywatermark.pdf
	 * @param out 输出PDF文件的位置 E:/abc.pdf
	 * @param waterMarkName 文字水印
	 * @throws DocumentException
	 * @throws IOException
	 * @Author 我的花儿
	 * @DateTime 2019年12月3日 下午2:21:35
	 */
	public static void setWatermark(String input, String out, String waterMarkName)
			throws DocumentException, IOException {
		String FONTS_PATH = ItextUtil.class.getResource("/").getPath() + "../../static/web/platform/common/ace/fonts/";

		// 创建一个pdf读入流
		PdfReader reader = new PdfReader(input);
		// 根据一个pdfreader创建一个pdfStamper.用来生成新的pdf.
		PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(new File(out)));

		int total = reader.getNumberOfPages() + 1; // 总页数+1
		PdfContentByte pdfContentByte;
		BaseFont baseFont = BaseFont.createFont(FONTS_PATH + "msyh.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
		PdfGState gs = new PdfGState();
		// 页数是从1开始的
		for (int i = 1; i < total; i++) {
			Rectangle pageRect = null;
			// 获得pdfstamper在当前页的上层打印内容.也就是说 这些内容会覆盖在原先的pdf内容之上.
			pdfContentByte = stamper.getOverContent(i);// 在内容上方加水印
			// content = stamper.getUnderContent(i);//在内容下方加水印
			gs.setFillOpacity(0.5f); // 透明度设置
			pdfContentByte.setGState(gs);

			// //文字水印
			pdfContentByte.beginText();// 开始写入文本
			pdfContentByte.setColorFill(Color.LIGHT_GRAY);
			pdfContentByte.setFontAndSize(baseFont, 50);
			pdfContentByte.setTextMatrix(70, 200); // 设置字体的输出位置
			pdfContentByte.showTextAligned(Element.ALIGN_CENTER, "公司内部文件,请注意保密!", 300, 350, 55);// 要输出的text

			// 图片水印,创建一个image对象.
			Image image = Image.getInstance("E:/watermark.png");

			// //用pdfreader获得当前页字典对象.包含了该页的一些数据.比如该页的坐标轴信息.
			// PdfDictionary pdfDictionary = reader.getPageN(i);
			// //拿到mediaBox 里面放着该页pdf的大小信息.
			// PdfObject pdfObject = pdfDictionary.get(new PdfName("MediaBox"));
			// //pdfObject是一个数组对象.里面包含了该页pdf的坐标轴范围.
			// PdfArray PdfArray = (PdfArray) pdfObject;
			// //设置image对象的输出位置PdfArray.getAsNumber(pa.size()-1).floatValue()
			// 是该页pdf坐标轴的y轴的最大值
			// image.setAbsolutePosition(0,PdfArray.getAsNumber(PdfArray.size()-1).floatValue()-100);//[0,
			// 0, 595.28, 841.88]
			float pageHeight = reader.getPageSize(1).getHeight();// 模板高度
			float pageWidth = reader.getPageSize(1).getWidth();// 模板宽度

			for (int x = 0; x < Math.ceil(pageWidth / IAMGE_WIDTH); x++) {
				for (int y = 0; y < Math.ceil(pageHeight / IAMGE_HEIGHT); y++) {
					image.scaleToFit(IAMGE_WIDTH, IAMGE_HEIGHT);// 两个参数分别设置长和宽的最大值,但是图片长宽比不变
					image.setAbsolutePosition(x * IAMGE_WIDTH, y * IAMGE_HEIGHT);
					image.scalePercent(50);// 放大或者缩小图片
					// image.scaleAbsolute(200,100);//自定义大小
					// image.setRotation(-20);// 旋转 弧度
					// image.setRotationDegrees(45);// 旋转 角度
					pdfContentByte.addImage(image);
				}
			}

			// 文字水印平铺s
			JLabel label = new JLabel();
			FontMetrics metrics;
			int textH = 0;
			int textW = 0;
			label.setText(waterMarkName);
			metrics = label.getFontMetrics(label.getFont());
			textH = metrics.getHeight();
			textW = metrics.stringWidth(label.getText());
			pageRect = reader.getPageSizeWithRotation(i);
			pdfContentByte.saveState();
			pdfContentByte.setGState(gs);
			pdfContentByte.beginText();
			pdfContentByte.setFontAndSize(baseFont, 20);
			int interval = -5;
			for (int height = interval + textH; height < pageRect.getHeight(); height = height + textH * 3) {
				for (int width = interval + textW; width < pageRect.getWidth() + textW; width = width + textW * 2) {
					pdfContentByte.setColorFill(Color.LIGHT_GRAY); // 字体颜色
					pdfContentByte.showTextAligned(Element.ALIGN_LEFT, "水印文字", width - textW, height - textH, 30);
				}
			}

			// 封面logo
			if (i == 1) {
				Image imageIndex = Image.getInstance("E:/logo.png");
				PdfGState gsIndex = new PdfGState();
				gsIndex.setFillOpacity(1f); // 透明度设置
				pdfContentByte.setGState(gsIndex);
				imageIndex.setAbsolutePosition(30, 725);
				imageIndex.scalePercent(80);// 放大或者缩小图片
				pdfContentByte.addImage(imageIndex);
			}

			if (i >= 2) {
				// 页眉左侧图片
				Image image2 = Image.getInstance("E:/logo-sm.png");
				PdfGState gs2 = new PdfGState();
				gs2.setFillOpacity(1f); // 透明度设置
				pdfContentByte.setGState(gs2);
				image2.setAbsolutePosition(30, 770);
				image2.scalePercent(80);// 放大或者缩小图片
				pdfContentByte.addImage(image2);
				// 页眉右侧文字
				pdfContentByte.setColorFill(Color.BLACK); // 字体颜色
				pdfContentByte.setFontAndSize(baseFont, 10); // 字体以及字体大小
				pdfContentByte.showTextAligned(Element.ALIGN_LEFT, "文件编号: 123456789", 380, 795, 0);
				pdfContentByte.showTextAligned(Element.ALIGN_LEFT, "生成日期: 2019年12月3日", 380, 775, 0);
				// 页眉分割线
				Image image3 = Image.getInstance("E:/dashed.png");
				PdfGState gs3 = new PdfGState();
				gs3.setFillOpacity(1f); // 透明度设置
				for (int j = 6; j < 112; j++) {
					image3.scaleToFit(3, 3);// 两个参数分别设置长和宽的最大值,但是图片长宽比不变
					image3.setAbsolutePosition(j * 5, 755);
					image3.scalePercent(80);// 放大或者缩小图片
					pdfContentByte.setGState(gs3);
					pdfContentByte.addImage(image3);
				}

				// 页脚
				pdfContentByte.setColorFill(Color.BLACK); // 字体颜色
				pdfContentByte.setFontAndSize(baseFont, 10); // 字体以及字体大小
				int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
				pdfContentByte.showTextAligned(Element.ALIGN_CENTER, "第" + i + "页/共" + pageSize + "页", 300, 10, 0);// "第"+i+"页/共"+pageSize+"页"
				pdfContentByte.endText();

			}

		}

		stamper.close();
		reader.close();
		// 删除不带水印文件
		File tempfile = new File(input);
		if (tempfile.exists()) {
			tempfile.delete();
		}
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用itext7导出pdf添加分页、页眉和页Java代码示例: ```java import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.element.Text; import com.itextpdf.layout.renderer.DocumentRenderer; import com.itextpdf.layout.renderer.DrawContext; import com.itextpdf.layout.renderer.IRenderer; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; public class PdfGenerator { private static final String DEST = "output.pdf"; public static void main(String[] args) throws FileNotFoundException { File file = new File(DEST); file.getParentFile().mkdirs(); new PdfGenerator().createPdf(DEST); } public void createPdf(String dest) throws FileNotFoundException { PdfWriter writer = new PdfWriter(dest); PdfDocument pdf = new PdfDocument(writer); Document document = new Document(pdf); // 设置页眉和页 pdf.addEventHandler(PdfDocumentEvent.START_PAGE, new PageEventHandler()); // 添加内容 List<String> paragraphs = new ArrayList<>(); paragraphs.add("Paragraph 1"); paragraphs.add("Paragraph 2"); paragraphs.add("Paragraph 3"); paragraphs.add("Paragraph 4"); paragraphs.add("Paragraph 5"); paragraphs.add("Paragraph 6"); paragraphs.add("Paragraph 7"); paragraphs.add("Paragraph 8"); paragraphs.add("Paragraph 9"); paragraphs.add("Paragraph 10"); for (String text : paragraphs) { document.add(new Paragraph(text)); } document.close(); } // 实现分页、页眉和页 private static class PageEventHandler implements IPdfPageEvent { @Override public void handleEvent(Event event) { PdfDocumentEvent docEvent = (PdfDocumentEvent) event; PdfDocument pdfDoc = docEvent.getDocument(); PdfPage page = docEvent.getPage(); int pageNumber = pdfDoc.getPageNumber(page); Rectangle pageSize = page.getPageSize(); PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc); Canvas canvas = new Canvas(pdfCanvas, pdfDoc, pageSize); // 添加页眉 canvas.showTextAligned(new Paragraph("Header").setFontColor(Color.GRAY), pageSize.getWidth() / 2, pageSize.getTop() - 30, TextAlignment.CENTER); // 添加 canvas.showTextAligned(new Paragraph(String.format("Page %d", pageNumber)), pageSize.getWidth() / 2, pageSize.getBottom() + 30, TextAlignment.CENTER); canvas.close(); } } // 实现分页 private static class CustomRenderer extends DocumentRenderer { public CustomRenderer(Document document) { super(document); } @Override public void drawBackground(DrawContext drawContext) { super.drawBackground(drawContext); int pageNumber = getCurrentArea().getPageNumber(); if (pageNumber != 1) { drawContext.getCanvas().beginText().setFontAndSize(PdfFontFactory.createFont(), 12).moveText(36, 20).showText(String.valueOf(pageNumber)).endText(); } } @Override public IRenderer getNextRenderer() { return new CustomRenderer(getDocument()); } } } ``` 在上面的代码中,我们首先创建一个 `PdfWriter` 和 `PdfDocument`。然后我们创建一个 `Document` 并设置页眉和页的代码。我们添加了一些段落到文档中。 我们使用了 `PageEventHandler` 实现了分页、页眉和页。在 `handleEvent` 方法中,我们获取了当前页码,并添加页眉和页。 我们还使用了 `CustomRenderer` 实现了分页。在 `drawBackground` 方法中,我们将当前页码添加到每一页的左下角。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值