2015-12-27 43 views
0

添加附件從PdfStamper.AddFileAttachment接收到四個參數到PdfStamper.AddFileAttachment,它接收PdfFileSpecification對象作爲參數,我有點麻煩。事情是我想添加文件到我的PDF文件作爲嵌入式文件, 有人可以告訴我,如果我這樣做是正確的方式?!使用iTextSharp.text.pdf.PdfStamper

我把它換成了:iText_Stamper.AddFileAttachment(desc, b, s, s);

有:

PdfFileSpecification pfs = PdfFileSpecification.FileEmbedded(iText_Stamper.Writer, 
          f.sDataFileName, s, b); 
         pfs.AddDescription(desc, true); 
         iText_Stamper.AddFileAttachment(desc, pfs); 

         PdfTargetDictionary target = new PdfTargetDictionary(true); 
         target.EmbeddedFileName = s; 
         PdfDestination dest = new PdfDestination(PdfDestination.FIT); 
         dest.AddFirst(new PdfString(desc)); 
         iTextSharp.text.pdf.PdfAction action = iTextSharp.text.pdf.PdfAction.GotoEmbedded(null, target, 
          dest, true); 
         Chunk chunk = new Chunk(desc); 
         chunk.SetAction(action); 
         iText_Stamper.Writer.Add(chunk); 

這是足夠的?我做對了嗎? 我會很樂意提供一些幫助。

+0

是什麼讓你懷疑你做錯了什麼?與你的期望有什麼不同? – mkl

+0

我跟着這個線程:[鏈接](http://stackoverflow.com/questions/16687631/attaching-files-to-a-pdf)一個適當的解決方案。看起來不錯,但我的文檔是一個類型:** Winnovative.PdfCreator。文檔** 並沒有接受塊類型的方法,但我無法完成。 –

+0

*我的文檔是一個類型:'Winnovative.PdfCreator.Document' * - 所以你正在使用來自不同pdf庫的'Document',並想知道爲什麼它的行爲不同? – mkl

回答

0

在你的代碼的主要問題是,你假設PdfWriter後代iText_Stamper.Writer可以像Document來,你可以添加使用Add法文本塊,並期望iTextSharp的自動佈局,材料。

不幸的是,類層次結構暗示這是因爲PdfWriterDocument都實現了接口IElementListener,該接口提供了一種方法bool Add(IElement element)

儘管如此,這個假設是錯誤的,類層次重疊的內部代碼重用的原因,而不是建議類似的用法; PdfWriter後代iText_Stamper.WriterAdd實現僅返回false,甚至不嘗試將給定元素添加到文檔。

特別是在頁面的情況下壓模從檢索到的底層PdfReader(並沒有添加)這個有一定道理:如果在頁面上有內容莫名其妙地散了,應該在哪裏壓模添加新的內容?它是否應該考慮現有的內容背景材料並從頂部開始?還是應該以某種方式找到一個未使用的大頁面區域並在其中繪製元素? (在新添加的頁面的情況下,雖然,壓模確實可以被編程將像一個普通PdfWriter並允許聯動與Document自動佈局的內容...)

因此,允許新的內容自動佈局,你必須告訴iTextSharp把內容放在哪裏。你可以通過這樣的ColumnText實例的方式做到這一點:

using (PdfReader reader = new PdfReader(source)) 
using (PdfStamper stamper = new PdfStamper(reader, new FileStream(result, FileMode.Create, FileAccess.Write))) 
{ 
    PdfFileSpecification pfs = PdfFileSpecification.FileEmbedded(stamper.Writer, pdfPath, pdfName, pdfBytes); 
    pfs.AddDescription(pdfDesc, true); 
    stamper.AddFileAttachment(pdfDesc, pfs); 

    PdfContentByte cb = stamper.GetOverContent(1); 
    ColumnText ct = new ColumnText(cb); 
    ct.SetSimpleColumn(30, 30, reader.GetPageSize(1).GetRight(30), 60); 

    PdfTargetDictionary target = new PdfTargetDictionary(true); 
    target.EmbeddedFileName = pdfDesc; 
    PdfDestination dest = new PdfDestination(PdfDestination.FIT); 
    dest.AddFirst(new PdfNumber(1)); 
    PdfAction action = PdfAction.GotoEmbedded(null, target, dest, true); 

    Chunk chunk = new Chunk(pdfDesc); 
    chunk.SetAction(action); 
    ct.AddElement(chunk); 
    ct.Go(); 
} 

(我用的有點更具描述性的名字比你f.sDataFileName, s, b

在layout'ing您塊的過程中,也ColumnText建立所需goto-emebedded鏈接。


順便說一句,從你的寫作嵌入文件和使用PdfAction.GotoEmbedded我以爲你附加其他PDF。如果這種假設是錯誤的,你可能想用PdfAnnotation.CreateFileAttachment代替

+0

最後我只用過 'PdfFileSpecification pfs = PdfFileSpecification.FileEmbedded(iText_Stamper.Writer, f.sDataFileName,s,b); pfs.AddDescription(desc,true); iText_Stamper.AddFileAttachment(desc,pfs);' 並且工作。 發現在 [http://stackoverflow.com/questions/27823189/add-multiple-attachments-in-a-pdf-using-itext-pdf-stamper] –

+1

*和那工作* - 你提到的塊讓我覺得您還希望能夠從頁面*內容*中打開pdf。如果這不是必需的,那麼更短的代碼塊就足夠了。 – mkl