2017-05-09 26 views
1

我使用下面的代碼來填充在PDF領域如下:灌裝與iTextSharp的PDF文件,然後隱藏在基層

string fileNameExisting = @"C:\Old.pdf"; 
string fileNameNew = @"C:\New.pdf"; 
using (FileStream existingFileStream = new FileStream(fileNameExisting, FileMode.Open)) 
{ 
     using (FileStream newFileStream = new FileStream(fileNameNew, FileMode.Create)) 
    { 
     Font font = FontFactory.GetFont(FontFactory.COURIER, 6f, Font.BOLD); 
     PdfReader pdfReader = new PdfReader(existingFileStream); 
     PdfStamper stamper = new PdfStamper(pdfReader, newFileStream); 
     AcroFields form = stamper.AcroFields; 
     ICollection fieldKeys = form.Fields.Keys; 
     foreach (string fieldKey in fieldKeys) 
     { 
      stamper.AcroFields.SetFieldProperty(fieldKey, "textsize", 6f, null); 
      stamper.AcroFields.AddSubstitutionFont(font.BaseFont); 
      form.SetField(fieldKey, fieldKey); //Just for testing 
     }       
     stamper.Close(); 
    } 
} 

它工作得很好,很好,但我的最終目標是有一個傳遞給此方法的布爾將決定是否呈現文檔的基礎層。 (即)如果用戶只需要渲染字段內容並隱藏「Old.pdf」的實際內容。

我查看了文檔,但它從來沒有涉及特別是這樣做,它甚至有可能嗎?

回答

1

指示是否渲染文檔的基礎層。

首先,在PDF的上下文中,術語未在說明書中定義;但如果使用它,通常會以可選內容組(OCG)的假名形式進行,因爲某些PDF處理器會這樣使用它。但由於OCG必須在內容中明確標出,因此在這裏使用它們並不合適。

你可以做什麼很容易,雖然是

  • 要麼覆蓋一些白色矩形

    using (PdfReader pdfReader = new PdfReader(input)) 
    using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(output, FileMode.Create, FileAccess.Write))) 
    { 
        for (int page = 1; page <= pdfReader.NumberOfPages; page++) 
        { 
         Rectangle pageSize = pdfReader.GetPageSize(page); 
         PdfContentByte canvas = pdfStamper.GetOverContent(page); 
         canvas.SetColorFill(BaseColor.WHITE); 
         canvas.Rectangle(pageSize.Left, pageSize.Bottom, pageSize.Width, pageSize.Height); 
         canvas.Fill(); 
        } 
    } 
    
  • 現有內容或刪除的內容作爲一個整體。

    using (PdfReader pdfReader = new PdfReader(input)) 
    { 
        for (int page = 1; page <= pdfReader.NumberOfPages; page++) 
        { 
         PdfDictionary pageDictionary = pdfReader.GetPageN(page); 
         pageDictionary.Remove(PdfName.CONTENTS); 
        } 
        using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(output, FileMode.Create, FileAccess.Write))) 
        { 
        } 
    } 
    

由於表單域不是內容的一部分,但作爲註釋懸停在它上面,你可以之前或填寫表格後也這樣做。

+0

感謝您的回答!我使用的行'PdfDictionary pageDictionary = pdfReader.GetPageN(page); Dictonary.Remove(PdfName.CONTENTS);' 它完美的工作! – Bitz

+0

雖然,我注意到沒有尺寸變化 - 無論如何! – Bitz

+0

不,沒有尺寸變化。爲什麼要有一個?我們刪除了內容,而不是尺寸。 – mkl