PDFUtils常用方法

自个整理的一个生成PDF的常用方法:

package com.huangt.util.function;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;

import javax.swing.ImageIcon;

import com.lowagie.text.Document;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfWriter;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import de.schlichtherle.io.FileReader;



public class PDFUtils {
	/**
	 * 生成水印的图片
	 * @author huangt 
	 * @time 2012.6.14
	 * 
	 */
	public static void createJpgByFont(String str, String jpgName) {
		try {
			// 宽度 高度
			final int smallWidth = 60 ;
			BufferedImage bimage = new BufferedImage((str.length() + 3)
					* smallWidth/2,smallWidth, BufferedImage.TYPE_INT_RGB);
			Graphics2D g = bimage.createGraphics();
			g.setColor(Color.WHITE); // 背景色
			g.fillRect(0, 0, smallWidth * (str.length() + 2),smallWidth); // 画一个矩形

			g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_ON);
			// 去除锯齿(当设置的字体过大的时候,会出现锯齿)
			g.setColor(Color.LIGHT_GRAY); // 字的颜色
			File file = new File("C:/WINDOWS/Fonts/Arial.ttf"); // 字体文件
			Font font = Font.createFont(Font.TRUETYPE_FONT, file);
			// 根据字体文件所在位置,创建新的字体对象(此语句在jdk1.5下面才支持)
			g.setFont(font.deriveFont((float) smallWidth));
		
			g.drawString(str,0,smallWidth);
			
			//旋转图片
			bimage = PDFUtils.rotateImage(bimage, -45);
			
			// 在指定坐标除添加文字
			g.dispose();
			FileOutputStream out = new FileOutputStream(jpgName); // 指定输出文件
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);		
			JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);
			param.setQuality(50f, true);
			encoder.encode(bimage, param); // 存盘
			out.flush();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	
	/**
	 * txt文件转换为pdf文件
	 * @author huangt 
	 * @time 2012.6.14
	 * @param txtFile  txt文件路径
	 * @param pdfFile  pdf文件路径
	 * @param userPassWord  用户密码
	 * @param waterMarkName  水印内容
	 * @param permission   操作权限
	 */
	public static void generatePDFWithTxt(String txtFile, String pdfFile,
			String userPassWord, String waterMarkName) {
		try {
			// 生成临时文件
			File file = File.createTempFile("huangt", ".pdf");
			// 创建pdf文件到临时文件
			if (createPDFFile(txtFile, file)) {
				// 增加水印和加密
				//waterMark(file.getPath(), pdfFile,waterMarkName);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @author huangt 
	 * @time 2012.6.14
	 * 创建PDF文档
	 * 
	 * @param txtFilePath  txt文件路径(源文件)
	 * @param pdfFilePath  pdf文件路径(新文件)
	 */
	private static boolean createPDFFile(String txtFilePath, File file) {
		// 设置纸张
		Rectangle rect = new Rectangle(PageSize.A4);
		// 设置页码
		HeaderFooter footer = new HeaderFooter(new Phrase("页码:"), true);
		footer.setBorder(Rectangle.NO_BORDER);
		// step1
		Document doc = new Document(rect, 50, 50, 50, 50);
		doc.setFooter(footer);
		try {
			FileReader fileRead = new FileReader(txtFilePath);
			BufferedReader read = new BufferedReader(fileRead);
			// 设置pdf文件生成路径 step2
			PdfWriter.getInstance(doc, new FileOutputStream(file));
			// 打开pdf文件 step3
			doc.open();
			// 实例化Paragraph 获取写入pdf文件的内容,调用支持中文的方法. step4
			while (read.ready()) {
				// 添加内容到pdf(这里将会按照txt文件的原始样式输出)
				doc.add(new Paragraph(read.readLine()));
			}
			// 关闭pdf文件 step5
			doc.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 在pdf文件中添加水印
	 * @author huangt 
	 * @time 2012.6.14
	 * @param inputFile  原始文件
	 * @param outputFile 水印输出文件
	 * @param waterMarkName  水印名字
	 * @param picPath 图片的路径
	 */
	public static void waterMark(String inputFile,String outputFile,String waterMarkName,String picPath) {
		try {
			PdfReader reader = new PdfReader(inputFile);
			PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
					outputFile));
			int total = reader.getNumberOfPages() + 1;
			//生成水印图片
			createJpgByFont(waterMarkName, picPath) ;
			Image image = Image.getInstance(picPath);
			image.setAbsolutePosition(0,100);
			PdfContentByte under;
			for (int i = 1; i < total; i++) {
				under = stamper.getUnderContent(i);
				// 添加图片
				under.addImage(image);
			}
			stamper.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 图片旋转
	 * @author huangt 
	 * @time 2012.6.14
	 *
	 */
	 public static BufferedImage rotateImage(final BufferedImage bufferedimage,
	            final int degree){
	        int w = bufferedimage.getWidth();
	        int h = bufferedimage.getHeight();
	        int b = w>h?w:h ;
	        int type = bufferedimage.getColorModel().getTransparency();
	        BufferedImage img;
	        Graphics2D graphics2d;
	        graphics2d = (img = new BufferedImage(b, b, type))
	                .createGraphics();
	        graphics2d.setColor(Color.WHITE); // 背景色
	        graphics2d.fillRect(0, 0,b,b); // 画一个矩形

	        graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_ON);
	        graphics2d.setColor(Color.WHITE); // 背景色
	        graphics2d.rotate(Math.toRadians(degree),w,h);
	        graphics2d.drawImage(bufferedimage,-(int)(b*0.28)/2,0, null);
	        graphics2d.dispose();
	        return img;
	    }

}
 
<think>好的,用户的问题是关于在ESXi安装Windows时遇到Boot Manager错误的解决方案。我需要根据提供的引用资料来整理解决方法。 首先,用户提到安装时出现Boot Manager问题,可能需要调整启动顺序。根据引用[1],应该重启树莓派,进入Setup界面,选择Boot Manager,然后选择U盘启动。这里虽然用户可能使用的是ESXi环境,但原理类似,可能需要手动选择正确的启动设备。 接下来,引用[2]指出,如果在Boot Manager选择“Boot normally”后虚拟机崩溃或闪退,可能涉及多个原因,比如镜像损坏、配置错误等。需要检查镜像完整性、虚拟机配置是否符合Windows要求,比如CPU、内存设置,以及是否启用了正确的虚拟化选项。 然后,引用[3]提到在安装CentOS时遇到蓝屏问题,解决方法是强制进入BIOS设置。这可能也适用于Windows安装,即通过虚拟机设置强制进入BIOS,调整启动顺序或检查引导选项是否正确。 综合这些信息,步骤大致包括:检查启动设备顺序,确保从正确的安装介质启动;验证镜像文件的完整性;调整虚拟机配置如启用EFI支持、分配足够资源;以及尝试强制进入BIOS调整引导设置。此外,如果问题持续,可能需要重新创建虚拟机或更换安装镜像。 还要考虑用户可能的操作错误,比如是否正确选择了启动项,或者是否存在硬件兼容性问题。需要将这些步骤分点整理,确保用户能逐步操作,同时引用相关引用资料作为支持。</think>以下是解决ESXi安装Windows时出现Boot Manager问题的分步方案: ### 解决方法 1. **强制进入BIOS设置界面** - 在虚拟机编辑界面选择:`虚拟机选项` → `引导选项` - 勾选`强制进入BIOS设置`,保存后重启虚拟机[^3] - 在BIOS中手动调整启动顺序,确保安装介质(ISO/U盘)为第一启动项 2. **检查启动介质与镜像完整性** - 确认Windows镜像文件未损坏(可通过MD5/SHA校验) - 使用官方工具(如Rufus)重新制作U盘启动盘[^1] - 尝试更换USB接口或U盘(兼容性问题可能导致识别失败) 3. **调整虚拟机配置** ```markdown - 启用EFI支持:`虚拟机设置` → `高级` → 勾选`启用UEFI安全引导` - 增加内存分配:建议至少4GB内存 - 检查虚拟CPU兼容性:禁用`硬件虚拟化`(部分旧CPU不支持嵌套虚拟化) ``` 4. **安装过程中操作建议** - 在Boot Manager界面选择安装介质时,避免选择`Boot normally`[^2] - 若出现蓝屏,尝试断开不必要的虚拟设备(如额外添加的磁盘、USB控制器) 5. **特殊场景处理** ```markdown - 对于Windows Server安装:需在BIOS中关闭`Secure Boot` - 若使用NVMe磁盘:添加`VMware NVMe控制器`替代默认SCSI控制器 - 安装完成后:移除安装介质再重启,避免循环进入安装界面 ``` ### 技术原理 该问题多由引导顺序错误或硬件虚拟化配置冲突导致。ESXi的UEFI固件在检测到多个可启动设备时,可能无法自动选择正确的引导分区[^1]。通过强制指定引导顺序和调整虚拟化参数,可规避硬件抽象层(HAL)的初始化错误[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值