国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java利用pdfbox動(dòng)態(tài)生成PDF

這篇具有很好參考價(jià)值的文章主要介紹了java利用pdfbox動(dòng)態(tài)生成PDF。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Apache?PDFBox?是一個(gè)用于處理?PDF?文檔的?Java?庫。它提供了許多功能和方法來讀取、創(chuàng)建、操作和提取?PDF?文檔的內(nèi)容。

引入?maven?依賴

<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>

pdfbox?生成?pdf?實(shí)例

  try {
       // 創(chuàng)建一個(gè)空白的PDF文檔
       PDDocument document = new PDDocument();
       // 創(chuàng)建一個(gè)頁面
       PDPage page = new PDPage(PDRectangle.A4);
       document.addPage(page);
       // 創(chuàng)建一個(gè)內(nèi)容流
       PDPageContentStream contentStream = new PDPageContentStream(document, page);
       // 設(shè)置字體和字號(hào)
       contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
       // 在頁面上繪制文本
       contentStream.beginText();
       contentStream.newLineAtOffset(100, 700);
       contentStream.showText("Hello, World!");
       contentStream.endText();
       // 關(guān)閉內(nèi)容流
       contentStream.close();
       // 保存PDF文檔
       document.save("output.pdf");
       // 關(guān)閉PDF文檔
       document.close();
       System.out.println("PDF生成成功!");
   } catch (IOException e) {
       e.printStackTrace();
   }

常用方法

PDDocument?類

引用源碼中對(duì)PDDocument?類的描述

This?is?the?in-memory?representation?of?the?PDF?document

這是PDF文檔的內(nèi)存表示,在?java?程序中,你可以簡(jiǎn)單理解為他就是?pdf?文檔,后續(xù)對(duì)他的一系列操作就是對(duì)?pdf?文檔的一系列操作。

創(chuàng)建全新的?pdf?文檔:文檔中無任何頁面

PDDocument document=new PDDocument();

如果你想對(duì)原有的?pdf?模板進(jìn)行動(dòng)態(tài)數(shù)據(jù)的填充,可以使用PDDocument.load()方法來加載已經(jīng)制作好的?pdf?模板,

PDDocument document = PDDocument.load(new ClassPathResource("/static/reportTemplate.pdf").getInputStream());

你也可以用文件形式來加載?pdf?模板,不過更推薦文件流的形式

PDDocument document = PDDocument.load(new ClassPathResource("/static/reportTemplate.pdf").getFile());

如果你想對(duì)你生成的?pdf?進(jìn)行加密操作,你可以使用PDDocument?load(InputStream?input,?String?password)方法,如下設(shè)置了解密的密碼為?123456.

PDDocument document = PDDocument.load(new ClassPathResource("/static/reportTemplate.pdf").getInputStream(),"123456");

PDDocument.load()中有好多重載的方法,這里就不一一列出。感興趣的可以查看?pdfbox?的源碼,

ByteArrayOutputStream baos = new ByteArrayOutputStream();;
document.save(baos); //保存文件到文件流

document.save("output.pdf"); //保存文件到文件

保存成文件流之后,有時(shí)候我們需要將文件傳輸?shù)角岸诉M(jìn)行下載,

// 將PDF文件轉(zhuǎn)換為字節(jié)數(shù)組
byte[] pdfBytes = baos.toByteArray();

// 創(chuàng)建InputStreamResource對(duì)象
ByteArrayInputStream bis = new ByteArrayInputStream(pdfBytes);
InputStreamResource resource = new InputStreamResource(bis);

// 設(shè)置HTTP響應(yīng)頭信息
HttpHeaders headers = new HttpHeaders();
       headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=output.pdf");
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PDF_VALUE);
// 返回帶有PDF內(nèi)容的響應(yīng)實(shí)體
return ResponseEntity.ok()
       .headers(headers)
       .body(resource);

在對(duì)document?操作完成之后,一定要執(zhí)行document.close()方法關(guān)閉?pdf?文檔。

document.close();

PDPage?類

PDPage?屬于?pdf?文檔中的的頁面,

int pageNumber=document.getNumberOfPages();

獲取指定頁面,

PDPage page = document.getPage(0);

如果你是對(duì)?pdf?模板進(jìn)行操作,你可以通過document.getPage(index)方法來獲取?pdf?文檔的指定頁面,并對(duì)其進(jìn)行操作(index?從?0?開始)。你也可以通過new?PDPage();創(chuàng)建一個(gè)全新的?page,

PDPage newPage = new PDPage(PDRectangle.A4);

如果我們是通過?new?PDPage()的方式生成?page?頁面時(shí),我們需要將?page?頁面添加到?pdf?文檔中去(document),

document.addPage(newPage);

不過這種方式會(huì)將?page?添加到?pdf?文檔的末尾,我們有時(shí)候需要將?page?添加到指定的位置,可以使用以下方法。

PDPage page=document.getPage(1); //獲取第2頁
PDPage newPage = new PDPage(PDRectangle.A4);
PDPageTree pages = document.getPages();
pages.insertAfter(newPage,page); //插入到第2頁后面
pages.insertBefore(newPage,page); //插入到第2頁前面

獲取?page?頁面總高度和總寬度,這個(gè)在后續(xù)的文字坐標(biāo)定位中很有用,在?page?中原點(diǎn)坐標(biāo)位于左下角,如果你想你的元素左邊距為?10,上邊距為?10,那么你的坐標(biāo)將是(10,pageHeight-10)

float pageWidth = page.getMediaBox().getWidth();
float pageHeight = page.getMediaBox().getHeight();

PDPageContentStream

PDPageContentStream?類提供寫入頁面內(nèi)容流的功能,它需要綁定?pdf?文檔和指定的?page?頁面,這樣相當(dāng)于創(chuàng)建了?page?當(dāng)前頁面的內(nèi)容流。

PDPageContentStream contentStream = new PDPageContentStream(document, page);

如果不指定PDPageContentStream.AppendMode,默認(rèn)會(huì)以重寫模式執(zhí)行,后續(xù)對(duì)?page?頁面添加元素會(huì)覆蓋現(xiàn)有頁面內(nèi)容流。

PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true);

模式代碼

模式

注釋

PDPageContentStream.AppendMode.OVERWRITE

重寫模式

覆蓋現(xiàn)有頁面內(nèi)容流

PDPageContentStream.AppendMode.APPEND

追加模式

將內(nèi)容流附加到所有現(xiàn)有頁面內(nèi)容流之后

PREPENDPDPageContentStream.AppendMode.

準(zhǔn)備模式

在所有其他頁面內(nèi)容流之前插入

對(duì)contentStream?操作完成之后,需要關(guān)閉內(nèi)容流。

contentStream.close();

pdf?寫入內(nèi)容

關(guān)于字體

在?Apache?PDFBox?中,字體相關(guān)的類主要位于?org.apache.pdfbox.pdmodel.font?包下。下面是一些常用的字體類:

  1. PDType1Font:這個(gè)類表示?Type?1?字體,它是一種基于輪廓的字體格式。Type?1?字體常用于?PDF?文檔中,如?Helvetica、Times?Roman?和?Courier?等。

示例:

PDType1Font font = PDType1Font.HELVETICA_BOLD;
public static final PDType1Font TIMES_ROMAN = new PDType1Font("Times-Roman");
public static final PDType1Font TIMES_BOLD = new PDType1Font("Times-Bold");
public static final PDType1Font TIMES_ITALIC = new PDType1Font("Times-Italic");
public static final PDType1Font TIMES_BOLD_ITALIC = new PDType1Font("Times-BoldItalic");
public static final PDType1Font HELVETICA = new PDType1Font("Helvetica");
public static final PDType1Font HELVETICA_BOLD = new PDType1Font("Helvetica-Bold");
public static final PDType1Font HELVETICA_OBLIQUE = new PDType1Font("Helvetica-Oblique");
public static final PDType1Font HELVETICA_BOLD_OBLIQUE = new PDType1Font("Helvetica-BoldOblique");
public static final PDType1Font COURIER = new PDType1Font("Courier");
public static final PDType1Font COURIER_BOLD = new PDType1Font("Courier-Bold");
public static final PDType1Font COURIER_BOLD_OBLIQUE = new PDType1Font("Courier-BoldOblique");
public static final PDType1Font SYMBOL = new PDType1Font("Symbol");
public static final PDType1Font ZAPF_DINGBATS = new PDType1Font("ZapfDingbats");
  1. PDTrueTypeFont:這個(gè)類表示?TrueType?字體,也是一種基于輪廓的字體格式。TrueType?字體在?PDF?中也很常見。

PDTrueTypeFont font = PDType1Font.TIMES_ROMAN;
  1. PDType0Font:這個(gè)類表示?Type?0?字體,它是一種復(fù)合字體格式,可以包含多個(gè)子字體。Type?0?字體通常用于支持多語言和復(fù)雜字形需求,你可以使用它來加載自己自定義的字體文件。

PDType0Font font = PDType0Font.load(document, new ClassPathResource("/static/wryhRegular.ttf").getInputStream());
寫入單行文本
contentStream.setFont(PDType1Font.COURIER_BOLD_OBLIQUE, 16);
contentStream.beginText();
contentStream.newLineAtOffset(50, pageHeight-50);
contentStream.showText("測(cè)試文本");
contentStream.endText();

在寫入文本之前需要通過contentStream.setFont(PDFont?font,?float?fontSize)?方法設(shè)置字體和字號(hào),并通過beginText()方法開始一個(gè)新的文本段落,通過newLineAtOffset(x,?y);方法設(shè)置文本的坐標(biāo)位置,這里設(shè)置(50,?pageHeight-50)表示文本位置位于左上角,離上面和左邊?50?個(gè)單位。然后通過showText(String?text)顯示你需要展示的文本,最后用endText()方法結(jié)束文本段落。

連續(xù)寫入多行文本
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);

// 設(shè)置文本起始坐標(biāo)
float startX = 50;
float startY = page.getMediaBox().getHeight() - 50;

// 設(shè)置行間距
float leading = 15;

// 寫入多行文本
String[] lines = {
    "第一行文本",
    "第二行文本",
    "第三行文本"
};

contentStream.beginText();
contentStream.newLineAtOffset(startX, startY);

for (String line : lines) {
    contentStream.showText(line);
    contentStream.newLineAtOffset(0, -leading);
}

contentStream.endText();

寫入多行文本和單行文本流程差不多,都需要先設(shè)置字體和字號(hào),確定寫入文字的坐標(biāo),不同的是,我們?cè)?beginText()方法和endText()方法之間,多次執(zhí)行了showText()和newLineAtOffset(),newLineAtOffset(0,?-leading)方法代表著在上一行的位置基礎(chǔ)上,X?軸不變,Y?軸向下移動(dòng)leading?個(gè)單位。多次循環(huán)之后將多行文本添加到?pdf?文檔中。

插入圖片
PDImageXObject image = PDImageXObject.createFromFileByExtension(new File("path/to/image.jpg"), document);
float imageWidth = image.getWidth();
float imageHeight = image.getHeight();

PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.drawImage(image, x, y, imageWidth, imageHeight);

這里我們使用PDImageXObject.createFromFileByExtension()方法加載圖片文件,創(chuàng)建一個(gè)PDImageXObject對(duì)象。確保將"path/to/image.jpg"替換為實(shí)際圖片文件的路徑,這里我將圖片的寬度和高度設(shè)置為真實(shí)圖片的寬高,在實(shí)際情況中你也可以自定義寬高,最后通過drawImage(image,?x,?y,?imageWidth,?imageHeight)方法將圖片寫入到?pdf?文檔中,x,y?代表其?xy?坐標(biāo),后面的imageWidth,?imageHeight?分別代表圖片的寬度和高度。文章來源地址http://www.zghlxwxcb.cn/news/detail-739412.html

添加矩形框
//設(shè)置邊框顏色
contentStream.setStrokingColor(new Color(213, 213, 213));
//設(shè)置邊框?qū)挾葹?
contentStream.setLineWidth(1);
// 添加矩形框到頁面內(nèi)容流
contentStream.addRect(50, pageHeight-50, 100, 100);
// 繪制矩形框的邊框
contentStream.stroke();
//恢復(fù)原來的顏色,否則會(huì)影響文字顏色
contentStream.setStrokingColor(Color.BLACK);

文字坐標(biāo)計(jì)算常用方法

    /**
     * 獲取字體高度
     * */
    float getFontHeight(PDType0Font customFont,float fontSize){
        return customFont.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
    }
    /**
    * 計(jì)算文本寬度
    * */
    float getTextWidth(String text,float fontSize){
        return fontSize * text.length();
    }

附件

PDFBox官方文檔(2.0.24)

到了這里,關(guān)于java利用pdfbox動(dòng)態(tài)生成PDF的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java使用pdfbox將pdf轉(zhuǎn)圖片

    Java使用pdfbox將pdf轉(zhuǎn)圖片

    目前比較主流的兩種轉(zhuǎn)pdf的方式,就是pdfbox和icepdf,兩種我都嘗試了下,icepdf解析出來有時(shí)候會(huì)出現(xiàn)中文顯示不出來,網(wǎng)上的解決方式又特別麻煩,不是安裝字體,就是重寫底層類,所以我選擇了pdfbox 在windows上好好的,x86_64的linux上也好好的,就是arm架構(gòu)的linux上會(huì)出現(xiàn) 網(wǎng)上

    2024年02月10日
    瀏覽(28)
  • JAVA 實(shí)現(xiàn)PDF轉(zhuǎn)圖片(pdfbox版)

    JAVA 實(shí)現(xiàn)PDF轉(zhuǎn)圖片(pdfbox版)

    依賴: pdf存放路徑 正文開始: pdf轉(zhuǎn)換多張圖片、長(zhǎng)圖 展示效果: 附加:小程序預(yù)覽wxml代碼 依賴: pdf存放路徑 正文開始: pdf轉(zhuǎn)換多張圖片、長(zhǎng)圖

    2024年02月06日
    瀏覽(26)
  • Java 利用Easyexcel動(dòng)態(tài)導(dǎo)出表頭列

    Java 利用Easyexcel動(dòng)態(tài)導(dǎo)出表頭列

    其中 fieldName 為要導(dǎo)出的字段名稱 也就是 數(shù)據(jù)對(duì)象 中與之對(duì)應(yīng)的字段名稱 headName 為與字段對(duì)應(yīng)的表頭(我這里默認(rèn)用的就是導(dǎo)出表頭集合中字段排序就是導(dǎo)出的表頭排序 如有需要,可以自己定義導(dǎo)出表頭順序) 導(dǎo)出util類,直接上代碼 其中? CellStyle() 是設(shè)置的默認(rèn)樣式?

    2024年02月11日
    瀏覽(20)
  • Java使用pdfbox進(jìn)行pdf和圖片之間的轉(zhuǎn)換

    Java使用pdfbox進(jìn)行pdf和圖片之間的轉(zhuǎn)換

    pdfbox是Apache開源的一個(gè)項(xiàng)目,支持pdf文檔操作功能。 官網(wǎng)地址:?Apache PDFBox | A Java PDF Library 支持的功能如下圖. 引入依賴

    2024年02月06日
    瀏覽(25)
  • 【Java】OpenPDF、iText、PDFBox 是三種常用的 PDF 處理庫

    OpenPDF、iText、PDFBox 是三種常用的 PDF 處理庫,它們各自具有獨(dú)特的優(yōu)勢(shì)和特點(diǎn),同時(shí)也存在一些局限性和差異。本文將對(duì)這四種庫進(jìn)行詳細(xì)的比較,并通過代碼示例來展示它們的使用。 1、OpenPDF OpenPDF 是一個(gè)用于創(chuàng)建和編輯 PDF 文檔的 Java 庫,它基于 iText 庫的一個(gè)分支,提供

    2024年02月09日
    瀏覽(34)
  • java中pdfbox處理pdf常用方法(讀取、寫入、合并、拆分、寫文字、寫圖片)

    java中pdfbox處理pdf常用方法(讀取、寫入、合并、拆分、寫文字、寫圖片)

    方法代碼: 測(cè)試用例: 2.1寫文字 方法代碼: 測(cè)試用例: A.pdf: A2.pdf: 2.2寫圖片 方法代碼: 測(cè)試用例: A.pdf: pic.jpg: A2.pdf: 方法代碼: 測(cè)試用例: 方法代碼: 測(cè)試用例: 引用鏈接: (17條消息) 使用Apache PDFBox實(shí)現(xiàn)拆分、合并PDF_似有風(fēng)中泣的博客-CSDN博客 (17條消息) Java使用P

    2024年02月11日
    瀏覽(32)
  • 如何通過Java的Apache PDFBox庫制作一個(gè)PDF表格模板并填充數(shù)據(jù)

    要使用Java的Apache PDFBox庫制作一個(gè)PDF表格模板并填充數(shù)據(jù),你需要遵循以下步驟: 添加依賴 :首先,確保你的項(xiàng)目中包含了Apache PDFBox的依賴。如果你使用Maven,可以在你的 pom.xml 文件中添加以下依賴: 創(chuàng)建PDF模板 :你可以使用PDFBox創(chuàng)建一個(gè)簡(jiǎn)單的PDF模板,或者使用其他工具

    2024年02月22日
    瀏覽(23)
  • Java實(shí)現(xiàn)動(dòng)態(tài)生成word報(bào)告

    Java實(shí)現(xiàn)動(dòng)態(tài)生成word報(bào)告

    1.準(zhǔn)備好docx文件模板 舉例:動(dòng)態(tài)生成表格數(shù)據(jù),以下是list數(shù)組類型的freemarker語法 將寫好的word模板加入到templates目錄下 2.在pom.xml中導(dǎo)入相關(guān)依賴 3.關(guān)于Minio的介紹 Minio 是一個(gè)開源的對(duì)象存儲(chǔ)服務(wù)器,可用于存儲(chǔ)和訪問海量數(shù)據(jù)。以下是 Minio 的基本用法: (1)安裝 Minio 首先

    2024年02月09日
    瀏覽(18)
  • java動(dòng)態(tài)生成excel并且需要合并單元格

    java動(dòng)態(tài)生成excel并且需要合并單元格

    java動(dòng)態(tài)生成excel并且需要合并單元格 先上圖看一下預(yù)期效果 集成poi 通過poi手動(dòng)制作excel

    2024年02月13日
    瀏覽(23)
  • Java實(shí)現(xiàn)自動(dòng)化pdf打水印小項(xiàng)目 使用技術(shù)pdfbox、Documents4j

    Java實(shí)現(xiàn)自動(dòng)化pdf打水印小項(xiàng)目 使用技術(shù)pdfbox、Documents4j

    博主介紹:?目前全網(wǎng)粉絲2W+,csdn博客專家、Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者,博客之星、阿里云平臺(tái)優(yōu)質(zhì)作者、專注于Java后端技術(shù)領(lǐng)域。 涵蓋技術(shù)內(nèi)容:Java后端、算法、分布式微服務(wù)、中間件、前端、運(yùn)維、ROS等。 博主所有博客文件目錄索引:博客目錄索引(持續(xù)更新) 視頻平臺(tái):

    2024年02月20日
    瀏覽(39)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包