邊界控制

  • 適用於 PDF / EXCEL

UDE-PDF

再回顧一下基本概念中看到的「頁面版型結構」,使用 BaseLayoutInfo 可定義其中的定位資訊。

單位為 pixel,可以使用 LengthUnit 的 trans() 函式進行換算,如下例為公分、公厘、英吋不同單位設定結果。
(邊界虛線以測試套件的 showMarginBorder=TRUE 輸出。)

  • Sample_Page_Margin.java
private LayoutInfo createLayout() {
    // ! 定義四周邊界大小.
    final float marginLeft = LengthUnit.CM.trans(2.54f);  // 左方以 公分為單位,合 1英吋/72pixel
    final float marginRight = 36;                         // 右方以 pixel 為單位,合 0.5英吋
    final float marginTop = LengthUnit.MM.trans(12.7f);   // 上方以 公厘為單位,合 0.5英吋/36pixel
    final float marginBottom = LengthUnit.INCH.trans(1);  // 下方以英吋為單位, 1英吋
    final LayoutInfo layoutInfo = new LayoutInfo(marginLeft, marginRight, marginTop, marginBottom);
    // ! 定義上下頁首尾間距.
    layoutInfo.setHeaderExtra(36);
    layoutInfo.setFooterExtra(72);
    return layoutInfo;
}

@Test
public void test_PDF_Margin() {
    super.createPDF(pdfDocument -> {
        pdfDocument.setupPageSize(PageSize.A4.rotate()); // ! 定義頁面大小
        pdfDocument.setLayoutInfo(createLayout());       // ! 設定版面資訊
    });
}

@Test
public void test_Excel_Margin() {
    super.createExcel(excelDocument -> {
        final ExcelSheet<?> sheet = excelDocument.createSheet("sheet");
        sheet.setPrintPageSize(PoiDefaultSize.A4L);     // ! 定義頁面大小.
        sheet.setLayoutInfo(createLayout());            // ! 設定版面資訊
        for (int i = 0; i < 1000; i++) {
            sheet.appendCell(new ExcelPoint(i / 20, i % 20), "");
        }
    });
}
  • PDF

  • EXCEL : 相較Excel中的版面設定參數,可以看出部分定義不同,已由 UDE-Report 進行轉換處理。

換頁控制

  • 適用於 PDF

要手動對PDF進行換頁,請呼叫 PDFDocument.newPage(),若當前頁面還沒有實際內容輸出時,並不會真的換頁。所以如果要輸出空白頁面,請在兩次換頁間插入一次 writeText(“”)。

@Test
public void test_newPage() {
    super.createPDF(pdfDocument -> {
        final LayoutInfo layoutInfo = new LayoutInfo();
        layoutInfo.setHeader(ItemPosition.CenterFooter, new PageHeaderCH(12));
        pdfDocument.setLayoutInfo(layoutInfo);
        pdfDocument.setPageSize(PageSize.A8.rotate());        
        pdfDocument.writeText("P1"); // 一開始在 P1
        pdfDocument.newPage(); // 進入 P2
        pdfDocument.newPage(); // 連續兩次呼叫兩次 newPage() 不會有空白頁
        pdfDocument.writeText("P2");
        pdfDocument.newPage(); // 進入 P3
        pdfDocument.newPage();
        pdfDocument.newPage();
        pdfDocument.newPage(true); // 強制換頁後,才進入 P4
        pdfDocument.writeText("P4. 我是第四頁");
        pdfDocument.newPage(); // 後續未輸出內容,P5 不會產生。
    });
}

輸出內容後,如果要確認是否造成換頁,可以用pdfDocument.isPageChanged()、pdfDocument.isNewPageBegin() 兩個Method 進行判斷。

  • PageChanged 為真:有觸發換頁事件。
  • NewPageBegin為真:新頁面還沒有輸出任何內容。
@Test
public void test_forceNewPage() {
    super.createPDF(pdfDocument -> {
        final LayoutInfo layoutInfo = new LayoutInfo();
        layoutInfo.setHeader(ItemPosition.CenterFooter, new PageHeaderCH(12));
        pdfDocument.setLayoutInfo(layoutInfo);
        pdfDocument.setPageSize(PageSize.A8.rotate());
        // !
        Assert.assertFalse("一開始未換頁", pdfDocument.isPageChanged());
        Assert.assertTrue(pdfDocument.isNewPageBegin());
        // !
        pdfDocument.writeText("P1");
        Assert.assertFalse(pdfDocument.isPageChanged());
        Assert.assertFalse(pdfDocument.isNewPageBegin());
        // !
        pdfDocument.newPage(true);   // 強制換頁
        Assert.assertTrue("因為 newPage() 觸發換頁事件", pdfDocument.isPageChanged());
        Assert.assertTrue("新頁面還沒有輸出任何內容,但關檔時強制輸出新頁。", pdfDocument.isNewPageBegin());
    });
}

頁面大小與邊界,在文件生成的過程中是可以改變的。當目前頁面已有內容輸出時,頁面大小變動會在下一頁才生效。
但邊界變動可能會導致部分頁首頁尾輸出與預期不符,使用時請自行確認當下文件輸出狀態。換言之,建議把PageSize與LayoutInfo的異動緊接在newPage() 之後進行。

但一般不建議在文件中變動頁面大小,這類文件可能會對使用者列印輸出或做其它處理造成困擾。

results matching ""

    No results matching ""