茶已备好,只待君来!感谢关注 前端点线面 (>‿<),本号干货满满:14个门类(100+篇原创)内容——又干又硬、《前端百题斩》pdf——助力薪资double、20+篇思维导图——知识系统化、记忆简单化;加我进卧虎藏龙摸鱼群,一起划水一起嗨!!!‍

前言

PDF 格式是30年前开发的文件格式,并且是使用最广泛的文件格式之一,我们最喜欢使用它作为简历、合同、发票、电子书等文件的格式,最主要的原因是文档格式可以兼容多种设备和应用程序,而且内容 100%保持相同的格式。

React-PDF 简介

React PDF 是一个使用 React 创建 PDF 文件的工具,支持在浏览器、移动设备和服务器上创建PDF文件。

可以用它们轻松地将内容呈现到文档中,我们可以使用 CSS 属性进行样式设置,使用 flexbox 进行布局,它支持渲染文本、canvas、 svg 等等,详情可以参考官网

程序实现

今天我将使用 React-pdf 和 next.js 来构建一个在线简历生成器,先一起来看下效果

在线地址:https://cv.runjs.cool/

初始化项目

yarn create next-app --example with-ant-design next-resume
cd next-resume
yarn add @react-pdf/renderer

React-pdf 渲染需要一些额外的依赖项和 webpack5 配置。

yarn add process browserify-zlib stream-browserify util buffer assert

这一步骤是因为 React-pdf 构建在 PDFKit 的基础之上,在使用浏览器时需要使用两个 node.js API polyfill。而 webpack 5 不再包括自动引入 nodejs polyfill ,我们必须选择进入所有我们想要的 polyfill。为了做到这一点,我们必须修改 webpack 配置

在根目录下创建一个 next.config.js

module.exports = {reactStrictMode: true,webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {config.resolve.fallback = {...config.resolve.fallback,module: "empty",dgram: "empty",dns: "mock",fs: "empty",http2: "empty",net: "empty",tls: "empty",child_process: "empty",process: require.resolve("process/browser"),zlib: require.resolve("browserify-zlib"),stream: require.resolve("stream-browserify"),util: require.resolve("util"),buffer: require.resolve("buffer"),asset: require.resolve("assert"),};config.plugins.push(new webpack.ProvidePlugin({Buffer: ["buffer", "Buffer"],process: "process/browser",}));return config;},
};

实现逻辑

新建在 App.js 将用户输入实时绑定到 state 中,然后时时渲染预览页面

import Preview from './component/Preview'
import React, { useState } from 'react'
function App() {const [profile, setProfile] = useState({name: "狂奔滴小马",about: "分享 Javascript 热门\n框架,探索 web 极致\n优化体验。",email: "maqi1520@qq.com",avatar:"https://p6-passport.byteacctimg.com/img/user-avatar/585e1491713363bc8f67d06c485e8260~300x300.image",})const handleChange = (name, value) => {setProfile({ ...profile, [name]: value })}return (<divstyle={{width: '100%',height: '100vh',display: 'flex',}}><div style={{ width: '50%' }}><div><label>姓名</label><inputname='name'defaultValue={profile.name}onChange={(e) => {handleChange(e.target.name, e.target.value)}}/></div><div><label>头像地址</label><inputname='avatar'defaultValue={profile.avatar}onChange={(e) => {handleChange(e.target.name, e.target.value)}}/></div><div><label>简介</label><inputname='about'defaultValue={profile.about}onChange={(e) => {handleChange(e.target.name, e.target.value)}}/></div><div><label>email</label><inputname='email'defaultValue={profile.email}onChange={(e) => {handleChange(e.target.name, e.target.value)}}/></div></div><Preview profile={profile} /></div>)
}export default App

Preview.js  是页面的右侧部分,并嵌入我们将要创建的PDF文档。

另外我们还有 PDFDownloadLink,它可以用来下载 pdf 文件。

import React from 'react'
import { Document, Page, PDFViewer, PDFDownloadLink } from '@react-pdf/renderer'
import LeftSection from './LeftSection'
import  RightSection from './RightSection'
import styles from '../styles'const Preview = ({ profile }) => {return (<div style={{ flexGrow: 1 }}><PDFViewershowToolbar={false}style={{width: '100%',height: '95%',}}><Template profile={profile} /></PDFViewer><PDFDownloadLinkdocument={<Template profile={profile} />}fileName='somename.pdf'>{({ loading }) => (loading ? 'Loading document...' : 'Download now!')}</PDFDownloadLink></div>)
}
// 创建文档组件
const Template = ({ profile }) => {return (<Document><Page size='A4' style={styles.page}><LeftSection profile={profile} /><RightSection about={profile.about} /></Page></Document>)
}export default Preview

我们可以直接设置 PDF 为 A4 纸尺寸。

import { StyleSheet } from '@react-pdf/renderer'export default StyleSheet.create({page: {display: 'flex',flexDirection: 'row',},section_right: {margin: 10,padding: 10,paddingTop: 20,width: '75%',},section_left: {width: '25%',height: '100%',backgroundColor: '#084c41',},profile_container: {display: 'flex',flexDirection: 'column',alignItems: 'center',marginTop: '20',marginBottom: '20px',height: '150',},name_text: {paddingTop: '10px',paddingBottom: '5px',fontSize: '14px',fontWeight: '900',color: 'white',}
})

通过 StyleSheet.create 创建 JavaScript 样式表

LeftSection.js 代码展示

import { View, Text, Image, } from '@react-pdf/renderer'
import styles from '../styles'export const Profile = ({ profile }) => {return (<View style={styles.profile_container}><Image style={styles.profile_img} src={profile.avatar} /><Viewstyle={{justifyContent: 'center',}}><Text style={styles.name_text}>{profile.name}</Text></View><Text style={styles.profession_text}>{profile.about}</Text></View>)
}const LeftSection = ({ profile }) => {return (<View style={styles.section_left}><Profile profile={profile} /></View>)
}export default LeftSection

也可以直接写内联样式控制 PDF 内的样式。但是不支持 float 浮动属性,具体大家可以看官网

遇到问题

本以为这样就可以完成,没想到还有一个巨坑,不支持中文,中文在 pdf 中会显示乱码, 通过 issue 找到了答案

import { StyleSheet, Font } from "@react-pdf/renderer";Font.register({family: "Alibaba-PuHuiTi-Light",src: "/Alibaba-PuHuiTi-Light.ttf",
});export const styles = StyleSheet.create({page: {fontFamily: "Alibaba-PuHuiTi-Light",flexDirection: "row",display: "flex",...},
})

然后就可以显示中文字体了。这边我下载了阿里巴巴普惠体。

重构

以上是一个简易版的实现,通过上面的代码示例,你应该至少看懂了原理,为了让整个简历数据丰富,我使用了antd 来实现丰富的表单列表。使用 react context 来管理我们的数据。下面展示下目录结构:

├── components
│   ├── app
│   │   └── index.tsx
│   ├── editor
│   │   ├── FormCreator.tsx
│   │   ├── conifg.js
│   │   └── index.tsx
│   ├── icon
│   │   └── index.tsx
│   └── preview
│       ├── avatar.tsx
│       ├── awardList.tsx
│       ├── educationList.tsx
│       ├── index.tsx
│       ├── profile.tsx
│       ├── projectList.tsx
│       ├── skillList.tsx
│       ├── style.ts
│       └── workExpList.tsx
├── context
│   └── resumeContext.ts
├── hooks
│   └── useResume
│       └── index.ts
├── pages
│   ├── _app.tsx
│   ├── api
│   │   └── hello.js
│   └── index.tsx
└── styles├── logo.png└── globals.css

部署

最后我使用 vercel 部署并且绑定自定义域名

体验地址 https://cv.runjs.cool/

以上就是本文全部内容,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

参考资料

[1]

官网: https://react-pdf.org/

[2]

issue: https://github.com/diegomura/react-pdf/issues/267

[3]

dev.to: https://dev.to/przpiw/react-pdf-rendering-4g7b

[4]

devtool: https://cv.devtool.tech/app

··············· 执鸢者简介 ·················

看号主详细信息,来这

瞅一瞅

畅所欲言交流

【1】前端百题斩系列

【2】Vue系列

【3】React系列

【4】前端基础系列

【5】基础知识

【6】浏览器系列

【7】构建工具系列

【8】网络系列

【9】Node系列

【10】源码系列

【11】前端有意思

【12】手撕算法系列

【13】个人总结

【14】杂科

打造在线简历生成器,让面试官眼前一亮……相关推荐

  1. 什么样的项目经历会让面试官眼前一亮

    很多同学都问过我类似的问题: 咱们<C语言也能干大事>中讲的自己动手写windows优化大师.自己动手写计算器等东西只是写着玩的小玩具而已,这些能用来以后找工作时写到简历中的作品吗?看别人 ...

  2. system流怎么判断为空_面试时被问到单例模式,怎么回答才能让面试官眼前一亮?...

    考虑到马上到来的金九银十的面试季,我给大家介绍一下面试官的必问题,先从单例模式开始,这个设计模式看似简单,想回答得让面试官眼前一亮,还不是那么容易的. 一.什么是单例模式 单例模式是一种常用的软件设计 ...

  3. 吐血整理的 Android 性能优化思维导图,让面试官眼前一亮

    引言 现如今 Android 开发行业的主要问题是因为初级的 Android 开发者太多了,导致初级开发的市场过于饱和,所以也就进一步导致初级和中级的开发者面临更大的竞争,因此想要脱离这种竞争现状,只 ...

  4. 如何写一份让面试官眼前一亮的简历?

    一份好的简历,能给面试官一个好的印象,可能你接下来的面试就很顺利.一份糟糕的简历,可能连简历筛查都过不了,所以写好一份简历很重要. 可是笔者发现很多伙伴根本不会写简历,有的内容不全,有的重点不突出,有 ...

  5. 五年JAVA开发,一份简历搞定面试官!

    每年春节后两个月都是招聘高峰期,很多想换工作的职场人士都会选择在此时换一份工作,毕竟一年之计在于春,对于公司和个人而言都是一个新的开始. 大家在春节长假身心得到放松后,准备摩拳擦掌的找工作了,不过大部 ...

  6. 【css炫酷动画】让面试官眼前一亮的故障风格文字动画

    今天分享一个用 css3 来实现一个最近特别流行的故障风格的文字展示动画,我敢说,只要你在你的项目中用到这个动画,面试官看到了一定会眼前一亮.下面先来看一下成品图 该动画效果就比较复杂了,用到的知识比 ...

  7. 面试时遇到一致性哈希算法这样回答会让面试官眼前一亮

    [CSDN 编者按]很多人都知道什么是哈希函数,在后端面试和开发中会遇到"一致性哈希",那什么是一致性哈希呢,当面试官问到你又该如何给出漂亮的回答. 作者 | 丁威       责 ...

  8. 别盲从了,spring 解决循环依赖真的一定需要三级缓存吗?demo结合源码讲解三级缓存的真正目的,一级缓存singletonFactories的真正作用,看到文章最后让面试官眼前一亮

    背景 本篇是我上一篇<3分钟秒懂,最简单通俗易懂的spring bean 生命周期介绍与源码分析,附上demo完整源码>姊妹篇 spring 三级缓存问题是面试中的热点问题,大部分回答者会 ...

  9. 〖编程初学者的自我修养 - 优质简历篇②〗- 面试官所青睐的优秀简历是什么样的?

    历时18个月,采访 850+ 得到的需求. 不管你是在校大学生.研究生.还是在职的小伙伴,该专栏有你想要的职业规划.简历.面试的答案. 说明:该文属于 编程初学者的自我修养 专栏,购买任意白宝书体系化 ...

最新文章

  1. python解压zip文件_Python中最快解压zip文件的方法
  2. ASPxGridView之PreviewRow
  3. Encoder-Decoder (based on RNNS / LSTM)用于序列学习方案
  4. live555 源码分析:RTSPServer 组件结构
  5. 那些地方会用C语言多线程,如何用C语言实现多线程
  6. Chapter7-8_Deep Learning for Constituency Parsing
  7. 我的第一个安卓应用程序_今天,我启动了我的第一个移动应用程序。 这是我学到的...
  8. [Ext JS] 3.5 单选框 Radio与复选框CheckBox
  9. 信息安全——密码学之DES介绍
  10. 不知道PDF文件怎么解密?推荐3个实用方法给你
  11. TX2-刷机完成后安装程序ubuntu_linux命令TX2学习总结
  12. LIS3DH运动检测调试过程
  13. docker安装后,并没有ln到/etc/systemd/system/multi-user.target.wants
  14. [转载] 晓说——第13期:欧洲杯硝烟再起 “阴谋论”说赌球黑幕
  15. 非线性电路的分析方法
  16. 工厂方法模式-----女娃造人的故事
  17. android动画制作工具,一款非常好用的动画库Lottie
  18. uni-app富文本图片太大溢出以及富文本显示问题
  19. Android 程序员必须掌握的三种自动化测试方法
  20. 澳禁止华为参与5G网络建设;锤子将编写自己的OS;国产处理器兆芯可运行Windows,已试制出Intel i5级处理器丨Q新闻...

热门文章

  1. 非常适合新手的一个Python爬虫项目: 打造一个英文词汇量测试脚本!
  2. 思科交换机备份文件到服务器,CISCO交换机备份和恢复配置文件的方法
  3. win10禁止计算机进入休眠,Win10怎么关闭系统休眠 Win10关闭系统休眠方法
  4. win10计算机休眠快捷键,让win10电脑快速进入休眠快捷键是什么-
  5. 在Keil4中新建51单片机工程模板详细步骤
  6. 中国石斑鱼养殖产量不断上升,捕捞产量逐渐下降「图」
  7. Android类似微信详细地址选择(高德地图)
  8. win10关闭实时防护的步骤教程
  9. 【hadoop】汽车销售数据统计分析项目(部分)
  10. 笔记本电脑显示以太网未连接_如何向笔记本电脑添加以太网连接