欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用PDFBox實現(xiàn)調整PDF每頁格式

 更新時間:2024年03月24日 08:08:33   作者:zoeil  
這篇文章主要為大家詳細介紹了Java如何使用PDFBox實現(xiàn)調整PDF每頁格式,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下

maven依賴,這里使用的是pdfbox的2.0.30版本

        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.30</version>
        </dependency>
 
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox-tools</artifactId>
            <version>2.0.30</version>
        </dependency>

一、內容沒有圖片

如果內容沒有圖片,可以直接將紙張改為A4大小

import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
 
public class AdjustPdfPageWidthToA4 {
    public static void main(String[] args) {
        // 輸入的PDF文件路徑
        String inputFilePath = "input.pdf";
        // 輸出的PDF文件路徑
        String outputFilePath = "output.pdf";
        
        try {
            // 加載PDF文件
            PDDocument document = PDDocument.load(new File(inputFilePath));
            
            // 遍歷每一頁
            for (PDPage page : document.getPages()) {
                // 將頁面寬度調整為A4尺寸
                page.setMediaBox(PDRectangle.A4);
            }
            
            // 保存修改后的PDF文件
            document.save(outputFilePath);
            document.close();
            
            System.out.println("PDF頁面寬度已調整為A4尺寸,并保存為新的PDF文件。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

但是如果有圖片的話,會出現(xiàn)圖片被截斷,顯示不全的情況出現(xiàn),所以我們需要對圖片元素按比例縮放

二、內容有圖片

首先要對頁面內容進行判斷,如果頁面是圖片的話,對圖片進行比例縮放,比如A4,就縮放到可以放進A4

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
 
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;
 
import javax.imageio.ImageIO;
 
/**
 * @author zjy
 * @describe 調整PDF每頁為A4格式
 */
public class AdjustPdfPageWidthToA4Util {
    static String inputFilePath = "C:\\xxx\\xxx\\xx.pdf";
    // 輸出的PDF文件路徑
    static String outputFilePath = "D:\\result.pdf";
 
    public static void main(String[] args) {
 
        try {
            // 加載PDF文件
            PDDocument document = PDDocument.load(new File(inputFilePath));
 
            // 遍歷每一頁
            int totalPages = document.getNumberOfPages();
 
            for (int i = 0; i < totalPages; i++) {
                // 獲取當前Page頁面
                PDPage page = document.getPage(i);
                // 獲取對應頁面的資源對象
                PDResources resources = page.getResources();
                // 遍歷當前頁面所有內容,找出圖片對象
                for (COSName cosName : resources.getXObjectNames()) {
                    PDXObject pdxObject = resources.getXObject(cosName);
                    // 判斷是不是圖片對象
                    if (pdxObject instanceof PDImageXObject) {
                        // 獲取圖片對象
                        PDImageXObject pdxObject1 = (PDImageXObject) pdxObject;
                        BufferedImage image = pdxObject1.getImage();
                        // 4、創(chuàng)建頁面內容流,指定操作哪個文檔中的哪個頁面
                        PDPageContentStream stream = new PDPageContentStream(document, page);
                        float[] imageWH = getImageWH(image, PDRectangle.A4);
                        stream.drawImage(pdxObject1, imageWH[0], imageWH[1], imageWH[2], imageWH[3]); // 繪制圖片到PDF頁面里面
                        stream.close(); // 關閉頁面內容流
                        page.setMediaBox(PDRectangle.A4);
 
                    } else {
                        page.setMediaBox(PDRectangle.A4);
                    }
                }
 
            }
 
            // 保存修改后的PDF文件
            document.save(outputFilePath);
            document.close();
 
            System.out.println("PDF頁面寬度已調整為A4尺寸,并保存為新的PDF文件。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 獲取圖片的寬度、高度,單位是【pt】
     *
     * @param box PDF文檔頁面矩形區(qū)域對象,可以獲取到矩形區(qū)域的寬高
     * @return 返回縮放之后的圖片寬高
     */
    public static float[] getImageWH(BufferedImage img, PDRectangle box) {
        try {
            // px 轉換成 pt 單位
            float xAxis;
            float yAxis;
            int w = img.getWidth();
            int h = img.getHeight();
            float width = (float) (w * 3.0 / 4); // 這里是因為 1pt = 3/4 px,pt和px單位轉換
            float height = (float) (h * 3.0 / 4);
            float pw = box.getWidth() - 60; // 設置圖片與文檔邊緣的空白間距
            float ph = box.getHeight() - 60; // 設置圖片與文檔邊緣的空白間距
            if (width > pw) {
                float scale = pw / width;  // 縮放比列
                width = pw; // 寬度等于頁面寬度
                height = height * scale; // 高度自動縮放
            } else {
                float scale = ph / height;  // 縮放比列
                height = ph; // 高度等于頁面高度
                width = width * scale;  // 寬度自動縮放
            }
            // 計算圖片在X、Y軸上的顯示位置
            xAxis = (box.getWidth() - width) / 2; // X軸居中對齊
//            yAxis = box.getHeight() - height - 10; // 距離頁面頂部10個pt
            yAxis = (box.getHeight() - height) / 2; // Y軸垂直居中對齊
            return new float[]{xAxis, yAxis, width, height};
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new float[]{0, 0, 0, 0};
    }
}

運行完如下圖所示,圖片縮小至能放入A4,放在正中間

三、改進

上面的代碼是將圖片等比例縮小到A4能夠放得下,也就是上下或者左右可能有很大的空白,圖片比較小,難以看清,因此改進

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
 
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;
 
import javax.imageio.ImageIO;
 
/**
 * @author zjy
 * @describe 調整PDF每頁為A4格式
 */
public class AdjustPdfPageWidthToA4Util {
    static String inputFilePath = "C:\\xxx\\xxx\\xx.pdf";
    // 輸出的PDF文件路徑
    static String outputFilePath = "D:\\result.pdf";
 
    public static void main(String[] args) {
 
        try {
            // 加載PDF文件
            PDDocument document = PDDocument.load(new File(inputFilePath));
 
            // 遍歷每一頁
            int totalPages = document.getNumberOfPages();
 
            for (int i = 0; i < totalPages; i++) {
                // 獲取當前Page頁面
                PDPage page = document.getPage(i);
                // 獲取對應頁面的資源對象
                PDResources resources = page.getResources();
                // 遍歷當前頁面所有內容,找出圖片對象
                for (COSName cosName : resources.getXObjectNames()) {
                    PDXObject pdxObject = resources.getXObject(cosName);
                    // 判斷是不是圖片對象
                    if (pdxObject instanceof PDImageXObject) {
                        // 獲取圖片對象
                        PDImageXObject pdxObject1 = (PDImageXObject) pdxObject;
                        BufferedImage image = pdxObject1.getImage();
                        // 4、創(chuàng)建頁面內容流,指定操作哪個文檔中的哪個頁面
                        PDPageContentStream stream = new PDPageContentStream(document, page);
                        float[] imageWH = getImageWH(image, PDRectangle.A4);
                        stream.drawImage(pdxObject1, 0, 0, imageWH[0], imageWH[1]); // 繪制圖片到PDF頁面里面
                        stream.close(); // 關閉頁面內容流
//                        page.setMediaBox(PDRectangle.A4);
                        page.setMediaBox(new PDRectangle(imageWH[0], imageWH[1]));
 
                    } else {
                        page.setMediaBox(PDRectangle.A4);
                    }
                }
 
            }
 
            // 保存修改后的PDF文件
            document.save(outputFilePath);
            document.close();
 
            System.out.println("PDF頁面寬度已調整為A4尺寸,并保存為新的PDF文件。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 獲取圖片的寬度、高度,單位是【pt】
     *
     * @param box PDF文檔頁面矩形區(qū)域對象,可以獲取到矩形區(qū)域的寬高
     * @return 返回縮放之后的圖片寬高
     */
    public static float[] getImageWH(BufferedImage img, PDRectangle box) {
        try {
            // px 轉換成 pt 單位
            float xAxis;
            float yAxis;
            int w = img.getWidth();
            int h = img.getHeight();
            float width = (float) (w * 3.0 / 4); // 這里是因為 1pt = 3/4 px,pt和px單位轉換
            float height = (float) (h * 3.0 / 4);
            float pw = box.getWidth() ;
            float ph = box.getHeight() ;
            if (width > pw) {
                float scale = pw / width;  // 縮放比列
                width = pw; // 寬度等于頁面寬度
                height = height * scale; // 高度自動縮放
            } else {
                float scale = ph / height;  // 縮放比列
                height = ph; // 高度等于頁面高度
                width = width * scale;  // 寬度自動縮放
            }
            // 計算圖片在X、Y軸上的顯示位置
            return new float[]{width, height};
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new float[]{0, 0};
    }
}

這樣子圖片的寬度是A4的,長度就是原圖片的長度了

以上內容參考:Java使用PDFBox實現(xiàn)操作PDF文檔

到此這篇關于Java使用PDFBox實現(xiàn)調整PDF每頁格式的文章就介紹到這了,更多相關Java PDFBox調整PDF格式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring Boot整合Swagger2的完整步驟詳解

    Spring Boot整合Swagger2的完整步驟詳解

    這篇文章主要給大家介紹了關于Spring Boot整合Swagger2的完整步驟,文中通過示例代碼將整合的步驟一步步介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • Springboot?實現(xiàn)Server-Sent?Events的項目實踐

    Springboot?實現(xiàn)Server-Sent?Events的項目實踐

    本文介紹了在Spring?Boot中實現(xiàn)Server-Sent?Events(SSE),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • java按照模板導出pdf或word文件詳細代碼

    java按照模板導出pdf或word文件詳細代碼

    有時候業(yè)務中我們需要使用pdf模板生成一份pdf文件,下面這篇文章主要給大家介紹了關于java按照模板導出pdf或word文件的相關資料,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-11-11
  • java實現(xiàn)追加內容到文件末尾的常用方法分析

    java實現(xiàn)追加內容到文件末尾的常用方法分析

    這篇文章主要介紹了java實現(xiàn)追加內容到文件末尾的常用方法,結合具體實例分析了java文件流及寫入指針等相關操作技巧,需要的朋友可以參考下
    2017-10-10
  • Spring Boot跨域問題詳解

    Spring Boot跨域問題詳解

    在Spring Boot中處理跨域問題非常簡單,你可以通過全局配置、注解或自定義過濾器的方式來控制跨域請求的行為,本文給大家介紹Spring Boot跨域問題簡介,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • Java發(fā)起http請求的完整步驟記錄

    Java發(fā)起http請求的完整步驟記錄

    這篇文章主要給大家介紹了關于Java發(fā)起http請求的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • java中BCryptPasswordEncoder密碼的加密與驗證方式

    java中BCryptPasswordEncoder密碼的加密與驗證方式

    這篇文章主要介紹了java中BCryptPasswordEncoder密碼的加密與驗證方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • SpringBoot 整合Tess4J庫實現(xiàn)圖片文字識別案例詳解

    SpringBoot 整合Tess4J庫實現(xiàn)圖片文字識別案例詳解

    Tess4J是一個基于Tesseract OCR引擎的Java接口,可以用來識別圖像中的文本,說白了,就是封裝了它的API,讓Java可以直接調用,今天給大家分享一個SpringBoot整合Tess4j庫實現(xiàn)圖片文字識別的小案例
    2023-10-10
  • 淺談java日志格式化

    淺談java日志格式化

    不管我們使用何種語言開發(fā),一旦程序發(fā)生異常,日志是一個很重要的數據。但是并不是意味著打印的日志越多越好,我們需要的是有用的日志。下面小編來和大家一起學習以下知識
    2019-05-05
  • springmvc級聯(lián)屬性處理無法轉換異常問題解決

    springmvc級聯(lián)屬性處理無法轉換異常問題解決

    這篇文章主要介紹了springmvc級聯(lián)屬性處理無法轉換異常問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12

最新評論