Java中將PDF轉換為HTML可以使用開源庫Apache PDFBox來實現。以下是一個簡單的示例,說明如何使用PDFBox進行轉換:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Entities;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
public class PdfToHtmlConverter {
public static void convertPdfToHtml(String pdfFilePath, String htmlOutputPath) {
try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
if (!document.isEncrypted()) {
PDFRenderer pdfRenderer = new PDFRenderer(document);
// 創建一個HTML文檔對象
Document htmlDocument = Jsoup.parseBodyFragment("<html><head><title>Converted PDF</title></head><body></body></html>");
for (int page = 0; page < document.getNumberOfPages(); ++page) {
// 從PDF頁面創建一個BufferedImage
BufferedImage image = pdfRenderer.renderImageWithDPI(page, 96, ImageType.RGB);
// 將圖片轉為Base64并添加到HTML中(這里假設我們只轉換為圖片形式的HTML)
String base64Img = getBase64Image(image);
Element imgElement = new Element("img").attr("src", "data:image/png;base64," + base64Img);
htmlDocument.body().appendChild(imgElement);
// 如果需要文本形式的HTML,則需解析圖像中的文本,但這通常更為復雜,PDFBox本身并不直接提供純文本HTML轉換
}
// 輸出HTML到文件
Files.write(Paths.get(htmlOutputPath), htmlDocument.html().getBytes(StandardCharsets.UTF_8));
} else {
System.err.println("The PDF file is encrypted and cannot be converted directly.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static String getBase64Image(BufferedImage image) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "png", os);
byte[] imageData = os.toByteArray();
return Base64.getEncoder().encodeToString(imageData);
}
public static void main(String[] args) {
convertPdfToHtml("input.pdf", "output.html");
}
}
// 注意:上述代碼僅演示了如何將PDF每一頁轉換為PNG圖片,并嵌入到HTML中。
// 要獲得純文本和格式的HTML轉換,可能需要更復雜的邏輯來解析PDF的文本布局和樣式。
實際上,PDFBox并不直接支持將PDF內容以保持原始格式的方式完美轉換成HTML。如果你需要更高級的轉換,例如保留文本、表格和列表等格式,你可能需要結合其他工具或服務,或者編寫自定義的PDF解析邏輯來模擬HTML結構。
在不使用圖形界面的情況下從互聯網上獲取所需的信息,curl 是一種快速有效的方法。
? 來源:linux.cn ? 作者:Seth Kenlon ? 譯者:MjSeven ?
(本文字數:4904,閱讀時長大約:6 分鐘)
下載我們整理的 curl 備忘錄。要在不使用圖形界面的情況下從互聯網上獲取所需的信息,curl 是一種快速有效的方法。
curl 通常被視作一款非交互式 Web 瀏覽器,這意味著它能夠從互聯網上獲取信息,并在你的終端中顯示,或將其保存到文件中。從表面看,這是 Web 瀏覽器,類似 Firefox 或 Chromium 所做的工作,只是它們默認情況下會渲染信息,而 curl 會下載并顯示原始信息。實際上,curl 命令可以做更多的事情,并且能夠使用多種協議與服務器進行雙向傳輸數據,這些協議包括 HTTP、FTP、SFTP、IMAP、POP3、LDAP、SMB、SMTP 等。對于普通終端用戶來說,這是一個有用的工具;而對于系統管理員,這非常便捷;對于微服務和云開發人員來說,它是一個質量保證工具。
curl 被設計為在沒有用戶交互的情況下工作,因此與 Firefox 不同,你必須從頭到尾考慮與在線數據的交互。例如,如果想要在 Firefox 中查看網頁,你需要啟動 Firefox 窗口。打開 Firefox 后,在地址欄或搜索引擎中輸入要訪問的網站。然后,導航到網站,然后單擊要查看的頁面。
對于 curl 來說也是如此,不同之處在于你需要一次執行所有操作:在啟動 curl 的同時提供需要訪問的互聯網地址,并告訴它是否要將數據保存在終端或文件中。當你必須與需要身份驗證的網站或 API 進行交互時,會變得有點復雜,但是一旦你學習了 curl 命令語法,它就會變得自然而然。為了幫助你掌握它,我們在一個方便的 備忘錄 中收集了相關的語法信息。
你可以通過提供指向特定 URL 的鏈接來使用 curl 命令下載文件。如果你提供的 URL 默認為 index.html,那么將下載此頁面,并將下載的文件顯示在終端屏幕上。你可以將數據通過管道傳遞到 less、tail 或任何其它命令:
$ curl "http://example.com" | tail -n 4
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p>
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div></body></html>
由于某些 URL 包含特殊字符,shell 通常會將其解釋,因此最安全的做法用引號將 URL 包起來。
某些文件無法很好的在終端中轉換顯示。你可以使用 --remote-name 選項使文件根據服務器上的命名進行保存:
$ curl --remote-name "https://example.com/linux-distro.iso"
$ ls
linux-distro.iso
或者,你可以使用 --output 選項來命名你想要下載的內容:
curl "http://example.com/foo.html" --output bar.html
因為 curl 不是交互式的,所以很難瀏覽頁面上的可下載元素。如果你要連接的遠程服務器允許,可以使用 curl 來列出目錄的內容:
$ curl --list-only "https://example.com/foo/"
如果你正在下載一個非常大的文件,你可能會發現有時候必須中斷下載。curl 非常智能,可以確定下載從何處中斷并繼續下載。這意味著,下一次當你下載一個 4GB 的 Linux 發行版的 ISO 出現問題時,就不必重新開始了。--continue-at 的語法有點不尋常:如果你知道下載中斷時的字節數,你可以提供給 curl;否則,你可以使用單獨的一個破折號(-)指示 curl 自動檢測:
$ curl --remote-name --continue-at - "https://example.com/linux-distro.iso"
如果你需要下載多個文件而不是一個大文件,那么 curl 可以幫助你解決這個問題。假設你知道要下載的文件的位置和文件名模式,則可以使用 curl 的序列標記:中括號里是整數范圍的起點和終點。對于輸出文件名,使用 #1 表示第一個變量:
$ curl "https://example.com/file_[1-4].webp" --output "file_#1.webp"
如果你需要使用其它變量來表示另一個序列,按照每個變量在命令中出現的順序表示它們。例如,在這個命令中,#1 指目錄 images_000 到 images_009,而 #2 指目錄 file_1.webp 至 file_4.webp:
$ curl "https://example.com/images_00[0-9]/file_[1-4].webp" --output "file_#1-#2.webp"
你也可以僅使用 curl 和 grep 進行一些基本的 Web 抓取操作,以找到想要下載的內容。例如,假設你需要下載與正在歸檔網頁關聯的所有圖像,首先,下載引用了圖像的頁面。將頁面內通過管道傳輸到 grep,搜索所需的圖片類型(在此示例中為 PNG)。最后,創建一個 while 循環來構造下載 URL,并將文件保存到你的計算機:
$ curl https://example.com |\
grep --only-matching 'src="[^"]*.[png]"' |\
cut -d\" -f2 |\
while read i; do \
curl https://example.com/"${i}" -o "${i##*/}"; \
done
這只是一個示例,但它展示了 curl 與 Unix 管道和一些基本而巧妙的解析結合使用時是多么的靈活。
用于數據交換的協議在計算機發送通信的數據包中嵌入了大量元數據。HTTP 頭是數據初始部分的組件。在連接一個網站出現問題時,查看這些報文頭(尤其是響應碼)會有所幫助:
curl --head "https://example.com"
HTTP/2 200
accept-ranges: bytes
age: 485487
cache-control: max-age=604800
content-type: text/html; charset=UTF-8
date: Sun, 26 Apr 2020 09:02:09 GMT
etag: "3147526947"
expires: Sun, 03 May 2020 09:02:09 GMT
last-modified: Thu, 17 Oct 2019 07:18:26 GMT
server: ECS (sjc/4E76)
x-cache: HIT
content-length: 1256
響應 200 通常是 HTTP 成功指示符,這是你與服務器連接時通常期望的結果。著名的 404 響應表示找不到頁面,而 500 則表示服務器在處理請求時出現了錯誤。
要查看協商過程中發生了什么錯誤,添加 --show-error 選項:
$ curl --head --show-error "http://opensource.ga"
除非你可以訪問要連接的服務器,否則這些問題將很難解決,但是 curl 通常會盡力連接你指定的地址。有時在網絡上進行測試時,無休止的重試似乎只會浪費時間,因此你可以使用 --fail-early 選項來強制 curl 在失敗時迅速退出:
curl --fail-early "http://opensource.ga"
300 這個系列的響應更加靈活。具體來說,301 響應意味著一個 URL 已被永久移動到其它位置。對于網站管理員來說,重新定位內容并留下“痕跡”是一種常見的方式,這樣訪問舊地址的人們仍然可以找到它。默認情況下,curl 不會進行 301 重定向,但你可以使用 --localtion 選項使其繼續進入 301 響應指向的目標:
$ curl "https://iana.org" | grep title
<title>301 Moved Permanently</title>
$ curl --location "https://iana.org"
<title>Internet Assigned Numbers Authority</title>
如果你想要在訪問短網址之前先查看它們,那么 --location 選項非常有用。短網址對于有字符限制的社交網絡(當然,如果你使用 現代和開源的社交網絡 的話,這可能不是問題),或者對于用戶不能復制粘貼長地址的印刷媒體來說是有用處的。但是,它們也可能存在風險,因為其目的地址本質上是隱藏的。通過結合使用 --head 選項僅查看 HTTP 頭,--location 選項可以查看一個 URL 的最終地址,你可以查看一個短網址而無需加載其完整的資源:
$ curl --head --location "<https://bit.ly/2yDyS4T>"
一旦你開始考慮了將探索 web 由一條命令來完成,那么 curl 就成為一種快速有效的方式,可以從互聯網上獲取所需的信息,而無需麻煩圖形界面。為了幫助你適應到工作流中,我們創建了一個 curl 備忘錄 ,它包含常見的 curl 用法和語法,包括使用它查詢 API 的概述。
via: opensource.com
作者: Seth Kenlon 選題: lujun9972 譯者: MjSeven 校對: wxy
本文由 LCTT 原創編譯, Linux中國 榮譽推出
Web應用日益復雜,前端開發也發生了翻天覆地的變化變得盤根錯節,到今天已經非常復雜和龐大了!用html、css、javascript老老實實的寫個頁面的時代早已過去。而現在要完成工作需要借助很多額外的東西,比如工程化、自動化等等。這樣才顯得有逼格,才像一個真正的程序猿。如果說還停留在切個圖,下載個js效果懟上去的階段,顯然你會脫節的。由此也帶動了很多前端工具的發展,以Gulp、Grunt、webpack等為代表的構建工具猶如雨后春筍般的生長,而webpack更為流行,使用更為廣泛,可以說它現在已經是前端開發的的標配了。所以這次我會用一個系列的文章詳細去介紹webpack,由淺入深解析webpack,再通過實戰例子配合,掌握以后足以解決你工作中的問題。同時這套系列文章是針對最新的4.X的版本。
webpack是一款工具?什么工具?有人管他叫打包工具,這樣太low了。可以看看webpack官網,頁面底部的一個個小頭像代表的是給webpack贊助過的人,鼠標放上去還可以看到他贊助了多少錢。就憑這么多人的贊助,也不能叫這么low逼的名,聽得好像是個壓縮軟件。得起個高大上的名,叫構建工具(當然打包的功能是它的一大特色)
前端里的什么工程化呀自動化呀,這些東西有個特點,就是源代碼無法在瀏覽器里直接運行,必需通過編譯才行。那構建工具其實就能做這些事情。如:
代碼編譯,把ES6轉成ES5
模塊合并,把多個文件合并成一個文件,減少http請求
代碼壓縮優化,抽取公共代碼,減少代碼量
這些都是構建工具要做的事情,但是這些東西都是用代碼去實現,讓他們通過代碼自動完成這些事情,解放我們的生產力。webpack最大的一個特色就是打包,官網的那張大圖所體現的就是打包的功能,并能解決模塊間相互依賴的問題,它能把亂成一鍋粥的文件打包成清晰的文件,快刀斬亂麻!其次webapck是以模塊為基石,對于模塊化的支持體現的淋漓盡致,在webpack中所有的內容都是模塊,一個圖片、一個css文件、一個js文件都是一個模塊。
注意:
配置文件猶如webpack的大腦,webpack的工作都是通過配置文件完成的。編譯哪個文件、怎么編譯、編譯成什么樣、輸出為什么等等,所有的操作都是按配置文件里的內容來完成的,所以配置文件一個重量級的嘉賓,webapck想要運行的話配置文件是必不可少的東西。
配置文件有6個核心的東西組成,就像JavaScript由ECMAScript、DOM、BOM三部分組成一樣。
entry:入口文件(你要打包,就告訴我打包哪些)
output:出口文件(我打包完了,給你放到哪里)
module:模塊(放lorder,編譯瀏覽器不認識的東西)
plugins:插件(輔助開發,提高開發效率)
devServer:服務器(webpack提供的本地服務器)
mode:模式,分為開發模式、生產模式。此為4.X里新增的
注意:
在項目文件夾(我的為webpack-demo)的根目錄下創建必要的文件夾及文件,結構如下圖 :
show.js代碼如下
//聲明一個函數,最終做為一個模塊被導出
const show=content=>{
const box=document.getElementById("box");
box.innerHTML=`你好!${content}`;
}
export {show}; //ES6導出模塊的語法
main.js代碼如下
import {show} from './show'; //ES6導入模塊的語法,‘./’為main.js的根目錄src,ES6里導入的模塊為js話不需要加后綴名
show('kaivon');
index.html代碼如下
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="box"></div>
</body>
</html>
package.json.js代碼如下
const path=require('path'); //nodejs的語法,引入路徑模塊,為了輸出的時候找絕對路徑
module.exports={
entry:'./src/main.js', //入口文件為main.js
output:{ //輸出
path:path.resolve(__dirname,'dist'), //path.resolve為nodejs的固定語法,用于找到當前文件的絕對路徑
filename:'bundle.js' //輸出的文件名
},
};
在終端里執行命令webpack后,不出意外的話終端里顯示如下就表示成功了
同時看一下文件結構目錄,多了一個dist文件夾,以及bundle.js文件。這兩個就是webpack打包生成的文件,如下
在index.html文件里引入bundle.js文件后,用瀏覽器打開index.html,可以看到頁面里有內容了。這就代表我們已經使用webpack打包了一個文件,它的基本用法已經跑了。
<body>
<div id="box"></div>
<script src="dist/bundle.js"></script>
</body>
語法
1、entry 入口文件
2、output 出口文件
1、輸出一個文件,寫個字符串
2、輸出多個文件,文件名前面加個標識符(id/name/hash)
1、路徑必需為絕對路徑
2、__dirname是nodejs里的一個模塊,表示當前文件的絕對路徑
3、path為nodejs的系統模塊,直接引入后調用path.resolve(__dirname,'輸出文件的路徑');
步驟
當我們在終端里輸入webpack命令的時候webpack會按以下的步驟開始工作
先打開根目錄下的webpack.config.js
找entry(入口)屬性的值
進入到main.js里,看到它又依賴show.js,再找到show.js
把main.js與show.js合并成一個js文件
在webpack.config.js里找到output(出口)屬性
解析output里的path與filename屬性的值
把第4步合并成的js文件放到dist文件夾里,并起個名字叫bundle.js
下面演示多入口,在src目錄里新建兩個js文件,1.js與2.js,代碼如下:
1.js
console.log('這是第一個入口文件!');
2.js
console.log('這是第二個入口文件!');
修改webpack.config.js文件
const path=require('path');
//兩個entry分別一一對應兩個filename
module.exports={
//entry:['./src/1.js','./src/2.js'],
entry:{
one:'./src/1.js',
two:'./src/2.js'
},
output:{
//filename:'bundle.js',
filename:'[name].bundle.js' //可以以name/id/hash放在中括號里區分文件名
path:path.resolve(__dirname,'dist'),
}
}
分別注釋對應的entry與filename,在終端里執行命令:webpack后,查看dist文件夾及運行index.html后查看效果
1、當entry為數組的時候,webpack會把數組里所有文件打包成一個js文件
2、當entry為對象的時候,webpack會把對象里的文件分別打包成多個文件
文章里所說到的只是entry與output的常用配置,它的配置不止這些,可以參考以下鏈接
entry的所有配置:https://webpack.js.org/concepts/entry-points/
output的所有配置:https://webpack.js.org/concepts/output/
資料下載:https://pan.baidu.com/s/147HSaocIRlo8nZx2bwEDzg
下一篇:Webpack 4.X 從入門到精通 - plugin(二)
*請認真填寫需求信息,我們會在24小時內與您取得聯系。