2013-05-14 45 views
-1

我想要得到一個3到5個PDF文件(來自某些互聯網源)&合併它們一個接一個。 僅供參考,我不想使用iText的或任何其他PDF的lib,因爲,請看代碼FileOutputStream追加問題,我錯了?

public static void saveFile(String[] urls, String fileName) throws IOException { 
    ClientURLConnection clientURLConnection = null; 
    InputStream inputStream = null; 
    try { 
     int t = 1; 
     FileOutputStream outputStream = new FileOutputStream(fileName,true); 
     for (String url : urls) {     
      clientURLConnection = new ClientURLConnection(url); 
      clientURLConnection.setHttpMethod(ClientURLConnection.GET_METHOD); 
      inputStream = clientURLConnection.getInputStream(); 
      outputStream.write(IOUtils.toByteArray(inputStream)); 
      inputStream.close(); 
      outputStream.flush(); 
      System.out.println((t++) + " - File inserted in " + fileName + "\n"); 
      Thread.sleep(3000); 
     } 
      outputStream.close(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

的String []網址一次 - URL的數組,以獲得PDF文檔。 Sting fileName - 是存儲所有PDF的單個文件。 ClientURLConnecion - 是我自己的類來處理代理和其他事情。

預期輸出 - 兩個PDF文件,我們從URL中獲取是在一個單一的文件

實際輸出 - 二PDF被覆蓋的第一個,但文件的大小是兩個PDF的大小之和。

問題 - 即使我做了FileOutputstream - 追加true,它是覆蓋。 我不明白的地方,我提前

+4

您正在關閉循環中間的輸出流。我很難相信它甚至可以像你說的那樣工作,而不會引發例外。無論如何,如果您處理PDF,請使用能理解它們的庫。將這些文件附加在一起不太可能讓您獲得理想的結果。 – SJuan76 2013-05-14 12:29:25

+0

感謝回答 我試過,即使我保持「outputStream.close();」在循環之外它表現相同 – 2013-05-14 12:32:31

回答

2

合併兩個PDF文件做錯

由於不等同於附加這些文件的二進制內容。

你的代碼可以追加字節你想-as表明輸出文件 - 大小的方式,但似乎只有最後一個附加文件是由你的PDF閱讀器,當你打開它看。

因此,您可能應該使用API​​來讀取PDF的實際內容。

+0

是的,我的PDF閱讀器顯示最後附加的文件。 所以現在我得到了道路,「合併兩個PDF文件並不等同於追加這些文件的二進制內容。」 謝謝。 編輯: 請您分享任何鏈接以瞭解更多信息,爲什麼 「合併兩個PDF文件不等同於追加這些文件的二進制內容」。 – 2013-05-14 12:37:54

+0

沒問題。我希望它有幫助。 – 2013-05-14 12:39:02

+0

您可以分享任何鏈接以瞭解更多信息,爲什麼「合併兩個PDF文件並不等同於追加這些文件的二進制內容。」 – 2013-05-14 12:41:57

0

爲什麼合併兩個PDF文件不等於追加這些文件的二進制內容?

每個文檔文件(不管是.doc,.ppt還是.pdf)都有一個文件格式。文件的擴展名錶示數據已被編碼的格式。這裏通過編碼來表示文件的位和字節已經寫入磁盤的結構。

每個文件都包含實際的數據以及一些爲文件定義元數據的頭文件。對於例如一個.doc文件會包含一些關於作者的元數據以及其他幾件事情。所有這些字段(它們的順序等)如何存儲在磁盤上取決於文件格式。這就是MS Word無法讀取PDF的原因,因爲它可能期望有一組完全不同的字段。現在

,如果你使用基本的文件合併以下兩個PDF文件

[pdf: meta data header]  [pdf: meta data header] 
    [pdf: page1]   with [pdf: page3] 
    [pdf: page2]     [pdf: page4] 
[pdf: meta data footer]  [pdf: meta data footer] 

I/O合併,你會得到這樣的

[pdf: meta data header] 
    [pdf: page1] 
    [pdf: page2] 
[pdf: meta data footer] 
[pdf: meta data header] 
    [pdf: page3] 
    [pdf: page4] 
[pdf: meta data footer] 

這是不正確的。不能有多個標題,不同的程序會有不同的表現。在你的情況下,你的PDF閱讀器很高興向你展示合併的最後一個PDF。

如果另一方面(如由他人建議以及)您使用第三方API有明確的支持編輯PDF文件(如iText的),你會合並

[pdf: meta data header] 
    [pdf: page1] 
    [pdf: page2] 
    [pdf: page3] 
    [pdf: page4] 
[pdf: meta data footer] 
後可能得到這樣的事情

您的PDF閱讀器在正確顯示時沒有問題。