2017-02-19 83 views
-1

我在"C:\\pdfs\\"目錄中有pdf文件。我想要獲得這些pdf文件並從meta_data.txt文件中插入元數據。用我的知識iTextSharp的鎖,我編寫這樣的:我不想旋轉頁面,但iTextSharp以編程方式旋轉我的頁面

var pdf_files = Directory.GetFiles("C:\\pdfs\\", "*.pdf"); 
var i = 0; 
foreach (var pdf_file in pdf_files) 
{ 

    var read = new PdfReader(pdf_file); 
    var size = read.GetPageSizeWithRotation(1); 
    var document = new Document(size); 
    var write = PdfWriter.GetInstance(document, new FileStream("C:\\temp\\" + "file_" + i, FileMode.Create, FileAccess.Write)); 

    var datas = File.ReadAllLines("C:\\pdfs\\" + @"meta_data.txt"); 
    var str = datas[i].Split('@'); 


    document.AddTitle(str[1]); 
    document.AddSubject(str[2]); 
    document.AddCreator(str[3]); 
    document.AddAuthor(str[4]); 
    document.AddKeywords(str[5]); 
    document.Open(); 

    var cb = write.DirectContent; 
    for (var pageNum = 1; pageNum <= read.NumberOfPages; pageNum++) 
    { 
     document.NewPage(); 
     var page = write.GetImportedPage(read, pageNum); 
     cb.AddTemplate(page, 0, 0); 
    } 
    document.Close(); 
    read.Close(); 
    File.Delete(pdf_file); 
    File.Move("C:\\temp\\" + "file_" + i, "C:\\created\\" + "file_" + i); 

    i++; 
} 

此代碼得到的主要PDF文件的實例,而創建到temp目錄,注入metadatas後來移動created目錄。我找不到比這更實際的方法。 無論如何,在一些pdf文件(生成爲原始pdf文件)沒有這樣的問題: enter image description here 但是一些其他pdf文件(從掃描或非常舊的pdf文件生成)以編程方式進行旋轉。它似乎令人噁心的是這樣的: enter image description here 比所有更糟,我不知道我是如何解決這個問題的。你能幫我解決這個問題嗎?

+2

原因是您選擇了一種非最佳方式將文檔與itext合併,不會複製原始頁面的所有屬性(因爲涉及的方法是爲不同的用例設計的)。使用基於'PdfCopy'而不是'PdfWriter'的合併解決方案,參見[這個答案](http://stackoverflow.com/a/15945467/1729265)。 – mkl

+0

請閱讀官方文檔:http://developers.itextpdf.com/examples/miscellaneous/adding-metadata –

回答

2

正確回答這個問題是這樣的:

PdfReader reader = new PdfReader(src); 
using (PdfStamper stamper = new PdfStamper(reader, 
    new FileStream("C:\\temp\\" + "file_" + i, FileMode.Create, FileAccess.Write))) { 
    Dictionary<String, String> info = reader.Info; 
    info["Title"] = "Hello World stamped"; 
    info["Subject"] = "Hello World with changed metadata"; 
    info["Keywords"] = "iText in Action, PdfStamper"; 
    info["Creator"] = "Silly standalone example"; 
    info["Author"] = "Bruno Lowagie"; 
    stamper.MoreInfo = info; 
} 

Habip OĞUZ忽視了我在Chapter 6「的iText在行動 - 第二版」中寫道,即使用DocumentPdfWriterAddTemplate()是錯誤的,當你想要操縱一個現有的PDF。通過使用AddTemplate(),可以丟棄大量的功能,如交互性,結構等。您還會創建一個不理想的PDF,因爲每個頁面都將被存儲爲Form XObject。

+0

糟糕,確實如此。我剛剛看到op對多個輸入文件進行迭代,並認爲他想合併,因此指向'PdfCopy'。其實他分別處理每個pdf,所以應該使用'PdfStamper' ... – mkl

+0

@Bruno Lowagie - 非常感謝您的回覆。爲了不誤導其他開發人員,我正在清除我的答覆,這些答覆是服務不好的解決方案(或非解決方案)。 –