2013-11-03 34 views
0

我有一個pdf文件,當我用記事本++打開時,需要做一些小的調整。 如果我手動執行,它工作正常。 我想在一個小型的C++程序中做到這一點。 我試圖做的是讀爲二進制流,並調整運行的內容。 例如:在C++中調整pdf文件內容

std::ofstream outputStream(output,std::ofstream::out | std::ofstream::trunc | std::ofstream::binary); 
std::ifstream inputStream(input, std::ofstream::in | std::ifstream::binary); 
for(std::string stringInput; getline(inputStream,stringInput);) 
{ 
    if (stringInput.find("abc") != std::string::npos && stringInput.find("#1") != std::string::npos) 
     stringInput.replace(....); 
outputStream << stringInput << endl; 
stringInput.clear() 
} 

但是,它永遠不會匹配。並在那裏。不知道爲什麼。 我對二進制文件/ io方法做錯了什麼? 這是正確的方法嗎? 當我試圖讀取文本文件,它沒有寫新行,它不能處理除字符以外的任何東西。林不知道爲什麼強硬

+1

此外,黑客用自己的方式爲PDF格式,試圖替換/插入的東西可能最終破裂,絕對不是正確的前進道路。不要依賴它的工作。 – Thomas

+0

你想用什麼樣的文字來取代這種方式?希望不會內容串流?他們一般可以使用完全自定義的編碼,所以他們可能看起來像完全亂碼給你。 – mkl

+0

好吧,沒有。我想要替換一個經過編碼的小部分。我可以在記事本++中看到它作爲常規文本。如果我用記事本「手工」修復它,它工作正常。所以我只想應用自動修復。 – buddy123

回答

2

你不想在不包括行的文件中使用getline。首先,它會排隊結束,這會導致結果難以理解。

+0

那麼我應該如何在C +中將一個字符串C++對象與for循環混合? – buddy123

+1

你不應該。你試圖操作二進制數據,不應該假裝它是一個文本字符串。 –

+0

我想編輯一個文本部分。它不是二進制部分。爲了複製起作用,我必須將其讀作二進制文件。 – buddy123

2

獲取PDF文件,爲您做所有複雜的東西。

的PDF文件格式是如此複雜,不能在一年以內正確地執行它。其他人在這方面做了很多很好的工作,所以你應該相信他們

尋找一個PDF庫讀取PDF文件作爲標記列表。然後,您的代碼應該是這樣的:

PdfInputStream in("input.pdf"); 
PdfOutputStream out("out.pdf"); 
PdfToken token; 

while (in >> token) { 
    if (token.isText()) { 
    token.replaceText("abc", "#1"); 
    } 
    out << token; 
} 
+0

'token.replaceText(「abc」,「#1」)' - 不要指望這一般是可能的。內容流字符串可能看起來像二進制垃圾。並且在部分嵌入字體的情況下,您的替換可能無法按需打印。 – mkl

+0

哦,是的,這是一個名爲「子集編碼」的功能,但大多數這些字體應該有一個轉換表(用於複製和粘貼),所以它可能在某些情況下工作,並且庫應該處理它。確實,字符串寬度的變化是另一個問題。但通過使用這種方法,至少文件中的字節偏移量是正確的。 –

+0

*它可能在某些情況下工作,並且圖書館應該處理它* - 好吧,有許多圖書館**不處理這種情況。畢竟,爲了替換尚未嵌入的字符,嵌入的字體子集將不得不被改變;許多圖書館不認爲值得的努力。 – mkl