在數字化辦公時代,PDF以其跨平臺、易于打印和分享等優點,成為了文檔格式的首選。而今天,我們要學習一項超實用的前端黑科技,無需任何插件,就能將網頁內容轉化為PDF并下載,輕松提升工作效率!
npm install jspdf html2canvas
<button @click="exportPDF">導出PDF</button>
<div id="contentToConvert">
<!-- 需要轉換為 PDF 的內容 -->
</div>
import jsPDF from 'jspdf';
import html2canvas from 'html2canvas';
export default {
methods: {
async exportPDF() {
const element=document.getElementById('contentToConvert');
const canvas=await html2canvas(element);
const imgData=canvas.toDataURL('image/png');
const pdf=new jsPDF({
orientation: 'p', // 縱向
unit: 'mm', // 單位
format: 'a4' // 紙張大小
});
const imgWidth=210; // A4紙寬度,單位mm
const pageHeight=297; // A4紙高度,單位mm
let imgHeight=(canvas.height * imgWidth) / canvas.width;
let position=0;
let pageData='';
// 處理多頁情況
if (imgHeight < pageHeight) {
pageData=imgData;
} else {
while (imgHeight > 0) {
pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight > pageHeight ? pageHeight : imgHeight);
imgHeight -=pageHeight;
position -=pageHeight;
if (imgHeight > 0) {
pdf.addPage();
}
}
}
// 添加圖片到PDF
pdf.addImage(pageData, 'PNG', 0, 0, imgWidth, imgHeight>pageHeight?pageHeight:imgHeight);
// 保存PDF
pdf.save('download.pdf');
}
}
};
import jsPDF from 'jspdf';
import html2canvas from 'html2canvas';
這兩行代碼引入了 jsPDF 和 html2canvas 庫,用于生成PDF和將HTML元素轉換為 canvas。
const element=document.getElementById('contentToConvert');
這行代碼獲取了ID為 contentToConvert 的HTML元素,也就是我們需要轉換為PDF的內容。
const canvas=await html2canvas(element);
這行代碼使用 html2canvas 將目標元素轉換為 canvas 對象。
const pdf=new jsPDF({
orientation: 'p', // 縱向
unit: 'mm', // 單位
format: 'a4' // 紙張大小
});
這行代碼創建了一個新的 jsPDF 對象,并設置了PDF的頁面方向、單位和紙張大小。
const imgWidth=210; // A4紙寬度,單位mm
const pageHeight=297; // A4紙高度,單位mm
let imgHeight=(canvas.height * imgWidth) / canvas.width;
let position=0;
let pageData='';
這幾行代碼計算了要添加到PDF中的圖片的寬度、高度和位置。
pdf.addImage(pageData, 'PNG', 0, 0, imgWidth, imgHeight>pageHeight?pageHeight:imgHeight);
這行代碼將圖片添加到PDF文檔中。
pdf.save('download.pdf');
這行代碼將生成的PDF文件保存到本地,文件名為 download.pdf。
通過以上步驟,我們就能輕松地將網頁內容轉換為PDF并下載。這項技術不僅可以用于生成各種報表和文檔,還可以用于制作電子書、電子票據等,應用場景非常廣泛,快來試試吧!
作者:某某白米飯
來源:Python 技術
網上下載的 pdf 學習資料有一些會帶有水印,非常影響閱讀。比如下面的圖片就是在 pdf 文件上截取出來的。
PIL:Python Imaging Library 是 python 上非常強大的圖像處理標準庫,但是只能支持 python 2.7,于是就有志愿者在 PIL 的基礎上創建了支持 python 3的 pillow,并加入了一些新的特性。
pip install pillow
pymupdf 可以用 python 訪問擴展名為*.pdf、.xps、.oxps、.epub、.cbz或*.fb2的文件。還支持了許多流行的圖像格式,包括多頁TIFF圖像。
pip install PyMuPDF
導入需要用到的模塊
from PIL import Image
from itertools import product
import fitz
import os
pdf 去水印的原理和圖片去水印的原理差不多,小編先從去除上面那張圖片的水印開始。
學過計算機的小伙伴們都知道 ,計算機中用 RGB 代表紅綠藍,用 (255, 0, 0) 表示紅色,(0, 255, 0) 表示綠色,(0, 0, 255) 表示藍色,(255, 255, 255) 表示白色,(0, 0, 0) 表示黑色,去水印的原理就是將水印的顏色變成白色(255, 255, 255)。
首先獲取圖片寬和高,用 itertools 模塊獲取寬和高的笛卡爾積作為像素點。每個像素點的顏色都由 前三位的 RGB 和 第四位的 Alpha 通道構成。Alpha 通道不需要,只要 RGB 數據。
def remove_img():
image_file=input("請輸入圖片地址:")
img=Image.open(image_file)
width, height=img.size
for pos in product(range(width), range(height)):
rgb=img.getpixel(pos)[:3]
print(rgb)
用微信截圖的方式查看水印像素點的 RGB。
可以看到水印的 RGB 是 (210, 210, 210),這里用 RGB 的和超過 620 就判定是水印點,此時將像素顏色替換為白色。最后保存圖片。
rgb=img.getpixel(pos)[:3]
if(sum(rgb) >=620):
img.putpixel(pos, (255, 255, 255))
img.save('d:/qsy.png')
示例結果:
PDF 去水印的原理和圖片去水印的原理大致相同,用 PyMuPDF 打開 pdf 文件后,將 pdf 的每一頁都轉換為圖片 pixmap,pixmap 有它自己的 RGB,只需要將 pdf 水印中的 RGB 改為(255, 255, 255) 最后保存為圖片。
def remove_pdf():
page_num=0
pdf_file=input("請輸入 pdf 地址:")
pdf=fitz.open(pdf_file);
for page in pdf:
pixmap=page.get_pixmap()
for pos in product(range(pixmap.width), range(pixmap.height)):
rgb=pixmap.pixel(pos[0], pos[1])
if(sum(rgb) >=620):
pixmap.set_pixel(pos[0], pos[1], (255, 255, 255))
pixmap.pil_save(f"d:/pdf_images/{page_num}.png")
print(f"第{page_num}水印去除完成")
page_num=page_num + 1
示例結果:
圖片轉 pdf 需要注意的是圖片的排序,數字文件名必須先轉換為 int 類型后排序。用 PyMuPDF 模塊打開圖片后將圖片用 convertToPDF() 函數轉成單頁的 pdf。插入到新的 pdf 文件中。
def pic2pdf():
pic_dir=input("請輸入圖片文件夾路徑:")
pdf=fitz.open()
img_files=sorted(os.listdir(pic_dir),key=lambda x:int(str(x).split('.')[0]))
for img in img_files:
print(img)
imgdoc=fitz.open(pic_dir + '/' + img)
pdfbytes=imgdoc.convertToPDF()
imgpdf=fitz.open("pdf", pdfbytes)
pdf.insertPDF(imgpdf)
pdf.save("d:/demo.pdf")
pdf.close()
pdf 和圖片上惱人的水印終于可以在強大的 python 面前消失了。小伙伴們學會了嗎?