㈠ 如何在java中用javascript來列印pdf
純Java的解決方案:
我們首先想到的自然就是JDK1.4提供的JPS(Java Printing Service)啦,不過,這東西雖然說支持的Flavor,但是,不管是個人實驗還是網上他人的評論,好像根本就是useless,可能如果說你 的列印機Driver支持PDF的Flavor的話,JPS會檢測到你的driver的這個特性,能夠成功的列印PDF文檔出來,但是,大部分情況下,這 種情形是不成立的,故此JPS死路一條啦!
讓我們看看PDF的老家Adobe那裡有沒有什麼法寶,我們發現一個Viewer Bean的組件,說是可以將PDF以Bean組件的方式潛入到Swing中,哇,太爽了,不過慢著,協議上說不提供任何支持,也不保證不出任何問題,管那 么些,試過再說,一實驗才知道,靠,Exception頻發,而且這個組件較為陳舊,還是扔一邊吧!
還有一個PDFBox,Open Source的,不過對中文支持不好,而且好像開發進度也不是很好,沒有發布一個正式的版本,基本上不能用於生產環境;
最後,求助於Commercial的產品吧,實驗了一下ActiveTree的JPrint,感覺不錯,完全可以勝任我們的需求而且恰到好處,不過授權費 很貴,Email問過之後的答復是2000USD的最低購買,呵呵,雖然日本人很有錢,但也心疼這個銀子啊,所以最終也得作罷!(ActiveTree的 授權其實挺令我ft的,他其實在2003年的時候是可以免費使用的,但之後就變卦了,呵呵,當時記得我還給提過一些bug之類,算了,人家做出這個東西也 不容易)
其他商業產品也是價格不菲,所以,基本上純Java的solution到這里就否決了,讓我們看Java-Com的解決方案吧!
Java-Com 的解決方案:
在前一條路走不通之後,我痛定思痛,決定轉向自己不熟悉的領域,ms的領地,我打算從Java中調用Com組件,由Com組件來幫助我們實現PDF的列印 工作,不夠這條路也不是一帆風順那!
我們知道,Acrobat Reader在發布的時候會隨同發布一個支持瀏覽器的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等開源項目,如果給出一個類似的code generation工具的話,就完全不遜於這些商業產品啦。鑒於商業產品的價格,我最終還是否決了這些(日本人其實也聽摳門的)。
這樣,Java-com也對這個問題沒轍了。
不過,最後在我的解決方案中,我還是使用了Jacob,這是後話,暫且不提...
那我們考慮一下,如果PDF列印不行,列印其他格式行不行?!比如圖片,這個JPS可以完全列印,所以,我們找一下有沒有將PDF格式轉換為其他格式的工 具吧!
PDF格式轉換的解決方案:
在這個領域,主要的就是有GhostScript/GView和ImageMagick,前者可以將PDF格式轉換為PostScript格式,但是好像 GhostScript也不能用JPS完全列印出來;而後者是一個將PDF轉換為Image的API工具,他的Java實現叫JMagick,但他有一個 跟GhostScript同樣的問題,就是要轉換,就必須在本地安裝,然後通過命令行的方式調用,這個顯然也不是很好,而且集成性很差,還是作罷!
剩下的一個是命令行調用啦,這是從itext網站找到的,你可以通過在命令行運行AcroRd32 /p /h "path to PDF file"這樣的命令來列印你要列印的PDF文件,當然,你可以在PDF文件生成後就將他們依次放入一個批處理文件來執行這些列印命令,但是這個方案唯一 的問題就是,每列印一個文件都會啟動一個Acrobat Reader窗口而且必須手動關閉,這現在不能滿足目前的系統要求。
好了,所有的方案基本上都羅列完了,也沒有找到一個可行的方案:-(
(沒有銀子嘛,不然Activetree的JPrint不錯的說)
這些東西差不多郁悶了我3,4天吧,那幾天簡直就是bored to death.
不過,在郁悶的這幾天的結尾,卻有一道靈光閃過我的腦海...
能不能說啟動一個列印service,當文檔要列印的時候,直接發送給它就行了那?!而恰好我發現一段在網頁中載入PDF文檔的Javascript代 碼,而且完全可以使用js來控制PDF的列印,所以,最終的這個方案就浮出水面了 ...
1-使用jacob啟動一個IE進程,並隱藏IE窗口;
if(ieAutomation == null)
ieAutomation = new ActiveXComponent("InternetExplorer.Application");
ieAutomation.setProperty("Visible",new Variant(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,並不完美,但it works.
需要注意的幾個問題是:
(1)需要設置IE的一個高級選項,運行本地腳本運行;
(2)因為Java和Com線程模型的不一致,導致在最終Quit後台IE進程的時候會拋出Com調用異常,因為對於Win平台API以及相關編程模型不 是很熟悉,所以,這個問題需要求助於別人幫忙解決;
(3)IE在執行JS列印PDF的時候,同樣會後台啟動Acrobat的一個進程,而這個進程我們程序中無法控制其生命周期,所以,主程序退出後,我們沒 有辦法同時kill這個進程,好在不管我們運行多少次,這個進程在後台只有一個,所以,性能負擔不是很大;
轉載
㈡ javascript 列印網頁成pdf文件
通過javascript實現PDF自動列印(2009-05-08 15:06:05)
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string pdffile = createpdf(false);
iframe1.Attributes.Add("src", pdffile);
}
}
private string createpdf(bool print)
{
try
{
string filename = "Chap0106.pdf";
iTextSharp.text.Document doc = new iTextSharp.text.Document();
PdfWriter writer = iTextSharp.text.pdf.PdfWriter.getInstance(doc, new FileStream(Server.MapPath(filename), FileMode.OpenOrCreate));
doc.Open();
doc.Add(new Paragraph(6, "abcd"));
writer.setViewerPreferences(PdfWriter.HideMenubar | PdfWriter.HideToolbar);
if (print)
{
PdfAction.javaScript("myOnMessage();", writer);
writer.addJavaScript("this.print(true);function myOnMessage(aMessage) {app.alert('Test',2);} var msgHandlerObject = new Object();doc.onWillPrint = myOnMessage;this.hostContainer.messageHandler = msgHandlerObject;");
}
doc.Close();
return filename;
}
catch
{
return "";
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string pdffile = createpdf(true);
iframe1.Attributes.Add("src", pdffile);
}
如題:
<body>
<object classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" name="PDF1" width="760" height="633" border="0">
<param name="SRC" value="01.pdf"/>
</object>
<script language="JavaScript" type="text/javascript">
PDF1.SetShowToolbar(false);
</script>
</body>
在 pdf 文件里加上這樣的屬性就可以了
如何也通過類似「PDF1.SetShowToolbar(false); 」控制實現禁止對pdf內容的復制、以及列印!!!謝謝
javascript實現PDF自動列印
網頁顯示pdf文件,禁止保存和列印
1. 用網頁打開 PDF文件。
2. 只可以瀏覽但是不許列印保存。
結果參照頂樓在jsf里實現如下代碼:
//Get response
FacesContext faces = javax.faces.context.FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) faces.getExternalContext().getResponse();
//打開源pdf文件
PdfReader reader = new PdfReader("./HelloWorld.pdf");
Document document = new Document(reader.getPageSizeWithRotation(1));
int n = reader.getNumberOfPages();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//將原pdf文件中的內容放入位元組流baos中
PdfCopy = new PdfCopy(document, baos);
//隱藏工具欄並給pdf加密
.setViewerPreferences(PdfWriter.HideMenubar | PdfWriter.HideToolbar);
.setEncryption(false, null, "pdf", PdfWriter.AllowAssembly);
//往pdf中寫入內容
document.open();
for(int i = 1; i <= n; i++) {
PdfImportedPage page = .getImportedPage(reader, i);
.addPage(page);
}
document.close();
//設置響應類型並將pdf流寫入響應
response.setContentType("application/pdf");
response.setContentLength(baos.size());
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
ServletOutputStream out = response.getOutputStream();
//將位元組流baos中的內容寫入響應流
baos.writeTo(out);
out.flush();
faces.responseComplete();
復制代碼
以上代碼的缺點:
1:加密只能實現列印和修改加密。
2:雖然隱藏了工具欄,但是可以通過快捷鍵F8來將工具欄顯示出來
3:IE菜單欄中自帶的保存功能也能將此pdf保存到本地
4:在客戶端沒有安裝pdf閱讀器的情況下,瀏覽器會直接提示用戶是否下載,這也是和需求不符的。
最後經過不懈努力,找到了一個用<object></object>曲線救國的路線,哈哈,先來看看如下代碼:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
</head>
<body>
<tr><td>
<p style="margin-top:-45px;margin-bottom:0px;">
<object classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" id="Pdf1" width="100%" height="100%">
<param name="_Version" value="327680">
<param name="_ExtentX" value="2646">
<param name="_ExtentY" value="1323">
<param name="_StockProps" value="0">
<param name="SRC" value="C:\temp.pdf">
</object>
</p>
</td></tr>
</body>
</html>
復制代碼
其中sytle的是用一種比較bt的辦法影藏了pdf頂部的工具欄(可以用第一種方法,這個方法作為備用)。
這樣即使用ie菜單欄中的保存功能也只是保存網頁布局而不會把pdf保存下來。
另外這樣即使本地沒裝pdf閱讀器也不會讓你下載該pdf了,而只是在相應位置出現叉叉而已。基本能夠滿足客戶的需求了
㈢ jsp 如何通過js來列印pdf文件!pdf存儲在文件伺服器上!
jsp中要利用java來實現打開,可以通過瀏覽器打開:
以下程序實現了讀取某個路徑下的pdf文件,並用瀏覽器打開:
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class PDFServlet extends HttpServlet {
private static final long serialVersionUID = -3065671125866266804L;
public PDFServlet() {
super();
}
public void destroy() {
super.destroy();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/pdf");
FileInputStream in = new FileInputStream(new File("d:/1.pdf"));
OutputStream out = response.getOutputStream();
byte[] b = new byte[512];
while ((in.read(b)) != -1) {
out.write(b);
}
out.flush();
in.close();
out.close();
}
public void init() throws ServletException {
}
}
㈣ 如何將js代碼導出成pdf
1,生成 PDF 這種事情通常由伺服器端做
2,瀏覽器做的話要依賴於插件(ActiveX/Plugin,通常購買第三專方的)屬
3,瀏覽器預覽、列印倒是沒問題(要裝 PDF viewer,Firefox 自帶的 PDF.js 擴展也可以)
4,總結,AngularJS 是瀏覽器端的,干不來這事兒,也不應該干這事兒,我想你最好換個方向
㈤ web如何實現客戶端列印在線文件(pdf,word,excel等),同時可以控制列印設置
WEB軟體打來印功能實現方式自:
1、瀏覽器本身的列印功能,效果最差。
2、在web伺服器上產生好PDF或Excel文件,下載到本地列印。很多在伺服器端運行的報表軟體採用這樣的方式。因為就是下載文件,所以各種瀏覽器都支持。缺點就用戶操作麻煩,伺服器附載大。
3、報表插件方式,可以做到與桌面軟體一樣的列印功能,這種方式實現的效果最好。缺點就是插件是針對特定瀏覽器的,不能做到支持各種瀏覽器,報表插件一般是支持IE瀏覽器。
綜合考慮,看用哪種方式合適。
㈥ js將網頁導出成pdf(js 列印指定div內容)2020-09-02
<input type="button"叢困 id="button" value="點擊列印"/>
<div id="div_print">
<滲爛念p>列印此處內容</p>
</div>
<script type="text/javascript">
function printdiv(printpage){
var newstr=document.getElementById(printpage).innerHTML;
var oldstr=document.body.innerHTML;
document.body.innerHTML=newstr;
window.print();
document.body.innerHTML=oldstr;
return false;
}
window.onload=function(){
var bt=document.getElementById("button");
bt.onclick=function(){printdiv('div_print');}
}
</script>
html, body{
overflow:visible;
}
列印歷弊時另存為pdf模式列印後的內容可復制 默認為Microsoft Print to PDF 模式
㈦ 假如我有一個PDF的路徑,我如何通過JS將這個路徑傳進去,然後就直接去連接列印機進行列印
利用js新建彈窗,彈窗路徑為pdf路徑,在彈窗中使用列印方法。
㈧ js怎麼調用printWithDialog來列印pdf
利用Adobe PDF Reader 控制項,在Winform中實現列印PDF文檔。 實現方法如下: (1)前提條件 必須事先在計算機安裝Adobe Reader軟體。Adobe Reader是免費軟體,可以從Adobe官網下載安裝 (2)在Visual Studio中新建一個「Windows 窗體應用程序」項目...