❶ 可以在pdf文檔中添加js代嗎用什麼工具
沒有專門工具
只有木馬類的病毒
❷ 如何創建pdf的buffer,讓pdf.js實現預覽pdf文件
PDF.js 是基於開放的 HTML5 及 JavaScript 技術實現的開源產品。簡單說就是一個 PDF 解析器。運用HTML5JavaScript(即pdf.js僅使用安全的web語言,不包含任何攻擊者可以用的本地代碼塊)的PDF閱讀器pdf.js,直接在標準的HTML頁面上載入和渲染PDF文件, 還可以提高安全性(不需要安裝第三方插件,安全性由瀏覽器保證),瀏覽器所做的安全措施已經為pdf.js提供了安全的運行環境。其對IE和 FireFox瀏覽器的要求是IE9+, FireFox19+。
在線示例: http://jsbin.com/pdfjs-helloworld-v2/1/edit , http://jsbin.com/pdfjs-prevnext-v2/1/edit
源碼:https://github.com/mozilla/pdf.js
官網:http://mozilla.github.io/pdf.js/
pdf.js VS 傳統瀏覽器讀取pdf
一般來說,PDF檔案格式都是在瀏覽器中由外掛程式來描繪,通常是Adobe自己的PDF reader或來自其他供應商的描繪工具,但這些外掛通常無法充分運用PDF的特點,而且由於含有大量的受信任代碼,使得Google Chrome瀏覽器必須運用SandBox沙箱原理,來檢查PDF描繪工具是否遭到未知病毒感染。
使用adobe,必須在本地安裝軟體才能使用,而pdf.js不依賴環境、渲染速度快(測試過,確實很快)、安全性高。
pdf.js渲染PDF文件
pdf.js渲染PDF文件的流程:Fetch pdf (url / buffer) ——> canvas ——> 渲染
如果要深入pdf的渲染,需要去研究pdf.js源代碼。pdf.js可通過pdf文件的地址或pdf數據流獲取pdf,具體實現是調用介面函數 PDFJs.getDoc(url/buffer)將pdf載入html,通過canvas處理, 然後渲染pdf文件。網上給出的都是通過url來獲取pdf的例子,而我在做項目的時候,後台(python)要求是發pdf的數據流給前台,前台接收pdf的buffer,然後通過pdf.js來渲染。當然最初嘗試buffer出現了很多問題,具體問題總結如下:
1)如何通過$.ajax接收後台發給前台的buffer數據;
2)如何將buffer傳給pdf.js來處理(這里我使用了viewer.js, 所以需要考慮的是如何將buffer傳給viewer.js來處理);
3)如何將pdf.js轉換成pdf.js可以接收的buffer格式;
(對應問題解決見代碼注釋)
註:viewer.js是pdf.js的擴展,其將列印、翻頁、縮放等功能進行了實現,且界面非常好看。也就是說如果你引入了viewer.js,pdf的渲染和渲染之後的功能界面都已經幫你實現了,你不用自己去寫界面。
先從官網:http://mozilla.github.io/pdf.js/ 下載代碼,然後使用文件viewer.html , 我的html就是在viewer.html 的基礎上修改的,下面我給出buffer的例子:
<!DOCTYPE html>
<html dir="ltr" mozdisallowselectionprint moznomarginboxes>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="google" content="notranslate">
<title>在線預覽</title>
{% load static %}{% get_static_prefix as STATIC_URL %}
<link href="{{STATIC_URL}}css/preview.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="{{STATIC_URL}}pdfjs/web/viewer.css"/>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/compatibility.js"></script>
<link rel="resource" type="application/l10n" href="{{STATIC_URL}}pdfjs/web/locale/locale.properties"/>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/l10n.js"></script>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/build/pdf.js"></script>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/debugger.js"></script>
<script src="{{STATIC_URL}}js/jquery-1.8.3.js" type="text/javascript"></script>
<script type="text/javascript">
//convertDataURIToBinary()
//不知道什麼原因如果後台直接將pdf的數據流發給前台,得到的是亂碼,將數據轉換成 Uint8Array始終不成功
//所以就讓後台將發送之前的數據流做 了base64編碼發給前台,前台再解碼得到的數據就不是亂碼了。
var BASE64_MARKER = ';base64,';
var preFileId = {{mark}};
//viewer.js全局變數,傳入buffer,回答問題2
var DEFAULT_URL
$(document).ready(function(){
$.ajax({
type:"post",
async: false,
//ajax接收pdf數據流,注意dataType值的設置是否有錯,如果不指定,jQuery將自動根據HTTP包MIME信息返回
//responseXML或responseText . 回答問題1
contentType:"application/pdf;charset=utf-8",
url:"{% url netPan.File.views.browserFuf%}",
data:{
id: preFileId
},
success:function(data){
var pdfAsDataUri = data;
//如果引入了viewer.js , 處理方法
var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
DEFAULT_URL = pdfAsArray;
// 只引入了pdf.js, 未引入viewer.js, 處理方法
// var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
// PDFJS.getDocument(pdfAsArray).then(); 自己寫pdf的處理函數
}
});
});
function convertDataURIToBinary(dataURI) { //編碼轉換,回答問題3
var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
var base64 = dataURI.substring(base64Index);
var raw = window.atob(base64);
var rawLength = raw.length;
//轉換成pdf.js能直接解析的Uint8Array類型,見pdf.js-4068
var array = new Uint8Array(new ArrayBuffer(rawLength));
for(i = 0; i < rawLength; i++) {
array[i] = raw.charCodeAt(i);
}
return array;
}
</script>
<!--先設置全局變數DEFAULT_URL 的值,所以要後調入viewer.js -->
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/viewer.js"></script>
</head>
<body>
省略內容
</body>
</html>
❸ 如何在PDF文件中調用JAVASCRIPT
java可以利用iText(也有其他語言的)來加入:
PdfReader reader = new PdfReader("c://1.pdf");
PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(「c://new1.pdf」), '\0',true);
PdfWriter writer = stamper.getWriter();
PushbuttonField button = new PushbuttonField(writer, new Rectangle(450, 750, 530, 800), "post");
PdfFormField submit = button.getField();
submit.setAction( PdfAction.javaScript("app.alert(『hello,lec』)", writer));
stamper.addAnnotation(submit, 1);
具體就可以去查看iText是怎麼使用的
❹ 如何於使用itext在PDF檔內加javascript時宣告script name
您好,希望以下回答能幫助您
首先用iText原先的PDF檔寫入另一個副本, 我只能夠復制一個頁數及頁面長闊與原檔相同的副本, 但內容會自動rotate了90度,按它的指引用iText增加Javascript入現存的PDF檔,
用iText宣告一個script Name(In the JavaScript Functions dialog box, type myOnMessage as the Script Name, and then click the Add button."), 結果javascipt加了(61 - 101行), 但不能搭配flex使用.
如您還有疑問可繼續追問。
❺ 如何用js生成pdf
1,生成 PDF 這種事情通常由伺服器端做
2,瀏覽器做的話要依賴於插件(ActiveX/Plugin,通常購買第三方的)
3,瀏覽器預覽、列印倒是沒問題(要裝 PDF viewer,Firefox 自帶的 PDF.js 擴展也可以)
4,總結,AngularJS 是瀏覽器端的,干不來這事兒,也不應該干這事兒,我想你最好換個方向
❻ pdf.js實現文字可復制並且選取文字背景不一致,修改選取文字背景
一、安裝和引入pdf.js包。(這里不再做過多的贅述)
二、渲染pdf,同事添加div,進行用來存儲文字,保證文字可以被選取復制。
通過input標簽獲取到數據文件,然後通過getPDF()方法進行渲染。
renderPDF()方法
至此,其實已經實現了pdf文字可復制的要求。但是,由於各個div里的文字寬度和高度的不同,導致選取文字的時候,選取的背景顏色不同統一,需要進行統一背景樣式。
思路:渲染完成pdf以後,監聽頁面的滑鼠按下事件和滑鼠彈起事件。當用戶選取文字完成以後,獲取選取文字的長度和寬度,獲取選取文字距離上邊框和右邊框的值。通過獲取的值來創建div並設置長度寬度以及背景顏色,對文字進行遮罩,最後取消用戶選擇的文字。
1、首先確認滑鼠點擊相對文檔的開始位置:
2、確認用戶選取的文字是從哪開始,在哪結束。
3、最後通過applyColours()進行渲染。
applyColours()判斷了很多種情況,當用戶值選擇了一行的情況,當渲染的文字有還行遞歸調用回來的等多種情況。同事判斷是否換行是通過第一個節點與第二個節點的top值絕對值是否大於10,大於10就表示換行。同時,節點後面兩個節點如果就調用另外一個渲染方法。
otherMothodload()方法:
至此,任務完成。
效果入下圖:
未優化前:
優化後:
這種方法雖然實現背景的渲染,但是存在幾個問題:
1、渲染第一行文字的位置是通過滑鼠按下的位置來確定的,但是當用戶滑鼠按下的位置與選取的文字的位置偏差較大,會導致渲染的div與選取的文字位置有偏差。如下圖:
2、選取文字的長度和寬度是通過獲取文字的內容,文字的size,以及文字的字體。再頁面中創建一個span標簽,然後把文字帶進document里,獲取到寬度和高度。這種方法有些文字渲染出來的長度太長。如下圖:
附上獲取長度和寬度的方法:
以上兩個問題,希望有大神給我一點思路和解決方案。歡迎小夥伴跟我一起討論。
附上項目github:https://github.com/caohelen/pdfjs
❼ JS實現的將html轉為pdf功能【基於瀏覽器端插件jsPDF】
本文實例講述了JS實現的將html轉為pdf功能。分享給大家供大家參考,具體如下:
<!DOCTYPE
html>
<html>
<head>
<title>jsPDF插件</title>
<meta
http-equiv="Content-Type"
content="text/html;
charset=utf-8">
<script
src="https://code.jquery.com/jquery-git.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.0.272/jspdf.debug.js"></script>
</head>
<body>
<p
class="pdf-wrapper"
="to-pdf">HTML
content...<h1>中文</h1>
中國,漢字,測試:合同
模版
中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國</br>中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國中國....................<br/>
中國,漢字,測試:合同
模版
...................<br/>
計費
介面
....................<br/>
<img
src='http://www.jb51.net/images/logo.gif'/>
</p>
<script
type="text/javascript">
var
pdf
=
new
jsPDF('p','pt','a4');
pdf.internal.scaleFactor
=
1;
var
options
=
{
pagesplit:
true
};
//$('.pdf-wrapper')
pdf.addHTML(document.body,options,function()
{
pdf.save('web1111.pdf');
});
</script>
</body>
</html>
運行效果:
更多關於JavaScript相關內容可查看本站專題:《JavaScript擴展技巧總結》、《JavaScript常用函數技巧匯總》、《javascript面向對象入門教程》、《JavaScript中json操作技巧總結》、《JavaScript切換特效與技巧總結》、《JavaScript查找演算法技巧總結》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與演算法技巧總結》、《JavaScript遍歷演算法與技巧總結》及《JavaScript數學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
您可能感興趣的文章:jsPDF導出pdf示例jsPDF生成pdf後在網頁展示實例使用jspdf生成pdf報表phonegap教程使用jspdf庫在應用中生成pdf文件(pdf生成方法)JS導出PDF插件的方法(支持中文、圖片使用路徑)js插件方式打開pdf文件(瀏覽器pdf插件分享)用Javascript檢查Adobe
PDF插件是否安裝的實現代碼純js實現html轉pdf的簡單實例(推薦)基於Phantomjs生成PDF的實現方法JavaScript+Java實現HTML頁面轉為PDF文件保存的方法JavaScript代碼生成PDF文件的方法
❽ 如何創建pdf的buffer,讓pdf.js實現預覽pdf文件
純Java的解決方案:我們首先想到的自然就是JDK1.4提供的JPS(JavaPrintingService)啦,不過,這東西雖然說支持PDF的Flavor,但是,不管是個人實驗還是網上他人的評論,好像根本就是useless,可能如果說你的列印機Driver支持PDF的Flavor的話,JPS會檢測到你的driver的這個特性,能夠成功的列印PDF文檔出來,但是,大部分情況下,這種情形是不成立的,故此JPS死路一條啦!讓我們看看PDF的老家Adobe那裡有沒有什麼法寶,我們發現一個ViewerBean的組件,說是可以將PDF以Bean組件的方式潛入到Swing中,哇,太爽了,不過慢著,協議上說不提供任何支持,也不保證不出任何問題,管那麼些,試過再說,一實驗才知道,靠,Exception頻發,而且這個組件較為陳舊,還是扔一邊吧!還有一個PDFBox,OpenSource的,不過對中文支持不好,而且好像開發進度也不是很好,沒有發布一個正式的版本,基本上不能用於生產環境;最後,求助於Commercial的產品吧,實驗了一下ActiveTree的JPrint,感覺不錯,完全可以勝任我們的需求而且恰到好處,不過授權費很貴,Email問過之後的答復是2000USD的最低購買,呵呵,雖然日本人很有錢,但也心疼這個銀子啊,所以最終也得作罷!(ActiveTree的授權其實挺令我ft的,他其實在2003年的時候是可以免費使用的,但之後就變卦了,呵呵,當時記得我還給提過一些bug之類,算了,人家做出這個東西也不容易)其他商業產品也是價格不菲,所以,基本上純Java的solution到這里就否決了,讓我們看Java-Com的解決方案吧!Java-Com的解決方案:在前一條路走不通之後,我痛定思痛,決定轉向自己不熟悉的領域,ms的領地,我打算從Java中調用Com組件,由Com組件來幫助我們實現PDF的列印工作,不夠這條路也不是一帆風順那!我們知道,AcrobatReader在發布的時候會隨同發布一個支持瀏覽器的com組件用來manipulate他的這個PDF文檔格式,所以,我們想要本地調用這個隨同發布的Com組件來實現PDF列印。雖然Version5,6,7的這個組件格式不一樣(5,6是以ocx的格式發布,7是以dll的格式發布),但是,不管那麼些,先從7開始吧!要調用com,那麼我們需要一個從java到com的Bridge,所以,jacob第一個躍入我的腦海,因為之前就用過嘛!但是麻煩來了,我們並不知道這個com組件提供了那些調用介面啊!哎,沒法,回學校求教熟悉.net的同學,給好不容易弄出幾個需要的調用方法(哎,可憐我的周末啊),星期一就回來用jacob調用啦,可是左試右試就是一直拋異常,我那個氣啊!難道是jacob的為問題?!我就又找了jcom和jcom2等類似的產品,但jcom全是日文文檔,沒有法,而jcom2估計也是一個德行(我忘了為什麼當初否決了這個),所以就決定試一試商業產品吧!這方面的商業產品主要有J-Integra,JPanel(好像叫這個名字)以及一個叫JNIWrapper的產品(這個是一個人用用來演示在java中使用Acrobat5列印PDF的時候提到的)。這些商業產品好的地方就是他可以根據某個你要調用的com組件為你自動生成相應的Proxy對象java代碼,這樣你就可以直接調用你熟悉的java代碼了。像jacob等開源項目,如果給出一個類似的codegeneration工具的話,就完全不遜於這些商業產品啦。鑒於商業產品的價格,我最終還是否決了這些(日本人其實也聽摳門的)。這樣,Java-com也對這個問題沒轍了。不過,最後在我的解決方案中,我還是使用了Jacob,這是後話,暫且不提那我們考慮一下,如果PDF列印不行,列印其他格式行不行?!比如圖片,這個JPS可以完全列印,所以,我們找一下有沒有將PDF格式轉換為其他格式的工具吧!PDF格式轉換的解決方案:在這個領域,主要的就是有GhostScript/GView和ImageMagick,前者可以將PDF格式轉換為PostScript格式,但是好像GhostScript也不能用JPS完全列印出來;而後者是一個將PDF轉換為Image的API工具,他的Java實現叫JMagick,但他有一個跟GhostScript同樣的問題,就是要轉換,就必須在本地安裝,然後通過命令行的方式調用,這個顯然也不是很好,而且集成性很差,還是作罷!剩下的一個是命令行調用啦,這是從itext網站找到的,你可以通過在命令行運行AcroRd32/p/h"pathtoPDFfile"這樣的命令來列印你要列印的PDF文件,當然,你可以在PDF文件生成後就將他們依次放入一個批處理文件來執行這些列印命令,但是這個方案唯一的問題就是,每列印一個文件都會啟動一個AcrobatReader窗口而且必須手動關閉,這現在不能滿足目前的系統要求。好了,所有的方案基本上都羅列完了,也沒有找到一個可行的方案:-((沒有銀子嘛,不然Activetree的JPrint不錯的說)這些東西差不多郁悶了我3,4天吧,那幾天簡直就是boredtodeath.不過,在郁悶的這幾天的結尾,卻有一道靈光閃過我的腦海能不能說啟動一個列印service,當文檔要列印的時候,直接發送給它就行了那?!而恰好我發現一段在網頁中載入PDF文檔的Javascript代碼,而且完全可以使用js來控制PDF的列印,所以,最終的這個方案就浮出水面了1-使用jacob啟動一個IE進程,並隱藏IE窗口;if(ieAutomation==null)ieAutomation=newActiveXComponent("InternetExplorer.Application");ieAutomation.setProperty("Visible",newVariant(false));2-PDF前端在生成PDF文件之後發送生成後的文件到JacobPDFPrinter,JacobPDFPrinter根據出入的PDF文件的全路徑使用Velocity模板引擎動態生成一個包含使用Javascript代碼實現的PDF列印邏輯的HTML文檔(當然,使用Velocity生成文檔這部分邏輯我們單獨抽出到VeloIEPrinterGenerator類中);3-在HTML生成之後,在JacobPDFPrinter中就可以使用jacob調用IE的Navigate2,將IE重定向到剛才生成的這個HTML文件啦,這樣,IE就會在後台調用JS代碼將PDF列印到默認列印機;4-列印成功之後,清除臨時動態生成的HTML文件;5-當主程序退出之前,Quit後台IE進程。以上就是我能給出的一個solution,並不完美,但itworks.需要注意的幾個問題是:(1)需要設置IE的一個高級選項,運行本地腳本運行;(2)因為Java和Com線程模型的不一致,導致在最終Quit後台IE進程的時候會拋出Com調用異常,因為對於Win平台API以及相關編程模型不是很熟悉,所以,這個問題需要求助於別人幫忙解決;(3)IE在執行JS列印PDF的時候,同樣會後台啟動Acrobat的一個進程,而這個進程我們程序中無法控制其生命周期,所以,主程序退出後,我們沒有法同時kill這個進程,好在不管我們運行多少次,這個進程在後台只有一個,所以,性能負擔不是很大;轉載