文档文档
  • English
  • 简体中文
GitHub
  • English
  • 简体中文
GitHub
  • 指南

    • 介绍
    • 快速上手
    • API 用法

API 用法

提示

为突出重点,并未列出和解释每一个文件中的所有函数和参数,更多未列出的内容可到对应的文件中查看,如有疑问文件内容无法满足的流程控制需求,可咨询我司技术人员获取解答。**

1. 初始化 elasticpdf

以纯 HTML+Javascript 项目代码演示的初始化如下


var elasticpdf_viewer = null;
function initialPDFEditor() {
	// 监听 pdf 编辑各种信息的回调
	listenPDFEditorMessage();
	elasticpdf_viewer = document.getElementById('elasticpdf-iframe').contentWindow;
  
  // PDF文件链接,也可使用 pdf base64 数据,
  // PDF base64 数据例如 pdf_url ='data:application/pdf;base64,JVB...'
	var pdf_url = 'https://app.elasticpdf.com/web/tutorial-607.pdf';
	elasticpdf_viewer.postMessage({
		"source": "elasticpdf",
		"function_name": "initialApp",
		"content": {
			'language': 'zh-cn',         // 交互语言,支持中文和英文
			'pdf_url': pdf_url,
			'display_annotation_list': true, // 是否默认展开批注列表
			'read_only_model': false,    // 是否默认激活只读模式
			'member_info': {             // 用户信息
				'id': 'elasticpdf_id',
				'name': 'elasticpdf',
			},
			'show_reply_panel': true,    // 点击页面批注是否弹出批注编辑面板和回复内容框
			'modify_others_annotation': true,  // 是否允许编辑他人批注
			'path_merge_interval': 2000,       // 间隔时间内的画笔路径自动合并,单位毫秒
			'show_message': true,              // 操作过程中是否显示提示语
		}
	}, '*');
}

2. elasticpdf数据外传

下面函数演示如何与 ElasticPDF app 进行组件通信,即 传入数据、指令 和 接收数据、指令 。仍然以纯 HTML+Javascript 代码为例。


// 监听 elasticpdfapp 传出的数据
function listenPDFEditorMessage() {
	window.addEventListener('message', (e) => {
		if (e.data.source != 'elasticpdf') {
			return;
		}

		// 监听打开本地文档,可以选择是否将文档上传于服务器
		if (e.data.function_name == 'openLocalFile') {
      // console.log('本地 PDF 文档加载成功');
			uploadLocalFile(e.data.content);
			reloadData();
		}

		// pdf 加载结束的回调函数,可以在此处导入批注文件
    // 或者加入并生成新的批注
		if (e.data.function_name == 'pdfLoaded') {
			// console.log('PDF加载成功');
      
      // 新增批注
			// var page_number=7;
			// var anno_id='1743689572423_1';
			// highlightAnnotationWithArrowMark(page_number,anno_id);
			reloadData();
		}

		// 接收编辑后的pdf数据,所有操作的批注都被以标准格式写入到了 PDF 中
		if (e.data.function_name == 'downloadPDF') {
      // 相应 PDF 文件数据
			let file_name = e.data.content['file_name'];
			let pdf_blob = e.data.content['pdf_blob'];
			let pdf_base64 = e.data.content['pdf_base64'];
      
			// console.log('PDF信息', pdf_base64);
			// 如果文档没有被编辑过,则 pdf_base64 仍然是文件名
			// 接收到 pdf 数据,其中 pdf_base64 可以快捷上传到服务器
			postService('upload-pdf-data', {
				'file_name': file_name,
				'file_id': '123ddasfsdffads',
				'file_data': pdf_base64,
			});
		}

		// pdf 批注编辑回调,可以在此处导出批注并传输到服务器
    // 每一次批注的修改,包括任意级别的增删改查都会传回这个数据
		if (e.data.function_name == 'annotationsModified') {
      
			// 获取独立的 pdf 批注内容,不包含对应的 pdf ,文档内容极小,非常适合云端协同等系统
			let this_data = elasticpdf_viewer.pdfAnnotation.outputAnnotations();
			let annotation_content = JSON.stringify(this_data['file_annotation']);
			let file_name = this_data['file_name'];
      
			// console.log('批注信息', annotation_content); 
			postService('upload-annotation-data', {
				'file_name': file_name,
				'file_id': '123ddasfsdffads',
				'file_annotation': annotation_content,
			});
		}
	});
}

3. 调用内部函数

通过内部类名函数,简单调用 ElasticPDF app 内部函数。篇幅有效,下列内容仅是示例,代码包中有更多函数可直接调用。

// 获取 PDF 文件数据,数据结果会通过回调函数 'downloadPDF' 传回
function getPDFData() {
	elasticpdf_viewer.getPDFData();
}

// 打开或者关闭批注列表
function openOrCloseAnnotatioList() {
	elasticpdf_viewer.editAnnotation();
}


// 导出可保存的纯批注对象,节省网络、流量等
function outputAnnotation() {
	var this_data = elasticpdf_viewer.pdfAnnotation.outputAnnotations();
	var content = JSON.stringify(this_data['file_annotation']);
	// console.log('导出批注', content);
}

// 清空当前文件的所有批注
function clearAnnotation() {
	elasticpdf_viewer.confirmToClearFileAnnotations();
	elasticpdf_viewer.addOperationTips("批注已清空");
}

// 切换并打开文档
function changeFile() {
	var test_pdf = 'https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf';
	elasticpdf_viewer.pdfAnnotation.refreshFabricState(1);
	elasticpdf_viewer.pdfAnnotation.openFile(test_pdf);
	elasticpdf_viewer.addOperationTips("file changed 文件已修改");
}

// 设置并修改当前用户,简便的与系统内用户信息匹配
function setMember() {
	var this_member = {
		'id': 'test_id',
		'name': 'test_name',
	};
	elasticpdf_viewer.setCurrentMemberId(this_member);
	elasticpdf_viewer.addOperationTips("设置用户成功");
}

// 将已有批注写入到当前文件中
function reloadOldAnnotationData() {
	var old_annotation = getOldAnnotation();
	elasticpdf_viewer.setPureFileAnnotation({
		'file_annotation': old_annotation
	});
}

// 在这里写重载批注业务逻辑
async function reloadData() {
	return;
}


// 与后端服务器进行网络通信的函数
async function postService(url, data) {
	// 在这里写批注上传服务器逻辑
	return;
}

// 生成模拟旧批注数据
function getOldAnnotation() {
	var old_annotation = {
		"annos-for-page-1": {
			"page_id": "annos-for-page-1",
			"page_canvas_container": {},
			"page_annotations": [],
			"page_canvas": {
				"fabric_canvas": {
					"version": "5.2.0",
					"objects": [{
						"type": "rect",
						"version": "5.2.0",
						"left": 64.38,
						"top": 159.99,
						"width": 608.27,
						"height": 290.3,
						"fill": "rgba(255,237,0,0.3)",
						"stroke": "rgba(17,153,158,1)",
						"erasable": true
					}],
					"background": "rgba(255, 255, 255, 0)"
				},
				"width": 994,
				"height": 1407,
				"fabric_canvas_json": {
					"version": "5.2.0",
					"objects": [{
						"type": "rect",
						"version": "5.2.0",
						"left": 64.38,
						"top": 159.99,
						"width": 608.27,
						"height": 290.3,
						"fill": "rgba(255,237,0,0.3)",
						"stroke": "rgba(17,153,158,1)",
						"erasable": true,
						"id": "1742436474916_1",
						"hasControls": true,
						"hasBorders": true,
						"selectable": true,
						"lockMovementX": false,
						"lockMovementY": false,
						"member_id": "elasticpdf_id",
						"member_name": "elasticpdf",
						"my_type": "rectangle",
						"comment": "添加批注",
						"backup_opacity": 1,
						"lockRotation": false
					}],
					"background": "rgba(255, 255, 255, 0)"
				}
			}
		}
	}
	return JSON.stringify(old_annotation);
}

4. 自定义UI按钮

批注功能按钮

批注功能按钮由 Javascript 代码生成,可以轻易决定是否显示以及修改样式

// 创建顶部注释工具栏
function setAnnotationButtons() {
	var annotation_buttons_node = document.getElementById('firefly-annotation-buttons');
	annotation_buttons_node.innerHTML = ''; // 清空所有子元素
	var buttons_text = {
		'zh-cn': [
			'<div>',
			'<button title="下载批注后的文件(批注将标记在下载的文件中)" id="ff-download-btn" onclick="myDownLoad()" type="button"><i class="fa fa-folder" aria-hidden="true"><span></span></i></button>',
			'<button title="截取PDF部分页" id="ff-extract-pdf" onclick="extractPDF()" type="button"><i class="fa fa-map" aria-hidden="true"><span></span></i></button>',
			'<button title="导出标注(json格式)" id="ff-output-btn" onclick="outputAnnotations()" type="button"><i class="fa fa-download" aria-hidden="true"><span></span></i></button>',
			'<button title="导入标注(json格式)" id="ff-import-btn" onclick="openAnnotationFile()" type="button"><i class="fa fa-upload" aria-hidden="true"><span></span></i></button>',
			'<button title="切换至英文" id="ff-language-btn" onclick="setLanguage(1)" type="button"><i class="fa fa-language" aria-hidden="true"><span></span></i></button>',
			'</div>',
			'<div>',
			'<button title="选中对象" id="ff-pointer-obj" onclick="setFabricTop(this)" type="button"><i class="fa fa-mouse-pointer" aria-hidden="true"><span></span></i></button>',
			'<button title="编辑标注" id="ff-edit-btn" onclick="editAnnotation()" type="button"><i class="fa fa-list-ul" aria-hidden="true"><span></span></i></button>',
			'<button title="文本高亮(再次点击取消滑选标注)" id="ff-highlight-btn" onclick="clickTab(this)" type="button"><i class="fa fa-paint-brush" aria-hidden="true"><span></span></i></button>',
			'<button title="文本下划线(再次点击取消滑选标注)" id="ff-underline-btn" onclick="clickTab(this)" type="button"><i class="fa fa-underline" aria-hidden="true"><span></span></i></button>',
			'<button title="文本删除线(再次点击取消滑选标注)" id="ff-strikethrough-btn" onclick="clickTab(this)" type="button"><i class="fa fa-strikethrough" aria-hidden="true"><span></span></i></button>',
			'<button title="插入签名" id="ff-import-signature" onclick="openSignaturePanel()" type="button"><i class="fa fa-signature" aria-hidden="true"><span></span></i></button>',
			'<button title="插入图片" id="ff-import-img" onclick="chooseImage()" type="button"><i class="fa fa-picture-o" aria-hidden="true"><span></span></i></button>',
			'<button title="页面截图" id="ff-screen-shot" onclick="addFabricObj(this,6)" type="button"><i class="fa fa-camera"><span></span></i></button>',
			'<button title="画笔工具" id="ff-free-draw" onclick="fabricDraw(this)" type="button"><i class="fa fa-pencil" aria-hidden="true"><span></span></i></button>',
			'<button title="文字工具" id="ff-add-text" onclick="addFabricObj(this,2)" type="button"><i class="fa fa-font" aria-hidden="true"><span></span></i></button>',
			'<button title="箭头工具" id="ff-add-arrow" onclick="addFabricObj(this,3)" type="button"><i class="fa fa-external-link-square" aria-hidden="true"><span></span></i></button>',
			'<button title="矩形工具" id="ff-add-rect" onclick="addFabricObj(this,4)" type="button"><i class="fa fa-window-maximize" aria-hidden="true"><span></span></i></button>',
			'<button title="圆形工具" id="ff-add-circle" onclick="addFabricObj(this,5)" type="button"><i class="fa fa-circle" aria-hidden="true"><span></span></i></button>',
			'<button title="直线工具" id="ff-add-line" onclick="addFabricObj(this,7)" type="button"><i class="fa fa-minus" aria-hidden="true"><span></span></i></button>',
			'<button title="超链接工具" id="ff-add-hyperlink" onclick="addFabricObj(this,10)" type="button"><i class="fa fa-link" aria-hidden="true"><span></span></i></button>',
			'<button title="身份印章工具" id="ff-add-stamp" onclick="addFabricObj(this,8)" type="button"><i class="fa fa-id-card" aria-hidden="true"><span></span></i></button>',
			'<button title="插入对勾" id="ff-add-check" onclick="addFabricObj(this,9)" type="button"><i class="fa fa-check" aria-hidden="true"><span></span></i></button>',
			'</div>',
			'<div>',
			'<div class="read-only-model-div" id="hide-anno-div"></div>',
			'<button title="AI聊天" id="ff-ai-btn" onclick="chatToPDF()" type="button"><i class="fa fa-comments" aria-hidden="true"><span></span></i></button>',
			'<button title="橡皮檫" id="ff-eraser-btn" onclick="clickTab(this)" type="button"><i class="fa fa-eraser" aria-hidden="true"><span></span></i></button>',
			'<button title="撤销批注" id="ff-undo-btn" onclick="undoAnnotation()" type="button"><i class="fa fa-undo" aria-hidden="true"><span></span></i></button>',
			'<button title="重做批注" id="ff-redo-btn" onclick="redoAnnotation()" type="button"><i style="transform: rotateY(180deg);" class="fa fa-undo" aria-hidden="true"><span></span></i></button>',
			'<button title="清除所有批注" id="ff-clear-file-annotation-btn" onclick="clearFileAnnotations()" type="button"><i class="fa fa-trash" aria-hidden="true"><span></span></i></button>',
			'<button title="帮助文档" style="' + help_button_style +
			'" id="ff-help-btn" onclick="openHelpDoc()" type="button"><i class="fa fa-question-circle" aria-hidden="true"><span></span></i></button>',
			'</div>',
		]} [tips_language];

	var new_html = '';
	for (var i = 0; i < buttons_text.length; i++) {
		var btn_html = buttons_text[i];
		if (!btnInHiddenBtns(btn_html)) {
			new_html += buttons_text[i];
		}
	}
	annotation_buttons_node.innerHTML = new_html;

	// 为预览模式选择创建选择 div
}

预览按钮样式修改

预览样式都写在了 HTML 中,同样支持方便的修改,以下是一些示例代码,可用于修改缩放控件

<div id="toolbarViewerMiddle">
				<div class="splitToolbarButton">
					<button id="zoomOut" class="toolbarButton" title="Zoom Out" tabindex="21"
						data-l10n-id="zoom_out">
						<span data-l10n-id="zoom_out_label">缩小</span>
					</button>
					<div class="splitToolbarButtonSeparator"></div>
					<button id="zoomIn" class="toolbarButton" title="Zoom In" tabindex="22"
						data-l10n-id="zoom_in">
						<span data-l10n-id="zoom_in_label">放大</span>
					</button>
				</div>
				<span id="scaleSelectContainer" class="dropdownToolbarButton">
					<select id="scaleSelect" title="Zoom" tabindex="23" data-l10n-id="zoom">
						<option id="pageAutoOption" title="" value="auto" selected="selected"
							data-l10n-id="page_scale_auto">自动缩放</option>
						<option id="pageActualOption" title="" value="page-actual"
							data-l10n-id="page_scale_actual">实际大小</option>
						<option id="pageFitOption" title="" value="page-fit"
							data-l10n-id="page_scale_fit">适合页面</option>
						<option id="pageWidthOption" title="" value="page-width"
							data-l10n-id="page_scale_width">页面宽度</option>
						<option id="customScaleOption" title="" value="custom" disabled="disabled"
							hidden="true"></option>
						<option title="" value="0.5" data-l10n-id="page_scale_percent"
							data-l10n-args='{ "scale": 50 }'>50%</option>
						<option title="" value="0.75" data-l10n-id="page_scale_percent"
							data-l10n-args='{ "scale": 75 }'>75%</option>
						<option title="" value="1" data-l10n-id="page_scale_percent"
							data-l10n-args='{ "scale": 100 }'>100%</option>
						<option title="" value="1.25" data-l10n-id="page_scale_percent"
							data-l10n-args='{ "scale": 125 }'>125%</option>
						<option title="" value="1.5" data-l10n-id="page_scale_percent"
							data-l10n-args='{ "scale": 150 }'>150%</option>
						<option title="" value="2" data-l10n-id="page_scale_percent"
							data-l10n-args='{ "scale": 200 }'>200%</option>
						<option title="" value="3" data-l10n-id="page_scale_percent"
							data-l10n-args='{ "scale": 300 }'>300%</option>
						<option title="" value="4" data-l10n-id="page_scale_percent"
							data-l10n-args='{ "scale": 400 }'>400%</option>
					</select>
				</span>
			</div>
		</div>
		<div class='op-buttons-container' id='op-buttons-container'>
			<div id='firefly-annotation-buttons' class='annotation-buttons'>

			</div>
		</div>
		<div id="loadingBar">
			<div class="progress">
				<div class="glimmer">
				</div>
			</div>
		</div>
	</div>
</div>

更多 API

在 elasticpdf 中,所有按钮,参数函数都是可以深入调用的,篇幅有限并未展现所有相关内容,欢迎联系我们的技术人员了解更多。

在 GitHub 上查看项目
Prev
快速上手