日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 判断文件是否pdf_如何确定文件是否为PDF文件?

發布時間:2023/12/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 判断文件是否pdf_如何确定文件是否为PDF文件? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

回答(11)

2 years ago

你可以找到一個文件(或字節數組)的mime類型,所以你不要愚蠢地依賴擴展 . 我是用光盤的MimeExtractor(http://aperture.sourceforge.net/)做的,或者我前幾天看到了一個庫(http://sourceforge.net/projects/mime-util)

我使用光圈從各種文件中提取文本,不僅僅是pdf,而且必須調整為pdfs思考(光圈使用pdfbox,但我在pdfbox失敗時添加了另一個庫作為后備)

2 years ago

以下是我在NUnit測試中使用的內容,它必須針對使用Crystal Reports生成的多個PDF版本進行驗證:

public static void CheckIsPDF(byte[] data)

{

Assert.IsNotNull(data);

Assert.Greater(data.Length,4);

// header

Assert.AreEqual(data[0],0x25); // %

Assert.AreEqual(data[1],0x50); // P

Assert.AreEqual(data[2],0x44); // D

Assert.AreEqual(data[3],0x46); // F

Assert.AreEqual(data[4],0x2D); // -

if(data[5]==0x31 && data[6]==0x2E && data[7]==0x33) // version is 1.3 ?

{

// file terminator

Assert.AreEqual(data[data.Length-7],0x25); // %

Assert.AreEqual(data[data.Length-6],0x25); // %

Assert.AreEqual(data[data.Length-5],0x45); // E

Assert.AreEqual(data[data.Length-4],0x4F); // O

Assert.AreEqual(data[data.Length-3],0x46); // F

Assert.AreEqual(data[data.Length-2],0x20); // SPACE

Assert.AreEqual(data[data.Length-1],0x0A); // EOL

return;

}

if(data[5]==0x31 && data[6]==0x2E && data[7]==0x34) // version is 1.4 ?

{

// file terminator

Assert.AreEqual(data[data.Length-6],0x25); // %

Assert.AreEqual(data[data.Length-5],0x25); // %

Assert.AreEqual(data[data.Length-4],0x45); // E

Assert.AreEqual(data[data.Length-3],0x4F); // O

Assert.AreEqual(data[data.Length-2],0x46); // F

Assert.AreEqual(data[data.Length-1],0x0A); // EOL

return;

}

Assert.Fail("Unsupported file format");

}

2 years ago

這里是NinjaCross代碼的改編Java版本 .

/**

* Test if the data in the given byte array represents a PDF file.

*/

public static boolean is_pdf(byte[] data) {

if (data != null && data.length > 4 &&

data[0] == 0x25 && // %

data[1] == 0x50 && // P

data[2] == 0x44 && // D

data[3] == 0x46 && // F

data[4] == 0x2D) { // -

// version 1.3 file terminator

if (data[5] == 0x31 && data[6] == 0x2E && data[7] == 0x33 &&

data[data.length - 7] == 0x25 && // %

data[data.length - 6] == 0x25 && // %

data[data.length - 5] == 0x45 && // E

data[data.length - 4] == 0x4F && // O

data[data.length - 3] == 0x46 && // F

data[data.length - 2] == 0x20 && // SPACE

data[data.length - 1] == 0x0A) { // EOL

return true;

}

// version 1.3 file terminator

if (data[5] == 0x31 && data[6] == 0x2E && data[7] == 0x34 &&

data[data.length - 6] == 0x25 && // %

data[data.length - 5] == 0x25 && // %

data[data.length - 4] == 0x45 && // E

data[data.length - 3] == 0x4F && // O

data[data.length - 2] == 0x46 && // F

data[data.length - 1] == 0x0A) { // EOL

return true;

}

}

return false;

}

還有一些簡單的單元測試:

@Test

public void test_valid_pdf_1_3_data_is_pdf() {

assertTrue(is_pdf("%PDF-1.3 CONTENT %%EOF \n".getBytes()));

}

@Test

public void test_valid_pdf_1_4_data_is_pdf() {

assertTrue(is_pdf("%PDF-1.4 CONTENT %%EOF\n".getBytes()));

}

@Test

public void test_invalid_data_is_not_pdf() {

assertFalse(is_pdf("Hello World".getBytes()));

}

如果你想出任何失敗的單元測試,請告訴我 .

2 years ago

由于您使用PDFBox,您可以簡單地執行:

PDDocument.load(file);

如果PDF損壞等,它將以異常失敗 .

如果成功,您還可以使用 .isEncrypted() 檢查PDF是否已加密

2 years ago

你必須嘗試這個....

public boolean isPDF(File file){

file = new File("Demo.pdf");

Scanner input = new Scanner(new FileReader(file));

while (input.hasNextLine()) {

final String checkline = input.nextLine();

if(checkline.contains("%PDF-")) {

// a match!

return true;

}

}

return false;

}

2 years ago

Pdf文件以“%PDF”開頭(在TextPad或類似文件中打開一個并查看)

你有什么理由不能用StringReader讀取文件并檢查這個嗎?

2 years ago

我正在使用我在此處和其他網站/帖子中提出的一些建議來確定pdf是否有效 . 我故意破壞了pdf文件,不幸的是,許多解決方案都沒有檢測到文件已損壞 .

最后,在修改了API中的不同方法之后,我嘗試了這個:

PDDocument.load(file).getPage(0).getContents().toString();

這沒有拋出異常,但確實輸出了這個:

WARN [COSParser:1154] The end of the stream doesn't point to the correct offset, using workaround to read the stream, stream start position: 171, length: 1145844, expected end position: 1146015

就個人而言,如果文件已損壞我想要拋出異常,以便我自己處理它,但似乎我正在實現的API已經以自己的方式處理它們 .

為了解決這個問題,我決定嘗試使用給出warm語句的類(COSParser)來解析文件 . 我發現有一個名為PDFParser的子類,它繼承了一個名為"setLenient"的方法,它是鍵(https://pdfbox.apache.org/docs/2.0.4/javadocs/org/apache/pdfbox/pdfparser/COSParser.html) .

然后我實現了以下內容:

RandomAccessFile accessFile = new RandomAccessFile(file, "r");

PDFParser parser = new PDFParser(accessFile);

parser.setLenient(false);

parser.parse();

正如我所知,這為我損壞的文件拋出了一個Exception . 希望這可以幫助別人!

2 years ago

也許我來不及回答 . 但是你應該看看Tika . 它在內部使用PDFBox Parser來解析PDF

您只需要導入tika-app-latest * .jar

public String parseToStringExample() throws IOException, SAXException, TikaException

{

Tika tika = new Tika();

try (InputStream stream = ParsingExample.class.getResourceAsStream("test.pdf")) {

return tika.parseToString(stream); // This should return you the pdf's text

}

}

這將是一個更清潔的解決方案 . 您可以在這里參考Tika用法的更多細節:https://tika.apache.org/1.12/api/

2 years ago

羅杰凱斯的答案是錯的!因為并非版本1.3中的所有PDF文件都不是由EOL終止的 . 以下答案適用于所有未損壞的pdf文件:

public static boolean is_pdf(byte[] data) {

if (data != null && data.length > 4

&& data[0] == 0x25 && // %

data[1] == 0x50 && // P

data[2] == 0x44 && // D

data[3] == 0x46 && // F

data[4] == 0x2D) { // -

// version 1.3 file terminator

if (//data[5] == 0x31 && data[6] == 0x2E && data[7] == 0x33 &&

data[data.length - 7] == 0x25 && // %

data[data.length - 6] == 0x25 && // %

data[data.length - 5] == 0x45 && // E

data[data.length - 4] == 0x4F && // O

data[data.length - 3] == 0x46 && // F

data[data.length - 2] == 0x20 // SPACE

//&& data[data.length - 1] == 0x0A// EOL

) {

return true;

}

// version 1.3 file terminator

if (//data[5] == 0x31 && data[6] == 0x2E && data[7] == 0x34 &&

data[data.length - 6] == 0x25 && // %

data[data.length - 5] == 0x25 && // %

data[data.length - 4] == 0x45 && // E

data[data.length - 3] == 0x4F && // O

data[data.length - 2] == 0x46 // F

//&& data[data.length - 1] == 0x0A // EOL

) {

return true;

}

}

return false;

}

2 years ago

一般來說,我們可以這樣,任何pdf版本都將以%% EOF結束,所以我們可以像下面那樣檢查 .

public static boolean is_pdf(byte[] data) {

String s = new String(data);

String d = s.substring(data.length - 7, data.length - 1);

if (data != null && data.length > 4 &&

data[0] == 0x25 && // %

data[1] == 0x50 && // P

data[2] == 0x44 && // D

data[3] == 0x46 && // F

data[4] == 0x2D) { // -

if(d.contains("%%EOF")){

return true;

}

}

return false;

}

2 years ago

API非常簡單:

import com.codeborne.pdftest.PDF;

import static com.codeborne.pdftest.PDF.*;

import static org.junit.Assert.assertThat;

public class PDFContainsTextTest {

@Test

public void canAssertThatPdfContainsText() {

PDF pdf = new PDF(new File("src/test/resources/50quickideas.pdf"));

assertThat(pdf, containsText("50 Quick Ideas to Improve your User Stories"));

}

}

總結

以上是生活随笔為你收集整理的java 判断文件是否pdf_如何确定文件是否为PDF文件?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。