2013-12-10 196 views
2

我有要求將圖像轉換爲PDF與模板。我可以使用itextsharp創建一個頁面PDF。假設1圖片的1頁PDF。 問題出現在我有多個圖像。我如何使用預定義的模板創建多個PDF頁面。 以下是我的代碼:使用itextsharp將多個圖像轉換爲多頁PDF使用itextsharp

public static string CreatePDFDocument(string docname, string imagePath, string mediaField) 
    { 
     PdfReader pdfReader = null; 
     string pdfPortrait = ConfigurationManager.AppSettings["PdfPortraitTemplate"]; 
     string pdfLandscape = ConfigurationManager.AppSettings["PdfLandscapeTemplate"]; 

     iTextSharp.text.Image instanceImg = iTextSharp.text.Image.GetInstance(imagePath); 

     string filename = ConfigurationManager.AppSettings["LocalFolder"] + docname + ".pdf"; 

     FileStream pdfOutputFile = new FileStream(filename, FileMode.Create); 

     if (instanceImg.ScaledHeight >= instanceImg.ScaledWidth) 
     { 
      pdfReader = new PdfReader(pdfPortrait); 
     } 
     else 
     { 
      pdfReader = new PdfReader(pdfLandscape); 
     } 

     PdfStamper pdfStamper = null; 
     pdfStamper = new PdfStamper(pdfReader, pdfOutputFile); 

     AcroFields testForm = pdfStamper.AcroFields; 
     testForm.SetField("MediaField", mediaField); 

     PdfContentByte overContent = pdfStamper.GetOverContent(1); 
     IList<AcroFields.FieldPosition> fieldPositions = testForm.GetFieldPositions("ImageField"); 

     if (fieldPositions == null || fieldPositions.Count <= 0) throw new ApplicationException("Error locating field"); 
     AcroFields.FieldPosition fieldPosition = fieldPositions[0]; 
     iTextSharp.text.Rectangle imageRect = new Rectangle(fieldPosition.position.Top, fieldPosition.position.Left, fieldPosition.position.Bottom, fieldPosition.position.Right); 

     instanceImg.ScaleToFit(imageRect.Height, -1 * imageRect.Width); 
     instanceImg.SetAbsolutePosition(fieldPosition.position.Left, (fieldPosition.position.Top - (instanceImg.ScaledHeight))); 

     overContent.AddImage(instanceImg); 
     pdfStamper.FormFlattening = true; 

     pdfStamper.Close(); 
     pdfReader.Close(); 

     return filename; 
    } 

在此先感謝!

+1

你必須使用現有的PDF文件爲基礎的絕對要求,甚至更多重要的是,你真的需要'AcroFields'嗎?如果您只是想將圖像添加(轉換)爲PDF格式,您可以使用更少的代碼來完成,並且可以輕鬆支持多個頁面。 –

+0

@ChrisHaas,是的,我真的需要'AcroFields',因爲有一些領域需要在模板中填充圖像信息。現有的PDF很重要,因爲它是模板並具有標題。所以最後的文檔,它不僅是圖像,而且還有圖像頭部模板和一些關於圖像的信息。 –

+0

好的,很高興知道。如果你不需要'AcroFields',但想要使用模板,我可能會推薦切換到'GetUnderContent()',它允許你在模板頭部後面繪製你的圖像。您也可以使用頁面事件,如以下官方示例所示:http://itextpdf.com/examples/iia.php?id=114。但是因爲你必須處理表單字段,所以我最好建議創建多個PDF並在最後將它們合併在一起。 –

回答

3

最後我找到了解決辦法,

這是我最後的代碼

 public static string MainStamping(string docname, List<string> imagePath, string mediaField) 
     { 
      string filename = ConfigurationManager.AppSettings["LocalFolder"] + docname + ".pdf"; 

      FileStream pdfOutputFile = new FileStream(filename, FileMode.Create); 
      PdfConcatenate pdfConcatenate = new PdfConcatenate(pdfOutputFile); 

      PdfReader result = null; 

      for (int i = 0; i < imagePath.Count; i++) 
      { 
       result = CreatePDFDocument1(imagePath[i], mediaField); 
       pdfConcatenate.AddPages(result); 
      } 

      pdfConcatenate.Close(); 
      return filename; 
     } 

     public static PdfReader CreatePDFDocument1(string imagePath, string mediaField) 
     { 
      PdfReader pdfReader = null; 
      string pdfPortrait = ConfigurationManager.AppSettings["PdfPortraitTemplate"]; 
      string pdfLandscape = ConfigurationManager.AppSettings["PdfLandscapeTemplate"]; 

      iTextSharp.text.Image instanceImg = iTextSharp.text.Image.GetInstance(imagePath); 

      if ((instanceImg.ScaledHeight >= instanceImg.ScaledWidth) || (instanceImg.ScaledWidth <= 714)) 
      { 
       pdfReader = new PdfReader(pdfPortrait); 
      } 
      else 
      { 
       pdfReader = new PdfReader(pdfLandscape); 
      } 

      MemoryStream memoryStream = new MemoryStream(); 
      PdfStamper pdfStamper = new PdfStamper(pdfReader, memoryStream); 

      AcroFields testForm = pdfStamper.AcroFields; 
      testForm.SetField("MediaField", mediaField); 

      PdfContentByte overContent = pdfStamper.GetOverContent(1); 
      IList<AcroFields.FieldPosition> fieldPositions = testForm.GetFieldPositions("ImageField"); 

      if (fieldPositions == null || fieldPositions.Count <= 0) throw new ApplicationException("Error locating field"); 
      AcroFields.FieldPosition fieldPosition = fieldPositions[0]; 
      iTextSharp.text.Rectangle imageRect = new Rectangle(fieldPosition.position.Top, fieldPosition.position.Left, fieldPosition.position.Bottom, fieldPosition.position.Right); 

      instanceImg.ScaleToFit(imageRect.Height, -1 * imageRect.Width); 
      instanceImg.SetAbsolutePosition(fieldPosition.position.Left, (fieldPosition.position.Top - (instanceImg.ScaledHeight))); 

      overContent.AddImage(instanceImg); 
      pdfStamper.FormFlattening = true; 
      pdfStamper.Close(); 

      PdfReader resultReader = new PdfReader(memoryStream.ToArray()); 
      pdfReader.Close(); 

      return resultReader; 
     } 

感謝,

相關問題