2013-03-27 104 views
3

我看着iTextSharp和SharpPDF和Report.Net以及PDFSharp。創建PDF文件?

沒有這些開源項目具有良好的文檔或不符合2012年VS工作

有沒有人有一個推薦的解決方案或能告訴我的文檔?

我的僱主阻止了很多網站,雖然Google沒有被封鎖,但一些結果是。

我打算用C#與WinForms和獲得我的數據從Access數據庫

+2

我編輯了您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-03-27 14:35:49

+0

在我從數據生成html(我在瀏覽器組件中顯示在屏幕上)之前,我已經完成了一個循環解決方案,然後使用wkhtmltopdf將該html轉換爲pdf文件。它工作得很好,但你確實使用Process.Start而不是調用DLLs方法。這意味着你不會在C#中習慣使用強健的錯誤處理。如果您有興趣,我可以舉幾個例子。 – SixOThree 2013-03-27 14:43:15

+1

iTextSharp是Java庫iText的一個端口。 iText包括幾本印刷書籍,這裏有大量的文檔。從Java到C#的翻譯非常簡單。對於幾乎每個Java中的Object.getName,你都可以在C#中使用Object.Name。 90%的代碼實際上可以直接移植。 – 2013-03-27 14:59:46

回答

3

嘿@Cocoa Dev得到這個具有不同功能的完整例子。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

using System.IO; 
using iTextSharp.text.pdf; 
using System.Data; 
using System.Text; 
using System.util.collections; 
using iTextSharp.text; 
using System.Net.Mail; 

public partial class PDFScenarios : System.Web.UI.Page 
{ 
public string P_InputStream = "~/MyPDFTemplates/ex1.pdf"; 
public string P_InputStream2 = "~/MyPDFTemplates/ContactInfo.pdf"; 
public string P_InputStream3 = "~/MyPDFTemplates/MulPages.pdf"; 
public string P_InputStream4 = "~/MyPDFTemplates/CompanyLetterHead.pdf"; 
public string P_OutputStream = "~/MyPDFOutputs/ex1_1.pdf"; 

//Read all 'Form values/keys' from an existing multi-page PDF document 
public void ReadPDFformDataPageWise() 
{ 
PdfReader reader = new PdfReader(Server.MapPath(P_InputStream3)); 
AcroFields form = reader.AcroFields; 
try 
{ 
for (int page = 1; page <= reader.NumberOfPages; page++) 
{ 
    foreach (KeyValuePair<string, AcroFields.Item> kvp in form.Fields) 
    { 
     switch (form.GetFieldType(kvp.Key)) 
     { 
      case AcroFields.FIELD_TYPE_CHECKBOX: 
      case AcroFields.FIELD_TYPE_COMBO: 
      case AcroFields.FIELD_TYPE_LIST: 
      case AcroFields.FIELD_TYPE_RADIOBUTTON: 
      case AcroFields.FIELD_TYPE_NONE: 
      case AcroFields.FIELD_TYPE_PUSHBUTTON: 
      case AcroFields.FIELD_TYPE_SIGNATURE: 
      case AcroFields.FIELD_TYPE_TEXT: 
       int fileType = form.GetFieldType(kvp.Key); 
       string fieldValue = form.GetField(kvp.Key); 
       string translatedFileName = form.GetTranslatedFieldName(kvp.Key); 
       break; 
     } 
    } 
} 
} 
catch 
{ 
} 
finally 
{ 
    reader.Close(); 
} 
} 

//Read and alter form values for only second and 
//third page of an existing multi page PDF doc. 
//Save the changes in a brand new pdf file. 
public void ReadAlterPDFformDataInSelectedPages() 
{ 
PdfReader reader = new PdfReader(Server.MapPath(P_InputStream3)); 
reader.SelectPages("1-2"); //Work with only page# 1 & 2 
using (PdfStamper stamper = new PdfStamper(reader, new FileStream(Server.MapPath(P_OutputStream), FileMode.Create))) 
{ 
    AcroFields form = stamper.AcroFields; 
    var fieldKeys = form.Fields.Keys; 
    foreach (string fieldKey in fieldKeys) 
    { 
     //Replace Address Form field with my custom data 
     if (fieldKey.Contains("Address")) 
     { 
      form.SetField(fieldKey, "MyCustomAddress"); 
     } 
    } 
    //The below will make sure the fields are not editable in 
    //the output PDF. 
    stamper.FormFlattening = true; 
} 
} 

//Extract text from an existing PDF's second page. 
private string ExtractText() 
{ 
    PdfReader reader = new PdfReader(Server.MapPath(P_InputStream3)); 
    string txt = PdfTextExtractor.GetTextFromPage(reader, 2, new LocationTextExtractionStrategy()); 
    return txt; 
} 

//Create a brand new PDF from scratch and without a template 
private void CreatePDFNoTemplate() 
{ 
    Document pdfDoc = new Document(); 
    PdfWriter writer = PdfWriter.GetInstance(pdfDoc, new FileStream(Server.MapPath(P_OutputStream), FileMode.OpenOrCreate)); 

    pdfDoc.Open(); 
    pdfDoc.Add(new Paragraph("Some data")); 
    PdfContentByte cb = writer.DirectContent; 
    cb.MoveTo(pdfDoc.PageSize.Width/2, pdfDoc.PageSize.Height/2); 
    cb.LineTo(pdfDoc.PageSize.Width/2, pdfDoc.PageSize.Height); 
    cb.Stroke(); 

    pdfDoc.Close(); 
} 

private void fillPDFForm() 
{ 
    string formFile = Server.MapPath(P_InputStream); 
    string newFile = Server.MapPath(P_OutputStream); 
    PdfReader reader = new PdfReader(formFile); 
    using (PdfStamper stamper = new PdfStamper(reader, new FileStream(newFile, FileMode.Create))) 
    { 
     AcroFields fields = stamper.AcroFields; 

     // set form fields 
     fields.SetField("name", "John Doe"); 
     fields.SetField("address", "xxxxx, yyyy"); 
     fields.SetField("postal_code", "12345"); 
     fields.SetField("email", "[email protected]"); 

     // flatten form fields and close document 
     stamper.FormFlattening = true; 
     stamper.Close(); 
    } 
} 

//Helper functions 
private void SendEmail(MemoryStream ms) 
{ 
    MailAddress _From = new MailAddress("[email protected]"); 
    MailAddress _To = new MailAddress("[email protected]"); 
    MailMessage email = new MailMessage(_From, _To); 
    Attachment attach = new Attachment(ms, new System.Net.Mime.ContentType("application/pdf")); 
    email.Attachments.Add(attach); 
    SmtpClient mailSender = new SmtpClient("Gmail-Server"); 
    mailSender.Send(email); 
} 

private void DownloadAsPDF(MemoryStream ms) 
{ 
    Response.Clear(); 
    Response.ClearContent(); 
    Response.ClearHeaders(); 
    Response.ContentType = "application/pdf"; 
    Response.AppendHeader("Content-Disposition", "attachment;filename=abc.pdf"); 
    Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length); 
    Response.OutputStream.Flush(); 
    Response.OutputStream.Close(); 
    Response.End(); 
    ms.Close(); 
} 


//Working with Memory Stream and PDF 
public void CreatePDFFromMemoryStream() 
{ 
    //(1)using PDFWriter 
    Document doc = new Document(); 
    MemoryStream memoryStream = new MemoryStream(); 
    PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream); 
    doc.Open(); 
    doc.Add(new Paragraph("Some Text")); 
    writer.CloseStream = false; 
    doc.Close(); 
    //Get the pointer to the beginning of the stream. 
    memoryStream.Position = 0; 
    //You may use this PDF in memorystream to send as an attachment in an email 
    //OR download as a PDF 
    SendEmail(memoryStream); 
    DownloadAsPDF(memoryStream); 

    //(2)Another way using PdfStamper 
    PdfReader reader = new PdfReader(Server.MapPath(P_InputStream2)); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     PdfStamper stamper = new PdfStamper(reader, ms); 
     AcroFields fields = stamper.AcroFields; 
     fields.SetField("SomeField", "MyValueFromDB"); 
     stamper.FormFlattening = true; 
     stamper.Close(); 
     SendEmail(ms); 
    } 
} 

//Burst-- Make each page of an existing multi-page PDF document 
//as another brand new PDF document 
private void PDFBurst() 
{ 
    string pdfTemplatePath = Server.MapPath(P_InputStream3); 
    PdfReader reader = new PdfReader(pdfTemplatePath); 
    //PdfCopy copy; 
    PdfSmartCopy copy; 
    for (int i = 1; i < reader.NumberOfPages; i++) 
    { 
     Document d1 = new Document(); 
     copy = new PdfSmartCopy(d1, new FileStream(Server.MapPath(P_OutputStream).Replace(".pdf", i.ToString() + ".pdf"), FileMode.Create)); 
     d1.Open(); 
     copy.AddPage(copy.GetImportedPage(reader, i)); 
     d1.Close(); 
    } 
} 



//Copy a set of form fields from an existing PDF template/doc 
//and keep appending to a brand new PDF file. 
//The copied set of fields will have different values. 
private void AppendSetOfFormFields() 
{ 
    PdfCopyFields _copy = new PdfCopyFields(new FileStream(Server.MapPath(P_OutputStream), FileMode.Create)); 
    _copy.AddDocument(new PdfReader(a1("1"))); 
    _copy.AddDocument(new PdfReader(a1("2"))); 
    _copy.AddDocument(new PdfReader(new FileStream(Server.MapPath("~/MyPDFTemplates/Myaspx.pdf"), FileMode.Open))); 
    _copy.Close(); 
} 
//ConcatenateForms 
private byte[] a1(string _ToAppend) 
{ 
    using (var existingFileStream = new FileStream(Server.MapPath(P_InputStream), FileMode.Open)) 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     // Open existing PDF 
     var pdfReader = new PdfReader(existingFileStream); 
     var stamper = new PdfStamper(pdfReader, stream); 
     var form = stamper.AcroFields; 
     var fieldKeys = form.Fields.Keys; 

     foreach (string fieldKey in fieldKeys) 
     { 
      form.RenameField(fieldKey, fieldKey + _ToAppend); 
     } 
     // "Flatten" the form so it wont be editable/usable anymore 
     stamper.FormFlattening = true; 
     stamper.Close(); 
     pdfReader.Close(); 
     return stream.ToArray(); 
    } 
} 

//Working with Image 
private void AddAnImage() 
{ 
    using (var inputPdfStream = new FileStream(@"C:\MyInput.pdf", FileMode.Open)) 
    using (var inputImageStream = new FileStream(@"C:\img1.jpg", FileMode.Open)) 
    using (var outputPdfStream = new FileStream(@"C:\MyOutput.pdf", FileMode.Create)) 
    { 
     PdfReader reader = new PdfReader(inputPdfStream); 
     PdfStamper stamper = new PdfStamper(reader, outputPdfStream); 
     PdfContentByte pdfContentByte = stamper.GetOverContent(1); 
     var image = iTextSharp.text.Image.GetInstance(inputImageStream); 
     image.SetAbsolutePosition(1, 1); 
     pdfContentByte.AddImage(image); 
     stamper.Close(); 
    } 

} 

//Add Company Letter-Head/Stationary to an existing pdf 
private void AddCompanyStationary() 
{ 
    PdfReader reader = new PdfReader(Server.MapPath(P_InputStream2)); 
    PdfReader s_reader = new PdfReader(Server.MapPath(P_InputStream4)); 

    using (PdfStamper stamper = new PdfStamper(reader, new FileStream(Server.MapPath(P_OutputStream), FileMode.Create))) 
    { 
     PdfImportedPage page = stamper.GetImportedPage(s_reader, 1); 
     int n = reader.NumberOfPages; 
     PdfContentByte background; 
     for (int i = 1; i <= n; i++) 
     { 
      background = stamper.GetUnderContent(i); 
      background.AddTemplate(page, 0, 0); 
     } 
     stamper.Close(); 
    } 
} 
+0

此代碼是否適用於.net 2.0? – Foreever 2013-09-16 22:23:09

3

嘗試this example

using iTextSharp.text; 
// Set up the fonts to be used on the pages 
private Font _largeFont = new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD, BaseColor.BLACK); 
private Font _standardFont = new Font(Font.FontFamily.HELVETICA, 14, Font.NORMAL, BaseColor.BLACK); 
private Font _smallFont = new Font(Font.FontFamily.HELVETICA, 10, Font.NORMAL, BaseColor.BLACK); 
public void Build() 
{ 
    iTextSharp.text.Document doc = null; 
    try 
    { 
     // Initialize the PDF document 
     doc = new Document(); 
     iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, 
      new System.IO.FileStream(System.IO.Directory.GetCurrentDirectory() + "\\ScienceReport.pdf", 
       System.IO.FileMode.Create)); 
     // Set margins and page size for the document 
     doc.SetMargins(50, 50, 50, 50); 
     // There are a huge number of possible page sizes, including such sizes as 
     // EXECUTIVE, LEGAL, LETTER_LANDSCAPE, and NOTE 
     doc.SetPageSize(new iTextSharp.text.Rectangle(iTextSharp.text.PageSize.LETTER.Width, 
      iTextSharp.text.PageSize.LETTER.Height)); 
     // Add metadata to the document. This information is visible when viewing the 
     // document properities within Adobe Reader. 
     doc.AddTitle("My Science Report"); 
     doc.AddCreator("M. Lichtenberg"); 
     doc.AddKeywords("paper airplanes"); 
     // Add Xmp metadata to the document. 
     this.CreateXmpMetadata(writer); 
     // Open the document for writing content 
     doc.Open(); 
     // Add pages to the document 
     this.AddPageWithBasicFormatting(doc); 
     this.AddPageWithInternalLinks(doc); 
     this.AddPageWithBulletList(doc); 
     this.AddPageWithExternalLinks(doc); 
     this.AddPageWithImage(doc, System.IO.Directory.GetCurrentDirectory() + "\\FinalGraph.jpg"); 
     // Add page labels to the document 
     iTextSharp.text.pdf.PdfPageLabels pdfPageLabels = new iTextSharp.text.pdf.PdfPageLabels(); 
     pdfPageLabels.AddPageLabel(1, iTextSharp.text.pdf.PdfPageLabels.EMPTY, "Basic Formatting"); 
     pdfPageLabels.AddPageLabel(2, iTextSharp.text.pdf.PdfPageLabels.EMPTY, "Internal Links"); 
     pdfPageLabels.AddPageLabel(3, iTextSharp.text.pdf.PdfPageLabels.EMPTY, "Bullet List"); 
     pdfPageLabels.AddPageLabel(4, iTextSharp.text.pdf.PdfPageLabels.EMPTY, "External Links"); 
     pdfPageLabels.AddPageLabel(5, iTextSharp.text.pdf.PdfPageLabels.EMPTY, "Image"); 
     writer.PageLabels = pdfPageLabels; 
    } 
    catch (iTextSharp.text.DocumentException dex) 
    { 
     // Handle iTextSharp errors 
    } 
    finally 
    { 
     // Clean up 
     doc.Close(); 
     doc = null; 
    } 
} 
+1

不錯的例子,但CreateXmpMetadata不是找到。所有以「this」開頭的代碼。 – 2013-03-27 16:34:06

+1

@CocoaDev whatsup老兄?你如何顯示一些努力,並轉到鏈接並複製粘貼CreateXmpMetadata的代碼? – CloudyMarble 2013-03-28 06:06:59

0

你可以隨時創建一個HTML頁面,然後使用wkhtmltopdf將其轉換成PDF格式。這有利於您不必使用iText等庫來構建PDF。您只需創建一個文本文件(html),然後將其傳遞給wkhtmltopdf可執行文件。

有關更多信息,請參閱Calling wkhtmltopdf to generate PDF from HTML