使用canvas生成PDF,并含有水印

使用canvas生成图片,并含有水印

在项目中有一个功能是将获得的数据以PDF的方式展示,并且有水印

生成水印

这里使用自定义指令来实现操作

生成watermark.js来设置这个自定义指令

import Vue from 'vue'

Vue.directive('watermark', (el, binding) => {
  function addWaterMarker(str, parentNode, font, textColor) { // 水印文字,父元素,字体,文字颜色
    var can = document.createElement('canvas') //创建画布
    parentNode.appendChild(can) // 将画布添加到传入进来的DOM元素中
    can.width = 180 // 给画布设置宽高
    can.height = 140
    can.style.display = 'none' // 将背景图的画布隐藏不显示
    var cans = can.getContext('2d') // 开始绘制画布
    cans.rotate(-10 * Math.PI / 180) // 设置画布旋转角度
    cans.font = font || '16px Microsoft JhengHei' // 画布的内容
    cans.fillStyle = textColor || 'rgba(180, 180, 180, 0.3)' // 画布文字颜色
    cans.textAlign = 'left'
    cans.textBaseline = 'Middle'
    cans.fillText(str, can.width / 5, can.height / 2)  // 在画布上绘制填色的文字
    parentNode.style.background = 'url(' + can.toDataURL('image/png') + ') repeat '  // 设置画布背景颜,这里的背景是将画布转化成64进制的路径
  }
  addWaterMarker(binding.value.text, el, binding.value.font, binding.value.textColor)
})
<div id="pdfDom" ref="pdfDom" class="pdf-content" style="padding: 10px;">
    <!-- <pdf-view :src="src" :if-page="true" /> -->
    <van-cell v-for="(item,index) in pdfData" :key="index" v-watermark="{text:'明日教育',textColor:'rgba(180, 180, 180, 0.5)',font:'30px Microsoft JhengHei'}" size="large">
        <div v-if="paperId === 4" class="isPC">
            {{ item.title }}
            <p>
                {{ item.content }}
            </p>
        </div>
        <div v-if="paperId === 2">
            <p>
                {{ item.type }}
            </p>
            <p v-for="item2 in item.context" :key="item2.index">
                {{ item2.title }}: <br>
                {{ item2.content }}
            </p>
        </div>
    </van-cell>
</div>

生成图片

generateImg() {
const _this = this
html2Canvas(this.$refs['pdfDom'], {
allowTaint: true,
scale: 2,
dpi: 182,
backgroundColor: null,
useCORS: true,
width: this.$refs['pdfDom'].offsetWidth,
height: this.$refs['pdfDom'].offsetHeight

}).then(function(canvas) {
const dataURL = canvas.toDataURL('image/png')
_this.imgUrl = dataURL
}
)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用iText7将富文本HTML转换为PDF并添动态页数和水印的示例: ```java import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.kernel.colors.ColorConstants; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import com.itextpdf.kernel.pdf.xobject.PdfFormXObject; import java.io.File; import java.io.IOException; public class RichHtmlToPdfConverter { public static void main(String[] args) throws IOException { String html = "<html><body><h1>Hello, World!</h1></body></html>"; String pdfPath = "output.pdf"; PdfWriter writer = new PdfWriter(pdfPath); PdfDocument pdfDoc = new PdfDocument(writer); pdfDoc.setDefaultPageSize(new Rectangle(PageSize.A4.getLeft(), PageSize.A4.getBottom(), PageSize.A4.getRight(), PageSize.A4.getTop())); PdfFont font = PdfFontFactory.createFont("path/to/font.ttf", PdfEncodings.IDENTITY_H, true); int pageNum = 1; ConverterProperties props = new ConverterProperties(); HtmlConverter.convertToPdf(html, pdfDoc, props); int n = pdfDoc.getNumberOfPages(); for (int i = 2; i <= n; i++) { PdfPage page = pdfDoc.getPage(i); PdfCanvas canvas = new PdfCanvas(page); canvas.beginText() .setFontAndSize(font, 12) .moveText(pdfDoc.getDefaultPageSize().getRight() - 72, 36) .showText(String.format("Page %d", pageNum)) .endText(); pageNum++; } PdfFormXObject watermark = new PdfFormXObject(new Rectangle(0, 0, 100, 100)); PdfCanvas canvas = new PdfCanvas(watermark, pdfDoc); canvas.setFillColor(ColorConstants.LIGHT_GRAY); canvas.setStrokeColor(ColorConstants.LIGHT_GRAY); canvas.rectangle(0, 0, 100, 100); canvas.fill(); canvas.beginText() .setFontAndSize(font, 24) .moveText(20, 50) .showText("Confidential") .endText(); pageNum = 1; for (int i = 1; i <= n; i++) { PdfPage page = pdfDoc.getPage(i); canvas = new PdfCanvas(page); canvas.addXObject(watermark, 0, 0); canvas.beginText() .setFontAndSize(font, 12) .moveText(pdfDoc.getDefaultPageSize().getRight() - 72, 36) .showText(String.format("Page %d", pageNum)) .endText(); pageNum++; } pdfDoc.close(); } } ``` 在上面的示例中,我们首先创建一个PdfWriter和PdfDocument对象,然后设置默认页面大小为A4纸张大小。然后使用iText7的HtmlConverter将富文本HTML字符串转换为PDF文档。在转换HTML字符串为PDF文档后,我们使用循环遍历文档中的每个页面,并在每个页面的右下角添动态页码。最后,我们创建一个PdfFormXObject对象,添水印文本“Confidential”,并将其添到每个页面中。 请注意,上面的示例中的代码片段是未经测试的,仅供参考。您需要根据您自己的需求进行修改和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值