html to pdf スクリーンショット保存機能実装
2022-01-21 17:50:46
技術の活用
itext.jar : バイトファイル入力ストリームを画像、pdfなどに変換します。
html2canvas.js : htmlページの領域をbase64エンコードされた画像リソースとしてスクリーンショットする。
ジャバ+JS
1. リソースの準備
itext.jar
www.baidu.com
html2canvas.js
www.baidu.com
2. フロントエンドのコード
// take a screenshot, document.querySelector("body") is the area to be screenshot
function test() {
html2canvas(document.querySelector("body"), {
onrendered: function (canvas) {
var dataUrl = canvas.toDataURL('image/png');
var formData = new FormData(); // simulate a form object
formData.append("imgData", convertBase64UrlToBlob(dataUrl)); //write data
var xhr = new XMLHttpRequest(); //Data transfer method
xhr.open("POST", "http://localhost:8080/pdf"); //configure the transfer method and address
xhr.send(formData);
xhr.onreadystatechange = function () { // callback function
};
}
});
}
//format the image base64 encoding into a byte file stream
function convertBase64UrlToBlob(urlData){
//Remove the header of the url and convert to byte
var bytes=window.atob(urlData.split(',')[1]);
//handle exception, convert ascii code less than 0 to greater than 0
var ab = new ArrayBuffer(bytes.length);
var ia = new Uint8Array(ab);
for (var s = 0;s<bytes.length;s++){
ia[s] = bytes.charCodeAt(s);
}
return new Blob( [ab] , {type : 'image/png'});
}
<body onclick="test()">//just call the screenshot method
3. バックエンドのコード
@RequestMapping(value = "/pdf",method = RequestMethod.POST)
public void test(MultipartHttpServletRequest request, HttpServletResponse response) throws IOException {
String filePath = "D:\\blog\\\exportPdf2.pdf";
String imagePath = "D:\\\blog\\\exportImg2.png";
Document document = new Document();
try{
Map getMap = request.getFileMap();
MultipartFile mfile = (MultipartFile) getMap.get("imgData"); //get data
InputStream file = mfile.getInputStream();
byte[] fileByte = FileCopyUtils.copyToByteArray(file);
FileImageOutputStream imageOutput = new FileImageOutputStream(new File(imagePath));//open the input stream
imageOutput.write(fileByte, 0, fileByte.length);//generate local image file
imageOutput.close();
PdfWriter.getInstance(document, new FileOutputStream(filePath)); //itextpdf file
document.open();
document.add(new Paragraph("JUST TEST ... "));
Image image = Image.getInstance(imagePath); //itext-pdf-image
float heigth = image.getHeight();
float width = image.getWidth();
int percent = getPercent2(heigth, width); //proportional to reduce the image
image.setAlignment(Image.MIDDLE);
image.scalePercent(percent+3);
document.add(image);
document.close();
}catch (DocumentException de) {
System.err.println(de.getMessage());
}
catch (Exception e) {
e.printStackTrace();
}
}
private static int getPercent2(float h, float w) {
int p = 0;
float p2 = 0.0f;
p2 = 530 / w * 100;
p = Math.round(p2);
return p;
}
4 パッケージ名
import com.itextpdf.text;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text;
import com.itextpdf.text.pdf;
import org.springframework.boot;
import org.springframework.boot.autoconfigure;
import org.springframework.stereotype;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.imageio.stream.FileImageOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
4 フロントエンドでスクリーンショットを撮り、バックエンドのインターフェースにアクセスし、スクリーンショットファイルをpdfなどのフォーマットでローカルに保存します。
ご興味があれば、バックエンドを変更して、ファイルをローカルにダウンロードすることも可能です
5 プロジェクトソースコードアドレス
https://github.com/zhangjy520/learn_java/tree/master/boot
これはhtmlからpdfへのスクリーンショット保存機能の実装に関する記事の終わりです、より関連するhtmlからpdfへのスクリーンショット保存の内容は、スクリプトハウスの過去の記事を検索するか、次の関連記事を閲覧を続けてください、私はあなたが将来的にもっとスクリプトハウスをサポートして願っています!。
関連
-
htmlテーブルの比較幅のオーバーフローを解決する方法
-
HTMLimgタグのalt属性とtitle属性の使い方紹介
-
オブジェクトのアニメーションに隠れることなく、オブジェクトの上にdivを表示する方法
-
htmlインライン要素とhtmlブロックレベル要素の概要と相違点
-
行間カラーチェンジを実現するHTML n方法 サンプルコード
-
HTML+CSSプロジェクト開発経験概要(推奨)
-
HTMLのtitle属性を正しく使用するためのいくつかの提案
-
htmlテキスト中の全てのタグを置換する方法
-
TinyEditorは、シンプルで使いやすいhtml WYSIWYGエディタです。
-
Webページ 自動更新のための3種類のコード
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例
-
divにcontentEditable=trueを設定すると、内容をリセットした後にカーソルを配置できない。
-
htmlのボタン自体を中央寄せにする方法
-
HTMlのシームレススクロールマーキー効果
-
htmlのmarquee属性について説明します。
-
FLOW CHARTとUI FLOWの違いについて
-
HTMLでフォームコントロールを無効にする2つの方法 readonly と disabled
-
ページの下のフレームは、探索する文字化けしたコードの問題のパラメータを渡すために
-
html特殊記号 html特殊文字比較表
-
HTMLタグの記述で一番間違えやすいのは