本文目錄一覽:
- 1、別人編寫好的jasper,Java調用打印pdf怎麼控制其紙張大小
- 2、java調用本地打印機實現打印PDF文件,怎麼做
- 3、JAVA打印pdf為什麼不顯示㮾字?
- 4、java生成pdf
- 5、如何在java中用javascript來打印pdf
別人編寫好的jasper,Java調用打印pdf怎麼控制其紙張大小
這個從我了解的角度來說只有兩個方面:
設計jasper前,設定紙張的大小,選擇合適的尺寸 建立jasper。
打印的時候手動選擇紙張大小。
java調用本地打印機實現打印PDF文件,怎麼做
使用虛擬打印機pdf factory即可實現,而且其他格式文件只要是能夠打印,選擇這個虛擬打印機,都可以做成PDF文件,很簡單實用,一勞永逸。
JAVA打印pdf為什麼不顯示㮾字?
建議添加spire.pdf.jar為依賴,然後用下面的代碼試試
import com.spire.pdf.*;
import java.awt.print.*;
public class Print {
public static void main(String[] args) {
//加載文檔
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile(“Sample.pdf”);
PrinterJob loPrinterJob = PrinterJob.getPrinterJob();
PageFormat loPageFormat = loPrinterJob.defaultPage();
Paper loPaper = loPageFormat.getPaper();
//刪除默認頁邊距 loPaper.setImageableArea(0,0,loPageFormat.getWidth(),loPageFormat.getHeight());
//設置打印份數
loPrinterJob.setCopies(2);
loPageFormat.setPaper(loPaper);
loPrinterJob.setPrintable(pdf,loPageFormat);
try {
loPrinterJob.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}
}
java生成pdf
從JAVA直接讀取EXCEL、WORD並生成PDF文件
1。操作EXCEL和WORD文件
使用JAVA從EXCEL、WORD文件中讀寫數據,可以使用 提供的JAVA API-Java Excel API,這裡有其指南 ,可由此下載JAR文件 。
此API提供所有的讀、寫、修改、建立的功能。對於一般應用足夠了。在任何支持JAVA的系統上使用。目前,JExcelApi尚不支持有關chart、graph 或者 macro的信息,但是會拷貝並保留這些信息。只支持PNG圖像。
2。生成PDF文件
若從JAVA生成PDF文件,可以使用 提供的應用程序庫jPDFWriter。jPDFWriter是一個類庫,可以直接從JAVA的應用程序調用以產生PDF文件。其網站的下載文件中包含了說明和例子,有興趣可以仔細研究。
3。把JExcelAPI和jPDFWriter結合起來,就可以在應用中直接把XLS文件轉換成PDF文件。如果再結合Database,就可以直接把有關的報告數據生成XLS文件的同時生成PDF文件。
下邊給出了一個例子,是針對XLS,雖然簡單,但是完整,以此為基礎,可以按照自己的需要展開工作了。對於WORD也是一樣,所有不再另給了。
//
//Compile:
//javac -classpath .;jexcelapi/jxl.jar;jPDFWriter/jPDFWriter.jar xlsPrinter.java
//Run:
//java -classpath .;jexcelapi/jxl.jar;jPDFWriter/jPDFWriter.jar xlsPrinter
//
//
import java.awt.Graphics;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.util.Vector;
import java.util.Date;
import jxl.*;//JExcelAPI
import com.qoppa.pdfPrinter.PDFPrinterJob;//jPDFWriter
public class xlsPrinter implements Printable
{
private int m_CurrentPage;
private int m_CurrentPageStartRow;
private int m_CurrentPageEndRow;
private final static int DEFAULT_COLUMN_WIDTH = 72;
private final static int CELL_MARGIN_X = 4;
private final static int CELL_MARGIN_Y = 4;
private Vector m_Data;
private int m_ColumnWidths [];
private boolean m_DrawGrid;
/**
* @param printString
*/
public xlsPrinter(Vector data, int [] colWidths, boolean drawGrid)
{
super();
m_Data = data;
m_ColumnWidths = colWidths;
m_DrawGrid = drawGrid;
}
//讀取EXCEL數據並存入內存
private static Vector initData ()
{
Vector data = new Vector ();
try{
Workbook workbook = Workbook.getWorkbook(new File(“output.xls”));
Sheet sheet = workbook.getSheet(0);
int rows = sheet.getRows();
int cols = sheet.getColumns();
// Initialize data
for (int row = 0; row rows; ++row){
Vector rowData = new Vector ();
for (int col = 0; col cols; ++col){
rowData.addElement (sheet.getCell(col,row).getContents());
}
data.addElement (rowData);
}
workbook.close();
}catch(Exception e){
e.printStackTrace();
}
return data;
}
//主程序
public static void main (String args [])
{
xlsPrinter gridPrinter = new xlsPrinter(initData (), null, true);
PrinterJob printerJob = PDFPrinterJob.getPrinterJob();
printerJob.setPrintable(gridPrinter);
try{
printerJob.print();
}catch (PrinterException pe){
pe.printStackTrace();
}
System.exit(0);
}
//打印接口,由此生成PDF文件,此段代碼來源於jPDFWriter的例子
public int print (Graphics g, PageFormat pf, int pageIndex)
{
int lineHeight = g.getFontMetrics().getHeight();
// Reset current pos
int currentRow = 0;
if (pageIndex == 0)
{
// Need to do this in case the instance of this class
// gets used multiple times to print a string
m_CurrentPage = 0;
m_CurrentPageStartRow = 0;
}
// Need to do this because Java PrinterJob can call this
// method multiple times for the same page;
else if (m_CurrentPage == pageIndex)
{
currentRow = m_CurrentPageStartRow;
}
else
{
currentRow = m_CurrentPageEndRow + 1;
m_CurrentPageStartRow = currentRow;
}
// If we’re out of lines, tell the PrinterJob we’re done
if (currentRow = m_Data.size())
{
return Printable.NO_SUCH_PAGE;
}
// Loop through lines until we fill the page
int currentY = (int)(pf.getImageableY() + lineHeight);
while (currentRow m_Data.size()
currentY + lineHeight pf.getImageableY() + pf.getImageableHeight())
{
// Draw the next line
int currentX = (int)pf.getImageableX();
Vector nextRow = (Vector)m_Data.elementAt (currentRow);
for (int col = 0; col nextRow.size(); ++col)
{
String cellString = (String)nextRow.elementAt (col);
g.drawString (cellString, currentX + CELL_MARGIN_X, currentY + CELL_MARGIN_Y);
int colWidth = DEFAULT_COLUMN_WIDTH;
if (m_ColumnWidths != null m_ColumnWidths.length col)
{
colWidth = m_ColumnWidths [col];
}
// Draw grid if needed
if (m_DrawGrid)
{
g.drawRect (currentX, currentY – (lineHeight / 2), colWidth, lineHeight);
}
// Advance x
currentX += colWidth;
}
// Advance to the next line
++currentRow;
currentY += lineHeight;
}
// Save the ned line and current page
// Again, we have to do this because of multiple calls for the same page.
m_CurrentPageEndRow = currentRow;
m_CurrentPage = pageIndex;
return Printable.PAGE_EXISTS;
}
}
如何在java中用javascript來打印pdf
純Java的解決方案:
我們首先想到的自然就是JDK1.4提供的JPS(Java Printing Service)啦,不過,這東西雖然說支持PDF的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這個進程,好在不管我們運行多少次,這個進程在後台只有一個,所以,性能負擔不是很大;
轉載
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/256407.html