2010-08-10 600 views
-1

如何將PDF文件從版本1.1轉換爲1.4(或更高版本)?將PDF從版本1.1轉換爲1.4(或更高版本)

其實我需要某種命令行工具進行批量轉換或某些API能夠動態轉換整體文檔。

+0

你能描述一下你爲什麼需要這個嗎? 1.1與所有Acrobat版本兼容。 – plinth 2010-08-10 17:55:00

+0

沒有關於這種轉換目標的更多細節,這個問題完全不清楚。 – Bobrovsky 2010-08-10 21:08:22

+0

目標非常簡單。將pdf從版本1.1轉換爲1.4 – user285677 2010-08-11 09:18:38

回答

0

您很可能需要完整版Adobe Acrobat。 (與免費版本相反,Adobe Reader。)

+0

其實我需要某種命令行工具進行批量轉換或某些API能夠動態轉換。 – user285677 2010-08-10 15:46:10

+0

您應該將此要求添加到問題的詳細信息中。 – JYelton 2010-08-10 15:57:57

1

Pdf 1.1與pdf 1.4是前向兼容的。 pdf 1.1中的所有內容都將與pdf 1.4一起工作 - 它由規範保證。讓我們假設你有一些合理的理由,爲什麼這對你來說不夠好(例如,假設你有一個不符合規範的工具,它會使用PDF並在任何小於1.4的文件上爆炸)。

我們可以關注版本之間的主要語法差異。

所有的PDF文件頭1024字節都有一個標頭。在大多數情況下,這是第一行,但不能保證(我在看你的GhostScript!)。頭看起來像這樣在PDF 1.1:

%PDF-1.1 

在PDF 1.4,它看起來像這樣:

%PDF-1.4 

所以從理論上講,所有你需要的是一個工具,它會對着前1024個字節爲「%PDF-1.1」文件並將其更改爲「%PDF-1.4」。你可以使用sed,perl等來爲你做這樣的事情。你可以用C寫,你會受到誘惑,做這樣的事情:

#define PDFHEADERSIZE 1024 
bool ChangeFileToNewPdfVersion(char *file) 
{ 
    char *replacePoint = NULL; 
    FILE *fp = fopen(file, "rw"); 
    char buf[PDFHEADERSIZE + 1]; 
    buf[PDFHEADERSIZE] = '\0'; 
    if (fread(buf, 1, PDFHEADERSIZE, fp) != PDFHEADERSIZE) { fclose(fp); return false; } 
    fseek(fp, 0, SEEK_SET); 
    if ((replacePoint = strstr(buf, "%PDF-1.1")) == NULL) { fclose(fp); return false; } 
    replacePoint[7] = '4'; 
    if (fwrite(buf, 1, PDFHEADERSIZE, fp) != PDFHEADERSIZE) { fclose(fp); return false; } 
    fflush(fp); 
    fclose(fp); 
    return; 
} 

將工作在大多數情況下,明智的。如果文件啓動,它將不起作用,例如,0字節將用作數據塊中的空終止符。

一個更好的選擇(真的)會是拼湊一個簡單的狀態機來找到%PDF-1。通過一次讀取1個字節,直到它找到它或傳遞1017(1024減去標題長度),然後讀取下一個字節,如果它是'1',則追回一個字節並寫入'4'。

您需要擔心的唯一其他事情是PDF 1.4建議文檔目錄應該包含帶有文件版本的版本密鑰。由於在規範中將其定義爲可選,因此您可以放心地忽略它。

所以這會解決你的問題。然而,我不認爲你應該這樣做。真。

您應該花些時間閱讀部分PDF規範,特別是關於版本號和兼容性的第I.2節。

+0

Adob​​e規範包含以下實現注意事項: 14.Acrobat查看器也接受 %的表頭!PS-Adobe-N.n PDF-M。m 也可能值得去尋找這種形式。 – Bobrovsky 2010-08-11 18:38:33

相關問題