ส่วนหัวและส่วนท้ายใน ITextSharp

ฉันรู้ว่ามีคนถามคำถามนี้มาแล้วนับพันครั้ง แต่ฉันก็ยังไม่พบคำตอบที่ตรงประเด็น ฉันค่อนข้างใหม่กับ ITextSharp ดังนั้นโปรดอธิบายราวกับว่าคุณกำลังพูดคุยกับเด็กวัยหัดเดิน ฉันจะเพิ่มข้อความธรรมดาเฉพาะส่วนหัวและส่วนท้ายลงในเอกสารที่ฉันกำลังสร้างได้อย่างไร

ฉันกำลังสร้างเอกสาร PDF อย่างง่ายด้วยรหัสต่อไปนี้:

void Button1Click(object sender, EventArgs e)
    {

            Document doc = new Document(iTextSharp.text.PageSize.LEDGER, 10, 10, 42, 35);
            PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(@"File Path", FileMode.Create));

            doc.Open();
            Paragraph par1 = new Paragraph("Hello World!");
            doc.Add(par1);

            //Code to add header/footer

            doc.Close();

            MessageBox.Show("Your PDF has been created!");
    }

ฉันค้นคว้ามามากมายเกี่ยวกับวิธีเพิ่มส่วนหัวและส่วนท้าย แต่ทั้งหมดนี้เกี่ยวข้องกับกิจกรรมของหน้าที่ซับซ้อน มีวิธีที่ง่ายกว่านี้ไหม? หากไม่มี คุณช่วยอธิบายกระบวนการทีละขั้นตอนให้ฉันหน่อยได้ไหม ฉันขอขอบคุณความช่วยเหลือใด ๆ ที่พวกคุณทุกคนสามารถให้ได้ ขอบคุณ!


person 1Programming1    schedule 27.12.2015    source แหล่งที่มา
comment
คุณต้องใช้กิจกรรมหน้า แต่ก็ไม่ซับซ้อน   -  person mkl    schedule 28.12.2015
comment
คุณช่วยอธิบายกระบวนการนี้ให้ฉันทราบอย่างรวดเร็วได้ไหม?   -  person 1Programming1    schedule 28.12.2015
comment
คำตอบของ @ Bruno ทำให้คุณพอใจหรือไม่? ไม่รู้จะอธิบายยังไงดี   -  person mkl    schedule 29.12.2015


คำตอบ (1)


คุณกำลังสร้าง Document ของคุณดังนี้:

Document doc = new Document(iTextSharp.text.PageSize.LEDGER, 10, 10, 42, 35);

ซึ่งหมายความว่า คุณมีระยะขอบบนเป็นหน่วยผู้ใช้ 42 หน่วย และระยะขอบล่างเป็นหน่วยผู้ใช้ 35 หน่วย คุณสามารถใช้ระยะขอบนี้เพื่อเพิ่มเนื้อหาพิเศษในเหตุการณ์หน้าได้

เว็บไซต์อย่างเป็นทางการมีตัวอย่างมากมายและส่วนถามตอบที่ครอบคลุม มีการติดแท็กตัวอย่างและคำตอบทั้งหมด หากคุณคลิกที่แท็ก ส่วนหัว คุณจะพบตัวอย่างมากมาย

ตามที่ผู้อื่นระบุไว้แล้วในความคิดเห็น คุณต้องสร้างการใช้งาน PdfPageEvent วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการขยายคลาส PdfPageEventHelper

class MyHeaderFooterEvent : PdfPageEventHelper {
  Font FONT = new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD);

  public override void OnEndPage(PdfWriter writer, Document document) {
    PdfContentByte canvas = writer.DirectContent;
    ColumnText.ShowTextAligned(
      canvas, Element.ALIGN_LEFT,
      new Phrase("Header", FONT), 10, 810, 0
    );
    ColumnText.ShowTextAligned(
      canvas, Element.ALIGN_LEFT,
      new Phrase("Footer", FONT), 10, 10, 0
    );
  }
}

สิ่งสำคัญที่ควรรู้:

  • ห้ามมิให้เพิ่มเนื้อหาในเหตุการณ์ OnStartPage() เพิ่มส่วนหัวและส่วนท้ายของคุณเมื่อมีการเพิ่มเนื้อหาทั้งหมดลงในเพจก่อนที่ iTextSharp จะย้ายไปยังหน้าใหม่ โดยเฉพาะอย่างยิ่ง: เพิ่มเนื้อหาในเหตุการณ์ OnEndPage()
  • ห้ามมิให้เพิ่มเนื้อหาลงในออบเจ็กต์ Document ที่ส่งผ่านไปยังเหตุการณ์ วัตถุนี้สามารถใช้เพื่อวัตถุประสงค์แบบอ่านอย่างเดียวเท่านั้น

หากคุณตรวจสอบเมธอด OnEndPage() ในคลาส MyHeaderFooterEvent คุณจะเห็นว่าเราได้รับ DirectContent จากผู้เขียน และเราเพิ่มเนื้อหาให้กับ canvas นี้โดยใช้เมธอด ShowTextAligned มีหลายวิธีในการเพิ่มเนื้อหา แต่คุณถามอย่างชัดเจนถึงวิธีที่ง่ายที่สุด วิธีนี้มีข้อจำกัดแต่ทำได้ง่าย

ฉันใช้ค่าฮาร์ดโค้ดสองสามค่า: ฉันใช้ 10 เป็นค่า x สำหรับส่วนหัวและส่วนท้าย นั่นเป็นเพราะว่าคุณกำหนดระยะขอบด้านซ้ายไว้ที่ 10 หน่วยผู้ใช้ ส่วนหัวและส่วนท้ายจะชิดซ้ายกับเนื้อหาจริงที่คุณกำลังเพิ่มลงในเพจ ฉันใช้ 810 สำหรับค่า y ของส่วนหัว เนื่องจากคุณกำลังสร้างหน้า A4 โดยมีระยะขอบบนเป็น 42 พิกัด y ด้านบนของหน้าคือ 842 พิกัด y ด้านบนของระยะขอบบนคือ 842 - 42 = 800 ฉันเพิ่มหน่วยผู้ใช้ 10 หน่วยเพื่อไม่ให้ส่วนหัวของคุณยึดติดกับเนื้อหาจริง พิกัด y ด้านล่างของหน้าคือ 0 ในกรณีของคุณและพิกัด y ด้านล่างของระยะขอบใน 35 ฉันใช้ 10 สำหรับบรรทัดฐานของส่วนท้าย

คุณสร้าง wri และทันทีหลังจากสร้างอินสแตนซ์ PdfWriter นี้ คุณจะเปิดอินสแตนซ์ Document เพื่อให้กิจกรรมเพจมีผล คุณควรเพิ่มลิงก์ต่อไปนี้ก่อนที่จะเปิด Document:

wri.PageEvent = new MyHeaderFooterEvent();

ตอนนี้เมธอด OnEndPage() จะถูกเรียกใช้ทุกครั้งที่กระบวนการหลักของคุณสรุปเพจ

ข้อสำคัญ: คุณเพิ่ม //Code to add header/footer ผิดตำแหน่ง iTextSharp จะพยายามล้างเนื้อหาของหน้าโดยเร็วที่สุด หากคุณเพิ่มโค้ดเพื่อเพิ่มส่วนหัว/ส่วนท้าย หลังจาก คุณได้เพิ่มเนื้อหาแล้ว คุณจะไม่สามารถกลับไปเพิ่มส่วนหัวและส่วนท้ายให้กับหน้าที่ล้างข้อมูลไปยังสตรีมเอาต์พุตแล้วได้

person Bruno Lowagie    schedule 28.12.2015