簡體   English   中英

Aspx到PDF iTextSharp的用法

[英]Aspx to PDF iTextSharp usage

我有此代碼,可以根據自己的需要進行合並和修改。 但是我仍然無法使其按需運行。 我制作的第一部分,它會生成PDF,並從apx頁面中選擇一個選項。 其次,我需要頁面的背景,所以我添加了下一個代碼,但是現在它僅生成第二個代碼,而不是PDF。 而且我無法將這些代碼合並在一起。

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問題。

首先讓我復制/粘貼/調整@mkl的評論:

在其中創建文檔document代碼的第一部分很有意義。 創建文檔pdfDoc的第二部分則沒有。 首先,在第一部分的末尾,您將pdf寫入響應。 該PDF已完成。 都結束了。 完成。 准備發送到瀏覽器。

您為什么認為此后在響應中寫入的任何其他內容都可能有機會與原始寫入的數據合並為正確生成的PDF?

另外:代碼的第二部分就像您要從頭開始創建新的PDF一樣; 但是您是否不想操縱在第一部分中創建的PDF?

所有這些都是正確的,但並不能解決您的問題。 它僅顯示您對PDF的深入了解。

有多種方法可以實現您想要的。 我看到您想將圖像用作新創建的PDF所有頁面的背景。 在這種情況下,您應該創建一個頁面事件,並將該圖像添加到OnEndPage()方法中所有現有內容的下方 如何將圖像添加到PDF的所有頁面的答案中對此進行了解釋

按照代碼第一部分的操作創建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);
    }
}

假設您的需求不像在后台添加圖像那么容易,那么您可以使用作為output創建的字節來創建PdfReader實例。 然后,您可以使用PdfReader創建一個PdfStamper並且可以使用PdfStamper給原始文檔加水印。 如果簡單的解決方案不能滿足您的需求,請創建一個涉及PdfReader / PdfStamper的新問題,並且不要忘記將該問題標記為iText問題。 (另外:請閱讀文檔。在iText網站上花費了大量時間。如果不咨詢的話,那是浪費時間。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM