实现PDF加水印以及自定义水印样式
< template>
< div>
< button @click= "previewHandle" > 预览< / button>
< button @click= "downFileHandle" > 下载< / button>
< el- input v- model= "watermarkText" / >
< el- input v- model. number= "watermarkrotate" / >
< iframe id= "log_frame" class = "log-iframe" frameborder= "0" : src= "pdfPreviewUrl" > < / iframe>
< / div>
< / template>
< script setup>
import { ref, reactive, onMounted } from 'vue'
import { degrees, PDFDocument, rgb, StandardFonts } from "pdf-lib" ;
import fontkit from '@pdf-lib/fontkit'
const pdfFileEnd = ref ( 'http://111.229.162.189:8003/file/construction/2024_01_08/三高共管对接接口(5)_14ba6d68.pdf' )
const pdfPreviewBlob = ref ( )
const pdfPreviewUrl = ref ( '/pdf/web/viewer.html?file=http://111.229.162.189:8003/file/construction/2024_01_08/三高共管对接接口(5)_14ba6d68.pdf' )
const watermarkText = ref ( '2024-01-17' )
const watermarkrotate = ref ( 45 )
const addWatermark = async ( rotate ) => {
try {
const existingPdfBytes = await fetch ( pdfFileEnd. value) . then ( ( res ) => res. arrayBuffer ( ) ) ;
const pdfDoc = await PDFDocument. load ( existingPdfBytes) ;
const pages = pdfDoc. getPages ( ) ;
for ( let i = 0 ; i < pages. length; i++ ) {
const noPage = pages[ i] ;
const { width, height } = noPage. getSize ( ) ;
for ( let i = 0 ; i < 10 ; i++ ) {
for ( let j = 0 ; j < 3 ; j++ ) {
noPage. drawText ( watermarkText. value, {
x : 230 * j + 36 ,
y : ( height / 4 ) * i + 20 ,
size : 20 ,
color : rgb ( 0.46 , 0.53 , 0.6 ) ,
rotate : degrees ( rotate) ,
opacity : 0.3 ,
} ) ;
}
}
}
const pdfBytes = await pdfDoc. save ( ) ;
pdfPreviewBlob. value = pdfBytes
} catch ( error) {
console. log ( "文件下载失败!" ) ;
}
}
const previewHandle = async ( ) => {
console. log ( typeof ( watermarkrotate. value) ) ;
await addWatermark ( watermarkrotate. value)
const blob = new Blob ( [ pdfPreviewBlob. value] , { type : 'application/pdf' } ) ;
const url = window. URL . createObjectURL ( blob) ;
pdfPreviewUrl. value = '/pdf/web/viewer.html?file=' + url
}
const downFileHandle = ( ) => {
var blob = new Blob ( [ pdfPreviewBlob. value] , { type : "application/pdf" } ) ;
var link = document. createElement ( "a" ) ;
link. href = window. URL . createObjectURL ( blob) ;
link. download = '水印pdf' ;
link. click ( ) ;
}
onMounted ( ( ) => {
addWatermark ( )
} )
< / script>
< style lang= "scss" scoped>
. log- iframe {
width : 800px;
height : 520px;
}
< / style>