2016-12-28 22 views
0

私はこのコードを私が必要とするようにマージして修正しました。しかし、私はまだ私が必要とするように動作させることはできません。私が作った最初の部分は、選択されたaspxページからのオプションでPDFを生成します。次に、私はページ上に背景を持つ必要があるので、次のコードを追加しましたが、今はPDFではなく2番目のコードを生成します。そして、これらのコードを一緒にマージすることはできません。Aspx to PDF iTextSharp usage

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; 
using iTextSharp.text.pdf; 

public partial class CreatePDFFromScratch : System.Web.UI.Page 
{ 
    protected void btnCreatePDF_Click(object sender, EventArgs e) 
    { 
     // Create a Document object 
      var document = new Document(iTextSharp.text.PageSize.LETTER.Rotate(), 0f, 0f, 0f, 0f); 

     // Create a new PdfWrite object, writing the output to a MemoryStream 
     var output = new MemoryStream(); 
     var writer = PdfWriter.GetInstance(document, output); 

     // Open the Document for writing 
     document.Open(); 

     // First, create our fonts.. 
     var titleFont = FontFactory.GetFont("Arial", 18, Font.BOLD); 
     var subTitleFont = FontFactory.GetFont("Arial", 14, Font.BOLD); 
     var boldTableFont = FontFactory.GetFont("Arial", 12, Font.BOLD); 
     var endingMessageFont = FontFactory.GetFont("Arial", 10, Font.ITALIC); 
     var bodyFont = FontFactory.GetFont("Arial", 12, Font.NORMAL); 

     // Add the "Northwind Traders Receipt" title 
     document.Add(new Paragraph("Northwind Traders Receipt", titleFont)); 

     // Now add the "Thank you for shopping at Northwind Traders. Your order details are below." message 
     document.Add(new Paragraph("Thank you for shopping at Northwind Traders. Your order details are below.", bodyFont)); 
     document.Add(Chunk.NEWLINE); 

     // Add the "Order Information" subtitle 
     document.Add(new Paragraph("Order Information", subTitleFont)); 

     // Create the Order Information table 
     var orderInfoTable = new PdfPTable(2); 
     orderInfoTable.HorizontalAlignment = 0; 
     orderInfoTable.SpacingBefore = 10; 
     orderInfoTable.SpacingAfter = 10; 
     orderInfoTable.DefaultCell.Border = 0; 

     orderInfoTable.SetWidths(new int[] { 1, 4 }); 
     orderInfoTable.AddCell(new Phrase("Order:", boldTableFont)); 
     orderInfoTable.AddCell(txtOrderID.Text); 
     orderInfoTable.AddCell(new Phrase("Price:", boldTableFont)); 
     orderInfoTable.AddCell(Convert.ToDecimal(txtTotalPrice.Text).ToString("c")); 

     document.Add(orderInfoTable); 

     // Add the "Items In Your Order" subtitle 
     document.Add(new Paragraph("Items In Your Order", subTitleFont)); 

     // Create the Order Details table 
     var orderDetailsTable = new PdfPTable(3); 
     orderDetailsTable.HorizontalAlignment = 0; 
     orderDetailsTable.SpacingBefore = 10; 
     orderDetailsTable.SpacingAfter = 35; 
     orderDetailsTable.DefaultCell.Border = 0; 

     orderDetailsTable.AddCell(new Phrase("Item #:", boldTableFont)); 
     orderDetailsTable.AddCell(new Phrase("Item Name:", boldTableFont)); 
     orderDetailsTable.AddCell(new Phrase("Qty:", boldTableFont)); 

     foreach (System.Web.UI.WebControls.ListItem item in cblItemsPurchased.Items) 
      if (item.Selected) 
      { 
       // Each CheckBoxList item has a value of ITEMNAME|ITEM#|QTY, so we split on | and pull these values out... 
       var pieces = item.Value.Split("|".ToCharArray()); 
       orderDetailsTable.AddCell(pieces[1]); 
       orderDetailsTable.AddCell(pieces[0]); 
       orderDetailsTable.AddCell(pieces[2]); 
      } 

     document.Add(orderDetailsTable); 


     // Add ending message 
     var endingMessage = new Paragraph("Thank you for your business! If you have any questions about your order, please contact us at 800-555-NORTH.", endingMessageFont); 
     endingMessage.SetAlignment("Center"); 
     document.Add(endingMessage); 

     document.Close(); 

     Response.ContentType = "application/pdf"; 
     Response.AddHeader("Content-Disposition", string.Format("inline;filename=Receipt-{0}.pdf", txtOrderID.Text)); 

     ///create background 

     Response.BinaryWrite(output.ToArray()); 

     Response.Cache.SetCacheability(HttpCacheability.NoCache); 

    string imageFilePath = Server.MapPath(".") + "/images/1.jpg"; 

    iTextSharp.text.Image jpg = iTextSharp.text.Image.GetInstance(imageFilePath); 

    Document pdfDoc = new Document(iTextSharp.text.PageSize.LETTER.Rotate(), 0, 0, 0, 0); 

    jpg.ScaleToFit(790, 777); 

    jpg.Alignment = iTextSharp.text.Image.UNDERLYING; 

    pdfDoc.Open(); 

    pdfDoc.NewPage();  

    pdfDoc.Add(jpg); 

    pdfDoc.Close(); 

    Response.Write(pdfDoc); 

    Response.End(); 


    } 
} 

それがiTextの問題としてタグ付けされていなかったので、私はほとんどこの質問を逃したおかげ

+1

*あなたが作った最初の部分*は意味があります。あなたが追加した次のコード*はありません。まず最初に、最初の部分の最後にpdfを書きます。それ以降の回答に追加で書かれたものが、元の書面によるデータと適切に操作されたpdfとの結合の可能性を秘めていると思われるのはなぜですか?次に、あなたのコードが最初から新しいpdfを作成するかのように、次のコードが書かれます。最初の部分で作成したpdfを操作したくないのですか? – mkl

答えて

0

あなたはdocumentは理にかなってドキュメントを作成するコードの最初の部分:

まず私が@mklのコメントを適応させる/ /ペーストをコピーしてみましょう。 文書を作成する2番目の部分pdfDocはありません。 まず最初の部分の最後に、 にpdfを書きます。そのPDFは完成です。完了した。完了しました。 ブラウザに送信する準備が整いました。

その後、 レスポンスに追加で書き込まれたものが、元の のデータを適切に生成されたPDFに結合する可能性があると思われるのはなぜですか?

また、コードの2番目の部分は、最初から新しいPDFを作成するかのように書かれた と書かれています。しかし、あなたは 最初の部分で作成されたPDFを操作したいですか?

これはすべて該当しますが、問題は解決しません。それはあなたの深いPDFの理解の欠如を明らかにするだけです。

あなたが望むものを達成するためのさまざまな方法があります。新しく作成されたPDFのすべてのページの背景としてイメージを使用したいと思っています。その場合は、ページイベントを作成し、その画像をの下に追加して、OnEndPage()メソッドのすべての既存のコンテンツを追加する必要があります。これは、ページのイベントコードの最初の部分で行われるようにPDFを作成しますが、ご紹介How can I add an image to all pages of my PDF?

への答えで説明されています。

// step 1 
Document document = new Document(); 
// step 2 
PdfWriter writer = PdfWriter.GetInstance(document, stream); 
MyEvent event = new MyEvent(); 
writer.PageEvent = event; 
// step 3 
document.Open(); 
// step 4 
// Add whatever content you want to add 
// step 5 
document.Close(); 

MyEventクラスがどのようなものですが、あなたは頼むかもしれませんか?まあ、それはあなたがこのように自分で作成したクラスです。

protected class MyEvent : PdfPageEventHelper { 

    Image image; 

    public override void OnOpenDocument(PdfWriter writer, Document document) { 
     image = Image.GetInstance(Server.MapPath("~/images/background.png")); 
     image.SetAbsolutePosition(0, 0); 
    } 

    public override void OnEndPage(PdfWriter writer, Document document) { 
     writer.DirectContent.AddImage(image); 
    } 
} 

は、あなたがPdfReaderインスタンスを作成するためにoutputとして作成されたバイトを使用することができ、あなたの要件は、バックグラウンドで画像を追加するのと同じくらい簡単ではないと仮定する。 PdfReaderを使用してPdfStamperを作成し、PdfStamperを使用して元の文書に透かしを入れることができます。単純な解決策があなたのニーズを満たしていない場合は、PdfReader/PdfStamperという新しい質問を作成し、その質問にiText質問としてタグを付けることを忘れないでください。 (また、文書を読んでください。iTextのWebサイトに多くの時間を費やしました。あなたがそれを調べていないと、その時間は無駄でした)。