1. 程式人生 > >用JODConverter和openoffice生成PDF文件時候的PAGESIZE設定問題

用JODConverter和openoffice生成PDF文件時候的PAGESIZE設定問題

生成PDF的方法有很多

這裡要說的是如果我們要轉換的excel等的紙張大小不是預設的A4的情況下如何處理。

      一般轉換的時候會有部分程式碼是下面這樣。

  // convert 
  DocumentConverter converter = new OpenOfficeDocumentConverter(connection); 
  converter.convert(inputFile, outputFile); 
用上面的程式碼轉換的時候,

無論輸入文件的紙張定義成多大,都會被當成預設的A4來進行的轉換,轉換後的PDF也是A4的。

轉換的具體過程,其實跟手動操作是一樣的,openoffice開啟要轉換的文件,再點轉換PDF按鈕。

開啟文件後,預設A4大小,我們調整紙張大小,轉換後可以得到希望大小的PDF檔案。

經過檢視,其實轉換PDF時候的引數設定裡面並沒有設定紙張大小的選擇。所以只能從載入文件的地方想辦法。

檢視原始碼OpenOfficeDocumentConverter的convert方法的原始碼,可以看到其中呼叫到OpenOfficeDocumentConverter的下面的方法:

private void loadAndExport(String inputUrl, Map/*<String,Object>*/ loadProperties, String outputUrl, Map/*<String,Object>*/ storeProperties) 

上面的方法主要三個內容:
document = loadDocument(inputUrl, loadProperties);
refreshDocument(document);
storeDocument(document, outputUrl, storeProperties);

loadDocument是載入office文件的,通過loadProperties傳遞的引數。支援的引數都定義在jar包裡面的document-formats.xml裡面了,沒有 紙張設定的引數。

我們要做的只能增加幾個引數。這個引數的具體內容需要查閱openoffice的文件。

因為loadDocument方法是private的,我們只能想別的辦法,好在 refreshDocument不是private

我們可以新建一個class繼承OpenOfficeDocumentConverter 並override refreshDocument方法。

        public final static Size A5, A4, A3;
	public final static Size B4, B5, B6;
	public final static Size KaoqinReport;

	static {
		A5 = new Size(14800, 21000);
		A4 = new Size(21000, 29700);
		A3 = new Size(29700, 42000);

		B4 = new Size(25000, 35300);
		B5 = new Size(17600, 25000);
		B6 = new Size(12500, 17600);
		
		KaoqinReport = new Size(25400, 27940);
	}

/*
	 * XComponent:xCalcComponent
	 * 
	 * @seecom.artofsolving.jodconverter.openoffice.converter.
	 * AbstractOpenOfficeDocumentConverter
	 * #refreshDocument(com.sun.star.lang.XComponent)
	 */
	@Override
	protected void refreshDocument(XComponent document) {
		super.refreshDocument(document);

		// The default paper format and orientation is A4 and portrait. To
		// change paper orientation
		// re set page size
		XPrintable xPrintable = (XPrintable) UnoRuntime.queryInterface(XPrintable.class, document);
		PropertyValue[] printerDesc = new PropertyValue[2];

		// Paper Orientation
//		printerDesc[0] = new PropertyValue();
//		printerDesc[0].Name = "PaperOrientation";
//		printerDesc[0].Value = PaperOrientation.PORTRAIT;

		// Paper Format
		printerDesc[0] = new PropertyValue();
		printerDesc[0].Name = "PaperFormat";
		printerDesc[0].Value = PaperFormat.USER;

		// Paper Size
		printerDesc[1] = new PropertyValue();
		printerDesc[1].Name = "PaperSize";
		printerDesc[1].Value = KaoqinReport;

		try {
			xPrintable.setPrinter(printerDesc);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		}

	}


如果是excel有多個sheet,上面的部分只會影響第一個sheet,其他sheet還會以A4的大小輸出。

上面的程式碼在JODConverter v2.x下面測試通過。