itextpdf7 使用之 html转pdf,生成目录可跳转、添加页眉页脚

最近有个需求,生成信用报告。

需求:

1、生成pdf有页眉页脚
2、生成目录
3、目录加锚点可跳转。

难点:

1、生成的目录不能实时读取页码
2、目录是后生成的,属于两份pdf拼接的,不能添加锚点跳转

思路:

1、freemaker进行html页面布局及动态变量替换
2、生成一份pdf文档,用于关键字查询,获取所在页码
3、再生成一份目录+内容的pdf,目录的页码从刚生成的文档中查询,由于此文档目录和内容是同一个文档,所以可以添加锚点

实现:

1、引入 freemaker

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

2、freemaker 默认 文件路径是 resources/tempates
在这里插入图片描述
3、读取freemaker页面布局及变量替换

	Map<String,Object> appendix = new HashMap<>();
	appendix.put("iprTrademarkList", iprTrademarkList);
	appendix.put("iprPatentList", iprPatentList);

	Template  appendixtemp = configurer.getConfiguration().getTemplate("risk_appendix.html");
	content += FreeMarkerTemplateUtils.processTemplateIntoString(appendixtemp, appendix);

4、html转为pdf,添加页眉页脚

	public void html2Pdf(String content, String outPath, String type) {
		try {
			BufferedOutputStream outputStream = FileUtil.getOutputStream(outPath);
			if ("head".equals(type) || "content".equals(type)) { // 封面、临时content文件   无页眉,无水印,无页脚
				PdfUtils.convertHtmlToPdf(content, reportLogoUrl, "", "", false,PageSize.A4, outputStream);
			} else if ("directAndContent".equals(type)) {  // 目录+内容  有页眉、有水印,有页脚
				PdfUtils.convertHtmlToPdf(content, reportLogoUrl, reportHeadText, reportWaterText, true,PageSize.A4, outputStream);
			} else { // 说明、概览     有页眉、有水印,无页脚
				PdfUtils.convertHtmlToPdf(content, reportLogoUrl, reportHeadText, reportWaterText, false,PageSize.A4, outputStream);
			}
		} catch (Exception e) {
			System.out.println("生成模板内容失败"+e.fillInStackTrace());
		}
	}

/**
 * Itext7转换pdf工具类
 */
@Slf4j
public class PdfUtils {

    // 字体文件路径
    private static final String fontPath = "pdf/font/MSYH.TTF";
    // 字体文件 列表
    private static final Set<String> fontSet = new HashSet<>();

    static {
		ClassPathResource classPathResource = new ClassPathResource(fontPath);
        fontSet.add(classPathResource.getPath());
    }
	
	public static void convertHtmlToPdf(String htmlStr, String logoUrl, String headerText, String waterMark, boolean hasFooter, PageSize pageSize, OutputStream outputStream) {
		convertHtmlToPdf(new ByteArrayInputStream(htmlStr.getBytes(StandardCharsets.UTF_8)), logoUrl, headerText, waterMark, hasFooter, pageSize, fontSet, outputStream);
	}

    /**
     * html转 pdf
     * @param inputStream  输入流
     * @param headerText    页眉
     * @param waterMark    水印
     * @param pageSize 纸张大小
     * @param fontPathList  字体路径列表,ttc后缀的字体需要添加<b>,0<b/> 例:C:\front\msyh.ttc,0
     * @param outputStream 输出流
     */
    public static void convertHtmlToPdf(InputStream inputStream, String logoUrl, String headerText, String waterMark, boolean hasFooter,PageSize pageSize,
                                        Set<String> fontPathList, OutputStream outputStream) {

        // 验空
        Objects.requireNonNull(inputStream);
        Objects.requireNonNull(outputStream);

        PdfWriter pdfWriter = new PdfWriter(outputStream);
        PdfDocument pdfDocument = new PdfDocument(pdfWriter);
        //设置纸张大小
        pdfDocument.setDefaultPageSize(pageSize);

        //添加中文字体支持
        ConverterProperties properties = new ConverterProperties();
        FontProvider fontProvider = new FontProvider();

        //添加自定义字体,例如微软雅黑
        if (CollectionUtils.isNotEmpty(fontPathList)) {
            fontPathList.forEach(e -> fontProvider.addFont(e, PdfEncodings.IDENTITY_H));
        }

        PdfFont pdfFont = fontProvider.getFontSet()
                .getFonts()
                .stream()
                .findFirst()
                .map(fontProvider::getPdfFont)
                .orElse(null);


			// 添加页眉
			pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE, new PdfHeaderMarkerEventHandler(pdfFont, headerText, logoUrl));
			// 添加水印
			if (StringUtils.isNotBlank(waterMark)) {
				pdfDocument.addEventHandler(PdfDocumentEvent.INSERT_PAGE, new PdfWaterMarkEventHandler(pdfFont, waterMark));
			}
			if (hasFooter) {
				// 添加页脚
				pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new PdfPageMarkerEventHandler(pdfFont));
			}
        properties.setFontProvider(fontProvider);
        // 读取Html文件流,查找出当中的&nbsp;或出现类似的符号空格字符
        inputStream = readInputStrem(inputStream);

        try {
            // 生成pdf文档
            HtmlConverter.convertToPdf(inputStream, pdfDocument, properties);
        } catch (IOException e) {
            e.printStackTrace();
            log.error("错误信息:pdf转换失败{}", e.getMessage());
        } finally {
            try {
                pdfWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            pdfDocument.close();
        }
    }

    /**
     * 读取HTML 流文件,并查询当中的&nbsp;或类似符号直接替换为空格
     *
     * @param inputStream 输入流
     * @return 去掉特殊标记的输入流
     */
    private static InputStream readInputStrem(InputStream inputStream) {
        // 定义一些特殊字符的正则表达式 如:
        String regEx_special = "\\&[a-zA-Z]{1,10};";
        try(ByteArrayOutputStream baos = new ByteArrayOutputStream();) {
            // 创建缓存大小
            byte[] buffer = new byte[1024]; // 1KB
            // 每次读取到内容的长度
            int len = -1;
            // 开始读取输入流中的内容
            while ((len = inputStream.read(buffer)) != -1) { //当等于-1说明没有数据可以读取了
                baos.write(buffer, 0, len);   //把读取到的内容写到输出流中
            }
            // 把字节数组转换为字符串 设置utf-8字符编码
            String content = baos.toString(String.valueOf(StandardCharsets.UTF_8));
            // 关闭输入流和输出流
            inputStream.close();
            // 判断HTML内容是否具有HTML的特殊字符标记
            Pattern compile = Pattern.compile(regEx_special, Pattern.CASE_INSENSITIVE);
            Matcher matcher = compile.matcher(content);
            String replaceAll = matcher.replaceAll("");
            // 将字符串转化为输入流返回
            return getStringStream(replaceAll);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("错误信息:pdf字符串格式化特殊字符失败{}", e.getMessage());
            return null;
        }
    }

    /**
     * 将一个字符串转化为输入流
     * @param sInputString 字符串
     * @return 字符串对应的输入流
     */
    public static InputStream getStringStream(String sInputString) {
        if (sInputString != null && !sInputString.trim().equals("")) {
            try {
                return new ByteArrayInputStream(sInputString.getBytes(StandardCharsets.UTF_8)); // 设置utf-8字符编码
            } catch (Exception e) {
                e.printStackTrace();
                log.error("错误信息:pdf字符串转输入流失败,{}", e.getMessage());
            }
        }
        return null;
    }


	/**
	 * 将给定List集合中的pdf文档,按照顺序依次合并,生成最终的目标PDF文档
	 *
	 * @param pdfPathLists 待合并的PDF文档路径集合,可以是本地PDF文档,也可以是网络上的PDF文档
	 * @param destPath     目标合并生成的PDF文档路径
	 */
	public static void mergeMultiplePdfs(List<String> pdfPathLists, String destPath) {
		try {
			int size = pdfPathLists.size();
			byte[] pdfData = getPdfBytes(pdfPathLists.get(0));
			for (int i = 1; i < size; i++) {
				pdfData = mergePdfBytes(pdfData, getPdfBytes(pdfPathLists.get(i)));
			}
			if (pdfData != null) {
				FileOutputStream fis = new FileOutputStream(destPath);
				fis.write(pdfData);
				fis.close();
			}
		} catch (Exception e) {
			log.error("合并PDF异常:", e);
		}
	}

	/**
	 * 基于内存中的字节数组进行PDF文档的合并
	 * @param firstPdf 第一个PDF文档
	 * @param secondPdf 第二个PDF文档
	 */
	private static byte[] mergePdfBytes(byte[] firstPdf, byte[] secondPdf) throws IOException {
		if (firstPdf != null && secondPdf != null) {
			// 创建字节数组,基于内存进行合并
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			PdfDocument destDoc = new PdfDocument(new PdfWriter(baos));
			// 合并的pdf文件对象
			PdfDocument firstDoc = new PdfDocument(new PdfReader(new ByteArrayInputStream(firstPdf)));
			PdfDocument secondDoc = new PdfDocument(new PdfReader(new ByteArrayInputStream(secondPdf)));
			// 合并对象
			PdfMerger merger = new PdfMerger(destDoc);
			merger.merge(firstDoc, 1, firstDoc.getNumberOfPages());
			merger.merge(secondDoc, 1, secondDoc.getNumberOfPages());
			// 关闭文档流
			merger.close();
			firstDoc.close();
			secondDoc.close();
			destDoc.close();
			return baos.toByteArray();
		}
		return null;
	}

	/**
	 * 将pdf文档转换成字节数组
	 * @param pdf PDF文档路径
	 * @return 返回对应PDF文档的字节数组
	 */
	private static byte[] getPdfBytes(String pdf) throws Exception {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		InputStream is = Files.newInputStream(Paths.get(pdf));

		byte[] data = new byte[2048];
		int len;
		while ((len = is.read(data)) != -1) {
			out.write(data, 0, len);
		}
		return out.toByteArray();
	}

	/**
	 * 远程文件转化为字节
	 * @param pdf
	 * @return
	 * @throws Exception
	 */
	public static byte[] getRemotePdfBytes(String pdf) throws Exception {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		URL url = new URL(pdf);

		InputStream is =url.openStream();

		byte[] data = new byte[2048];
		int len;
		while ((len = is.read(data)) != -1) {
			out.write(data, 0, len);
		}
		return out.toByteArray();
	}
}
/**
 * 页眉实现类
 */
public class PdfHeaderMarkerEventHandler implements IEventHandler {

    /**
     * pdf字体
     */
    private final PdfFont pdfFont;
    /**
     * 页眉显示
     */
    private final String title;

	private final String logoUrl;

    public PdfHeaderMarkerEventHandler(PdfFont pdfFont, String title, String logoUrl) {
        this.pdfFont = pdfFont;
        this.title = title;
        this.logoUrl = logoUrl;
    }

	@Override
	public void handleEvent(Event event) {

		if (StringUtils.isEmpty(title)) return;

		PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
		PdfDocument pdf = docEvent.getDocument();
		PdfPage page = docEvent.getPage();
		Rectangle pageSize = page.getPageSize();
		PdfCanvas pdfCanvas = new PdfCanvas(page.getLastContentStream(), page.getResources(), pdf);
		Canvas canvas = new Canvas(pdfCanvas, pageSize);
		float x = pageSize.getRight() -60;
		float y = pageSize.getTop() - 32;
		Paragraph p = new Paragraph(title)
			.setFontSize(9)
			.setFont(pdfFont);
		// 显示在顶部右侧位置
		canvas.showTextAligned(p, x, y, TextAlignment.RIGHT);
		URL url = null;
		try {
			url = new URL(logoUrl);
		} catch (MalformedURLException e) {
			throw new RuntimeException(e);
		}
		Image logo = new Image(ImageDataFactory.create(url));
		logo.scaleAbsolute(100, 20);
		logo.setMarginLeft(30);
		logo.setMarginTop(15);
		canvas.add(logo);
		canvas.close();
	}

}
/**
 * 页脚(页码)实现类
 */
public class PdfPageMarkerEventHandler implements IEventHandler {

    /**
     * pdf字体
     */
    private final PdfFont pdfFont;

    public PdfPageMarkerEventHandler(PdfFont pdfFont) {
        this.pdfFont = pdfFont;
    }

    @Override
    public void handleEvent(Event event) {
        PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
        PdfDocument pdf = docEvent.getDocument();
        PdfPage page = docEvent.getPage();
        int pageNumber = pdf.getPageNumber(page);
        Rectangle pageSize = page.getPageSize();
        PdfCanvas pdfCanvas = new PdfCanvas(page.getLastContentStream(), page.getResources(), pdf);
        Canvas canvas = new Canvas(pdfCanvas, pageSize);
        float x = (pageSize.getLeft() + pageSize.getRight()) / 2;
        float y = pageSize.getBottom() + 15;

		Paragraph p = new Paragraph();
		if (1 == pageNumber) {
			p = new Paragraph("")
				.setFontSize(10f)
				.setFont(pdfFont);
		} else {
			p = new Paragraph("第" + (pageNumber -1) + "页")
				.setFontSize(10f)
				.setFont(pdfFont);
		}
        // 绘制到底部中间位置
        canvas.showTextAligned(p, x, y, TextAlignment.CENTER);
        canvas.close();
    }
}

/**
 * pdf水印
 */
public class PdfWaterMarkEventHandler implements IEventHandler {

    /**
     * 水印内容
     */
    private final String waterMarkContent;

    /**
     * 一页中有几行水印
     */
    private final int waterMarkX;

    /**
     * 一页中每列有多少水印
     */
    private final int waterMarkY;
    /**
     * Pdf字体
     */
    private final PdfFont pdfFont;

    /**
     * 默认水印效果5行5列
     * @param pdfFont pdf字体
     * @param waterMarkContent 水印内容
     */
    public PdfWaterMarkEventHandler(PdfFont pdfFont, String waterMarkContent) {
        this(pdfFont, waterMarkContent, 5, 5);
    }

    /**
     * 水印效果
     *
     * @param pdfFont          pdf字体
     * @param waterMarkContent 水印内容
     * @param waterMarkX       一页中有多少行水印
     * @param waterMarkY       一页中有多少列水印
     */
    public PdfWaterMarkEventHandler(PdfFont pdfFont, String waterMarkContent, int waterMarkX, int waterMarkY) {
        this.waterMarkContent = waterMarkContent;
        this.waterMarkX = waterMarkX;
        this.waterMarkY = waterMarkY;
        this.pdfFont = pdfFont;
    }

    @Override
    public void handleEvent(Event event) {

        if (StringUtils.isEmpty(waterMarkContent)) return;

        // 获取pdf对象、页面属性
        PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;
        PdfDocument document = documentEvent.getDocument();
        PdfPage page = documentEvent.getPage();
        Rectangle pageSize = page.getPageSize();

        // 设置画布属性、水印属性
        PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), document);
        Paragraph waterMark = new Paragraph(waterMarkContent).setOpacity(0.5f);
        Canvas canvas = new Canvas(pdfCanvas, pageSize)
            .setFontColor(WebColors.getRGBColor("lightgray")) // 水印颜色效果
            .setFontSize(16)
            .setFont(pdfFont);

        float y = pageSize.getHeight(); // 页面高度
        float x = pageSize.getWidth(); // 页面宽度

        // 根据行列进行绘制
        for (int i = 0; i < waterMarkX; i++) {
            float width = (x / waterMarkX)  * i + 50;
            for (int j = waterMarkY; j > 0; j--) {
                float height = (y / waterMarkY)  * j - 50;
//                System.out.println("waterMarkX: "+width+" waterMarkY: "+height);
                canvas.showTextAligned(waterMark, width, height, document.getNumberOfPages(), TextAlignment.CENTER, VerticalAlignment.MIDDLE, 120);
            }
        }
        canvas.close();
    }

5、 内容html页面上特定字符及锚点id:

	<div class="marginTop20" id="companyinfo">
	    <span style="color: #FFFFFF">directory_1.企业信息</span>
	    <img style="width: 100%" src="/upload/20231031/26e3e390f15ce1eae58367405960519f.jpg"/>
	</div>

6、查询特定内容所在页码

	int companyInfoNum = searchFileNum(fileName, zongtiNum, "directory_1.企业信息");


	 * 查询标题所在页码方法
	 * @param fileUrl
	 * @param startPage
	 * @param content
	 * @return
	 * @throws IOException
	 */
	public int searchFileNum(String fileUrl, int startPage, String content) throws IOException {
		int curent = 0;
		// 创建PdfReader对象
		PdfReader pdfWriter = new PdfReader(fileUrl);
		PdfDocument pdfDocument = new PdfDocument(pdfWriter);
		int numberOfPages = pdfDocument.getNumberOfPages();
		for (int i = startPage; i <= numberOfPages; i++) {
			PdfPage page = pdfDocument.getPage(i);
			String textFromPage = PdfTextExtractor.getTextFromPage(page);
			int index = textFromPage.indexOf(content);
			if (index >= 0) {
				curent = i;
			}
		}
		pdfDocument.close();
		pdfWriter.close();

		return curent;
	}

7、目录html页面替换变量、添加锚点

	<div class="directory1 level1">
         <span class="directory-name"><a href="#companyinfo">1.企业信息</a></span>
         <span class="directory-dot"></span>
         <span class="directory-page">${companyInfoNum}</span>
     </div>

8、合并生成的多个pdf

PdfUtils.mergeMultiplePdfs(Arrays.asList(headerName, pdfDescName, pdfOverViewName, directoryAndContentName), pdfAllName);

9、删除多余的pdf文件

	File headerFile = new File(headerName);

	if (headerFile.exists()) {
		headerFile.delete();
	}
  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要将HTML换为PDF生成目录,您可以使用Java中的iText库。以下是一个示例代码,可以帮助您实现这个功能: ```java import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import java.io.*; import java.util.*; import org.jsoup.*; import org.jsoup.nodes.*; import org.jsoup.select.*; public class HtmlToPdf { public static void main(String[] args) { try { // 读取HTML文件 File input = new File("input.html"); Document doc = Jsoup.parse(input, "UTF-8", ""); // 创建PDF文档 Document pdfDoc = new Document(); PdfWriter.getInstance(pdfDoc, new FileOutputStream("output.pdf")); pdfDoc.open(); // 创建目录 Font font = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL); Chapter chapter = new ChapterAutoNumber("目录"); chapter.setNumberDepth(0); pdfDoc.add(chapter); // 将HTML内容换为PDF Elements elements = doc.body().select("*"); for (Element element : elements) { if (element.tagName().equals("h1")) { // 添加章节 Chapter subChapter = chapter.addSection(new Paragraph(element.text(), font)); subChapter.setBookmarkOpen(false); subChapter.setTriggerNewPage(false); } else { // 添加段落 String text = element.text(); if (!text.equals("")) { pdfDoc.add(new Paragraph(text, font)); } } } // 关闭PDF文档 pdfDoc.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 这个示例代码使用Jsoup库读取HTML文件,并使用iText库将HTML换为PDF。它创建了一个目录章节,并遍历HTML文档中的所有元素,将h1元素添加为章节,将其他元素添加为段落。最后,它将PDF文档保存到输出文件中。 请注意,这只是一个简单的示例代码,您可能需要根据您的具体需求进行修改和优化。 ### 回答2: Java有许多开源库可以实现HTMLPDF功能,其中一个常用的库是iText,下面是使用iText库实现的简单示例代码: ```java import com.itextpdf.text.*; import com.itextpdf.text.html.simpleparser.HTMLWorker; import com.itextpdf.text.pdf.*; import java.io.*; import java.util.ArrayList; import java.util.List; public class HTMLToPDF { public static void main(String[] args) { String inputFile = "input.html"; String outputFile = "output.pdf"; try { Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outputFile)); // 添加页码 writer.setPageEvent(new PdfPageEventHelper() { @Override public void onEndPage(PdfWriter writer, Document document) { try { PdfContentByte cb = writer.getDirectContent(); cb.saveState(); cb.setFontAndSize(BaseFont.createFont(), 10); cb.showTextAligned(PdfContentByte.ALIGN_CENTER, String.valueOf(writer.getPageNumber()), (document.right() + document.left()) / 2, document.bottom() - 10, 0); cb.restoreState(); } catch (DocumentException | IOException e) { e.printStackTrace(); } } }); document.open(); List<Element> elements = HTMLWorker.parseToList(new FileReader(inputFile), null); for (Element element : elements) { document.add(element); } // 生成目录 List<Chunk> chapters = new ArrayList<>(); chapters.add(new Chunk("Chapter 1", new Font(Font.FontFamily.HELVETICA, 14, Font.BOLD))); chapters.add(new Chunk("Chapter 2", new Font(Font.FontFamily.HELVETICA, 14, Font.BOLD))); chapters.add(new Chunk("Chapter 3", new Font(Font.FontFamily.HELVETICA, 14, Font.BOLD))); document.newPage(); Paragraph toc = new Paragraph("Table of Contents", new Font(Font.FontFamily.HELVETICA, 16, Font.BOLD)); toc.setAlignment(Element.ALIGN_CENTER); document.add(toc); for (Chunk chapter : chapters) { Chunk chunk = new Chunk(chapter.getContent(), new Font(Font.FontFamily.HELVETICA, 12)); chunk.setLocalGoto(chapter.getContent()); Paragraph p = new Paragraph(chunk); p.setIndentationLeft(20); document.add(p); } document.close(); System.out.println("PDF生成成功!"); } catch (IOException | DocumentException e) { e.printStackTrace(); } } } ``` 以上代码从名为`input.html`的文件中读取HTML内容,并将其换为PDF格式,生成PDF文件名为`output.pdf`。在生成PDF中,每一页底部都会显示页码,并在最后生成包含目录的页面,目录会自动生成页内链接,点击链接可以跳转到相应的章节。 注意,代码中使用iText版本为`5.x`,需要先导入iText库的相关jar包。 希望以上内容对您有所帮助! ### 回答3: 在Java中,可以使用iText库来将HTML文件换为PDF,并且可以生成目录。 首先,确保已经在Java项目中引入iText库的相关依赖。 接下来,编写代码来实现HTMLPDF的功能。以下是一个示例代码: ```java import com.itextpdf.text.Document; import com.itextpdf.text.Font; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.PdfWriter; import java.io.*; public class HtmlToPdfConverter { public static void main(String[] args) { String htmlFilePath = "input.html"; // 输入的HTML文件路径 String pdfFilePath = "output.pdf"; // 输出的PDF文件路径 try { // 创建PDF文档对象 Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath)); document.open(); // 读取HTML文件内容 BufferedReader br = new BufferedReader(new FileReader(htmlFilePath)); String line; StringBuilder htmlContent = new StringBuilder(); while ((line = br.readLine()) != null) { htmlContent.append(line); } br.close(); // 设置字体样式 Font font = new Font(Font.FontFamily.HELVETICA, 12, Font.NORMAL); // 将HTML换为PDF内容 Paragraph paragraph = new Paragraph(); paragraph.setFont(font); paragraph.add(htmlContent.toString()); document.add(paragraph); // 添加目录 document.add(new Paragraph("目录", font)); document.add(new Paragraph("Chapter 1", font)); document.add(new Paragraph("Chapter 2", font)); // 可以根据实际需要添加更多目录项 document.close(); System.out.println("PDF生成成功!"); } catch (Exception e) { e.printStackTrace(); } } } ``` 以上代码可以将指定的HTML文件换为PDF,并且在PDF生成一个简单的目录。你可以根据需要自定义目录的样式和内容。 请记得将`input.html`替换为你实际的HTML文件路径,将`output.pdf`替换为你希望生成PDF文件路径。 希望这个回答能够帮助到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值