生成pdf代碼:
//pdf
//定義上傳文件的屬性
var param = {
fileName: "",//文件名稱,上傳接口返回
fileSize: "",//文件大小
filePage: "",//文件頁數
printnum: "1",//章的編號 多選拼接 例:1,2
pointx: "",//X軸坐標 多選拼接 例:1268,1368
pointy: "",//Y軸坐標 多選拼接 例:590,490
isRidingSeam: 'N',
printNums: '1'
};
//顯示pdf
$("#pdf").change(function () {
$('#pdfDiv').show();
//關閉左側pdf彈窗
$('.closePDF').click(function () {
$('#pdfDiv').hide();
});
var pdfFileURL = $("#pdf").val();
if (pdfFileURL) {
var formData = new FormData();
var file = document.getElementById("pdf").files[0];
formData.append("Files", file);
$("#imgDiv").empty();//清空上一PDF文件展示圖
var files = $("#pdf").prop('files');//獲取到文件
var fileSize = files[0].size;
var mb;
if (fileSize) {
mb = fileSize / 1048576;
if (mb > 10) {
$.WeMsg("文件大小不能>10M", "ERROR");
return;
}
}
$("#pdfName").text(files[0].name).attr("title", files[0].name); //名稱
if (mb !== "") {
mb = parseInt(mb);
$("#sizeText").text(mb.toFixed(2) + "Mb"); //大小
}
//給后端文件附具體的值
param.fileName = files[0].name;
param.fileSize = fileSize;
/*pdf.js無法直接打開本地文件,所以利用FileReader轉換*/
var reader = new FileReader();
reader.readAsArrayBuffer(files[0]);
reader.onload = function (e) {
var myData = new Uint8Array(e.target.result);
var docInitParams = {
data: myData
};
var typedarray = new Uint8Array(this.result);
PDFJS.getDocument(typedarray).then(function (pdf) {//PDF轉換為canvas
$("#imgDiv").css("border", "0"); //清除文本、邊框
if (pdf) {
var pageNum = pdf.numPages;
if (pageNum >= 2)
$('.isRiding').show();
else
$('.isRiding').hide();
param.filePage = pageNum;
$("#pagesText").text(pageNum);
for (var i = 1; i <= pageNum; i++) {
var canvas = document.createElement('canvas');
canvas.style.width = '1000px';
canvas.style.borderRadius = '10px';
canvas.style.border = '1px solid #CA7C4E';
canvas.style.margin = '10px';
canvas.id = "pageNum" + i;
$("#imgDiv").append(canvas);
var context = canvas.getContext('2d');
openPage(pdf, i, context);
}
}
});
$("#imgDiv").show();
};
}
});
在$(function(){})中截圖代碼:
//截圖代碼
var clientWidth = document.documentElement.clientWidth || document.body.clientWidth;
var clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
// 更新canvas寬高
$("#bg_canvas").attr("width", clientWidth * 0.4);
$("#bg_canvas").attr("height", clientHeight);
$("#bg_canvas").hide();
screenshotClick("frmAdd", "imgDiv");
screenshotClick("frm", "dlgimgDiv");
給小按鈕賦值:
function screenshotClick(node, obj) {
//去掉默認的contextmenu事件,否則會和右鍵事件同時出現。
$(`#${node} input`).bind("contextmenu", function (e) {
if ($(this).attr("type") === "text" || $(this).attr("type") === "number") {
return false;
}
});
$(`#${node} input`).off("mousedown").on("mousedown", function (e) {
if (e.button === 2) {
if ($(`#${obj}`).children().length !== 0) {
if ($(this).attr("type") === "text" || $(this).attr("type") === "number") {
$("#itemMenu").show();
$("#itemMenu").css("left", e.pageX + 10 + "px");
$("#itemMenu").css("top", e.pageY + 10 + "px");
$.node = this;
}
}
}
});
$(`#${node} textarea`).bind("contextmenu", function (e) {
return false;
});
$(`#${node} textarea`).off("mousedown").on("mousedown", function (e) {
if (e.button === 2) {
if ($(`#${obj}`).children().length !== 0) {
$("#itemMenu").show();
$("#itemMenu").css("left", e.pageX + 10 + "px");
$("#itemMenu").css("top", e.pageY + 10 + "px");
$.node = this;
}
}
});
$("body").off("click").on("click", function () {
$("#itemMenu").hide();
});
}
function screenshot() {
$("#itemMenu").hide();
$("#bg_canvas").show();
//調用選取截屏
clipScreenshots("bg_canvas");
}
調用截屏:
function screenshot() {
$("#itemMenu").hide();
$("#bg_canvas").show();
//調用選取截屏
clipScreenshots("bg_canvas");
}
顯示的時候加載pdf:
function evalFile(obj) {
var rowData = $(`#${$(obj).parents('table').attr("id")}`).DataTable().row($(obj).parents('tr')[0]).data();
//去后台獲取pdf的文件路徑,根據文件名,類型,文件編號
var rawLength = "";
$("#dlgimgDiv").empty();
$.ajax({
type: "post",
url: "/Engineering/GetFilePathByFile",
data: {
"fileName": rowData.Wegkoix,
'fileType': rowData.WegkoiZfxn
},
success: function (data) {
//顯示pdf
var pdfData = data;
pdfData = location.origin + "/" + pdfData.slice(1);
PDFJS.getDocument(pdfData).then(function (pdf) {//PDF轉換為canvas
$("#dlgimgDiv").css("border", "0"); //清除文本、邊框
if (pdf) {
var pageNum = pdf.numPages;
if (pageNum >= 2)
$('.isRiding').show();
else
$('.isRiding').hide();
$("#pagesText").text(pageNum);
for (var i = 1; i <= pageNum; i++) {
var canvas = document.createElement('canvas');
canvas.style.width = '1000px';
canvas.style.borderRadius = '10px';
canvas.style.border = '1px solid #CA7C4E';
canvas.style.margin = '10px';
canvas.id = "pageNum" + i;
$("#dlgimgDiv").append(canvas);
var context = canvas.getContext('2d');
openPage(pdf, i, context);
}
}
});
}
});
}
加載 一頁的pdf
function openPage(pdfFile, pageNumber, context) {
var scale = 2;
pdfFile.getPage(pageNumber).then(function (page) {
viewport = page.getViewport(scale);
var canvas = context.canvas;
canvas.width = viewport.width;
canvas.height = viewport.height;
canvas.style.width = "100%";
canvas.style.height = "100%";
var renderContext = {
canvasContext: context,
viewport: viewport
};
page.render(renderContext);
});
return;
}
截屏的代碼:
//默認畫筆線寬 var defaultStrokeWidth = 1;//畫矩形選取框的線寬 //選取划線的canvasExt var canvasExt = { //畫矩形 畫筆顏色 線寬 drawRect: function (canvasId, penColor, strokeWidth) { var that = this; that.penColor = penColor; that.penWidth = strokeWidth; var canvas = document.getElementById(canvasId); //canvas 的矩形框 var canvasRect = canvas.getBoundingClientRect(); //canvas 矩形框的左上角坐標 var canvasLeft = canvasRect.left; var canvasTop = canvasRect.top; // 要畫的矩形的起點 xy var x = 0; var y = 0; //鼠標點擊按下事件,畫圖准備 canvas.onmousedown = function (e) { //設置畫筆顏色和寬度 var color = that.penColor; var penWidth = that.penWidth; // 確定起點 x = e.clientX - canvasLeft; y = e.clientY - canvasTop; // 添加layer $("#" + canvasId).addLayer({ type: 'rectangle', strokeStyle: color, strokeWidth: penWidth, name: 'areaLayer', fromCenter: false, x: x, y: y, width: 1, height: 1 }); // 繪制 $("#" + canvasId).drawLayers(); $("#" + canvasId).saveCanvas(); //鼠標移動事件,畫圖 canvas.onmousemove = function (e) { // 要畫的矩形的寬高 var width = e.clientX - canvasLeft - x; var height = e.clientY - canvasTop - y; // 清除之前畫的 $("#" + canvasId).removeLayer('areaLayer'); $("#" + canvasId).addLayer({ type: 'rectangle', strokeStyle: color, strokeWidth: penWidth, name: 'areaLayer', fromCenter: false, x: x, y: y, width: width, height: height }); $("#" + canvasId).drawLayers(); }; }; //鼠標抬起 canvas.onmouseup = function (e) { var color = that.penColor; var penWidth = that.penWidth; canvas.onmousemove = null; var width = e.clientX - canvasLeft - x; var height = e.clientY - canvasTop - y; $("#" + canvasId).removeLayer('areaLayer'); $("#" + canvasId).addLayer({ type: 'rectangle', strokeStyle: color, strokeWidth: penWidth, name: 'areaLayer', fromCenter: false, x: x, y: y, width: width, height: height }); $("#" + canvasId).drawLayers(); $("#" + canvasId).saveCanvas(); // 把body轉成canvas html2canvas(document.body, { scale: 1, // allowTaint: true, useCORS: true //跨域使用 }).then(canvas => { var capture_x, capture_y; if (width > 0) { //從左往右畫 capture_x = x + that.penWidth; } else { //從右往左畫 capture_x = x + width + that.penWidth; } if (height > 0) { //從上往下畫 capture_y = y + that.penWidth; } else { //從下往上畫 capture_y = y + height + that.penWidth; } printClip(canvas, capture_x, capture_y, Math.abs(width), Math.abs(height)); }); // 移除畫的選取框 $("#" + canvasId).removeLayer('areaLayer'); // 隱藏用於華畫取框的canvas $("#" + canvasId).hide(); }; } }; //老石 :選取截屏 function clipScreenshots(canvasId) { canvasExt.drawRect(canvasId, "red", defaultStrokeWidth); } //打印截取區域 截取 截取的起點x 截取的起點y 截取的起點寬 截取的起點高 function printClip(canvas, capture_x, capture_y, capture_width, capture_height) { // 創建一個用於截取的canvas var clipCanvas = document.createElement('canvas'); clipCanvas.width = capture_width; clipCanvas.height = capture_height; // 截取 clipCanvas.getContext('2d').drawImage(canvas, capture_x, capture_y, capture_width, capture_height, 0, 0, capture_width, capture_height) var clipImgBase64 = clipCanvas.toDataURL(); // 生成圖片 var clipImg = new Image(); clipImg.src = clipImgBase64; //var con = confirm('識別圖片文字嗎?取消則保存截圖'); //if (con) { //調用后台ocr $.post("/Engineering/CallOcrReturnStr", { urlImage: clipImg.src }, function (res) { if (res !== "") { //把結果添加到文本框 var data = JSON.parse(res); var val = ""; if ($.node.tagName === "INPUT") { data.forEach(item => { val += item.words; }); } else { val=data.map(item=> { return item.words; }).join("\n") } $($.node).val(val); } else { $.WeMsgBox("ocr轉換失敗"); } }); //調用打印功能 //$(clipImg).print(); //} else { // downloadIamge(clipImgBase64); //} } //下載保存圖片 function downloadIamge(imgUrl) { // 圖片保存有很多方式,這里使用了一種投機的簡單方法。 // 生成一個a元素 var a = document.createElement('a'); // 創建一個單擊事件 var event = new MouseEvent('click'); // 生成文件名稱 var timestamp = new Date().getTime(); var name = imgUrl.substring(22, 30) + timestamp + '.png'; a.download = name; // 將生成的URL設置為a.href屬性 a.href = imgUrl; // 觸發a的單擊事件 開始下載 a.dispatchEvent(event); }
后端代碼:
[HttpPost]
public string CallOcrReturnStr(string urlImage)
{
if (string.IsNullOrEmpty(urlImage)) return "";
//這個地方需要考慮隊列
string fileName = "";
if (urlImage.StartsWith("data:image"))
fileName = mWeApi.Base64StringToImage(urlImage);
else if (urlImage.StartsWith("http:") || urlImage.StartsWith("https:")) //要把圖片保存到本地
{
}
string json = mWeApi.OcrImgConvertToText(fileName);
return json;
}
[HttpPost]
public string GetFilePathByFile(string fileName, string fileType)
{
if (string.IsNullOrEmpty(fileName) || string.IsNullOrEmpty(fileType))
return "";
string path = "~/Files/TechDoc/" + fileType + "/" + fileName.TrimEnd();
if (System.IO.File.Exists(Server.MapPath(path)))
return path;
return "文件名不存在";
}
public string SaveFileDoc()
{
if (Request.Files.Count == 0) return "上傳失敗,請選擇文件";
List<string> listFile = new List<string>();
string path = "~/Files/TechDoc/";
if (!Directory.Exists(Server.MapPath(path)))
Directory.CreateDirectory(Server.MapPath(path));
try
{
for (int i = 0; i < Request.Files.Count; i++)
{
var file = Request.Files[i];
string fileName = Request.Files[i].FileName;
if (string.IsNullOrEmpty(fileName))
return "文件名為空";
fileName = fileName.Substring(fileName.LastIndexOf('\\') + 1);
file.SaveAs(Server.MapPath(path + fileName));
}
if (path.StartsWith("~"))
path = path.Substring(1, path.Length - 1);
return "OK" + path;
}
catch (Exception ex)
{
return "上傳失敗";
}
}
//base64轉圖片
public string Base64StringToImage(string base64)
{
if (string.IsNullOrEmpty(base64)) return "";
//base64 = RemoveByRegex(base64, ".*base64,"); //速度慢
base64 = base64.Replace("data:image/png;base64,", "");
string fileName = "";
try
{
byte[] bytes = Convert.FromBase64String(base64);
if (bytes == null) return null;
MemoryStream ms = new MemoryStream(bytes);
Bitmap bitmap = new Bitmap(ms);
//保存圖片,獲取url地址
Random rd = new Random();
fileName = DateTime.Now.ToString("yyyyMMddhhmmssfff") + rd.Next(10000, 99999) + ".png";
string path = "~/OcrFile/";
if (!Directory.Exists(System.Web.HttpContext.Current.Server.MapPath(path)))
Directory.CreateDirectory(System.Web.HttpContext.Current.Server.MapPath(path));
string imgUrl = path + fileName;
if (File.Exists(imgUrl))
File.Delete(imgUrl);
else
bitmap.Save(System.Web.HttpContext.Current.Server.MapPath(imgUrl), ImageFormat.Png);
ms.Close();//關閉當前流,並釋放所有與之關聯的資源
bitmap.Dispose();
}
catch (Exception ex)
{
LogWriter.Write(LOG_CATEGORY.WIN_UI, LOG_LEVEL.ERROR, "Base64StringToImage:" + ex.ToString());
return null;
}
return fileName;
}
private static object obj = new object();
public string OcrImgConvertToText(string fileName)
{
if (string.IsNullOrEmpty(fileName)) return "";
var client = new Baidu.Aip.Ocr.Ocr(OCR_API_KEY, OCR_API_SECRET_KEY);
client.Timeout = 60000;
string imgUrl = System.Web.HttpContext.Current.Server.MapPath("~/OcrFile/" + fileName);
if (!File.Exists(imgUrl)) return "";
try
{
lock (obj) //確保只處理一張圖片
{
byte[] image = File.ReadAllBytes(imgUrl);
JObject result = client.GeneralBasic(image);
//過濾掉無用字符
JObject jo = (JObject)JsonConvert.DeserializeObject(result.ToString());
string text = jo["words_result"].ToString();
return text;
}
}
catch (Exception ex)
{
LogWriter.Write(LOG_CATEGORY.WIN_UI, LOG_LEVEL.ERROR, "OcrImgConvertToText:" + ex.ToString());
return null;
}
}
html代碼:
<div id="itemMenu" style="display:none;position:fixed;z-index: 10000;">
<table border="1" cellspacing="0">
<tr>
<td style="cursor:default;padding:5px 10px;border:1px solid #ccc;background:#fff;" align="center" onclick="screenshot()">智能識別</td>
</tr>
</table>
</div>
<div id="pdfs">
<div id="pdfDiv">
<div id="imgDiv" style="margin: 0 auto;width: 595px;min-height: 842px;border: 1px solid #CA7C4E;border-radius: 10px;text-align: center;">
</div>
</div>
</div>
<a href="javascript:;" class="btn file">
選擇PDF
<input id='pdf' data-field="Wegkoix" type='file' name='file' accept="application/pdf">
</a>
引入的js:
@*顯示pdf需要的js*@
<script src="~/Content/pdfHelper/js/pdf.js"></script>
<script src="~/Content/pdfHelper/js/FileSaver.js"></script>
<script src="http://d3js.org/d3.v3.min.js"></script>
@*截屏用到的js*@
<script src="~/Content/CommJs/html2canvas.js"></script>
<script src="~/Content/CommJs/jQuery.print.js"></script>
<script src="~/Content/CommJs/jcanvas.min.js"></script>
效果:


