เหตุใดการปรับแต่งแบบอักษร PDF ของฉันโดยใช้ iTextSharp จึงล้มเหลว

ฉันต้องการตกแต่งย่อหน้าต่างๆ ในไฟล์ PDF โดยทำให้ข้อความเป็นตัวหนา ใช้แบบอักษรและสีที่แตกต่างกัน ฉันคิดว่าฉันพบโค้ดสำหรับวิธีการทำเช่นนั้นแล้ว (ด้านล่าง) แต่มันใช้งานไม่ได้ - ข้อความทั้งหมดมีแบบอักษร สี (สีดำ) และขนาดเหมือนกัน เหตุใดความพยายามเสมือนจริงของฉันในการปรับแต่งไฟล์ PDF ให้ดูไร้ประโยชน์? นี่คือรหัสของฉัน:

using (var ms = new MemoryStream())
{

    using (var doc = new Document(PageSize.A4, 50, 50, 25, 25))
    {
        using (var writer = PdfWriter.GetInstance(doc, ms))
        {
            doc.Open();

            // Mimic the appearance of Duckbill_Platypus.pdf
            var docTitle = new Paragraph("Duckbilled Platypi - they're not what's for dinner");
            var titleFont = FontFactory.GetFont("Courier", 18, BaseColor.BLACK);
            docTitle.Font = titleFont;
            doc.Add(docTitle);

            var subTitle = new Paragraph("Baby, infant, toddler, and perhaps 'Terrible 2s' Platypi are called Platypups");
            var subtitleFont = FontFactory.GetFont("Times Roman", 13, BaseColor.BLACK);
            subTitle.Font = subtitleFont;
            doc.Add(subTitle);

            var importantNotice = new Paragraph("Teenage platypi are sometimes called Platydude[tte]s");
            var importantNoticeFont = FontFactory.GetFont("Courier", 13, BaseColor.RED);
            importantNotice.Font = importantNoticeFont;
            doc.Add(importantNotice);

            ListColumns lc;
            for (int i = 0; i < listOfListItems.Count; i++)
            {
                lc = listOfListItems[i];
                sb.AppendLine(String.Format(@"<p>Request date is {0}; Payee Name is {1}; Remit Address or Mail Stop is {2}; Last 4 of SSN or ITIN is {3}; 204 Submitted or on file is {4}; Requester Name is {5}; Dept or Div Name is {6}; Phone is {7}; Email is {8}</p>",
                    lc.li_requestDate, lc.li_payeeName, lc.li_remitAddressOrMailStop, lc.li_last4SSNDigitsOrITIN, lc.li_204SubmittedOrOnFile, lc.li_requesterName, lc.li_deptDivName, lc.li_phone, lc.li_email));
            }

            String htmlToRenderAsPDF = sb.ToString();

            //XMLWorker also reads from a TextReader and not directly from a string
            using (var srHtml = new StringReader(htmlToRenderAsPDF))
            {
                XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml);
            }

            doc.Close();
        }
    }
    try
    {
        var bytes = ms.ToArray();
        var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "iTextSharpTest.pdf");
        File.WriteAllBytes(testFile, bytes);
    }
    catch (Exception ex)
    {
        String exMsg = ex.Message;
        ; // what is "ex" here?
    }

ฉันกำลังตั้งค่าแบบอักษรสองขนาด (18 และ 13) สองสี (สีดำและสีแดง) สองแบบอักษร ("Courier" และ "Times Roman") แต่การเดินทางหลายชั่วโมงของฉันที่นี่เพื่อการแปลงไฟล์ PDF ดูเหมือนจะไร้ประโยชน์ (ขออภัย ถึงวาเชล ลินด์ซีย์ และอับราฮัม ลินคอล์น)


person B. Clay Shannon    schedule 08.04.2015    source แหล่งที่มา


คำตอบ (1)


คุณควรใช้แบบอักษรเมื่อสร้าง Paragraph:

Font f = new Font(FontFamily.COURIER);
Paragraph p = new Paragraph("text", f);
document.add(p);

หรือคุณควรรอเพื่อเพิ่มเนื้อหาจนกว่าคุณจะตั้งค่าแบบอักษร:

Paragraph p = new Paragraph();
Font f = new Font(FontFamily.COURIER);
p.setFont(f);
p.addText("text");
document.add(p);

ในโค้ดของคุณ คุณมีลักษณะดังนี้:

Paragraph p = new Paragraph("text");
Font f = new Font(FontFamily.COURIER);
p.setFont(f);
document.add(p);

เมื่อตั้งค่าแบบอักษรโดยใช้ setFont() คุณจะต้องตั้งค่าแบบอักษรสำหรับข้อความที่จะเพิ่มในย่อหน้า ไม่ใช่ให้กับข้อความที่จัดเก็บไว้ในย่อหน้าแล้ว

ตัวอย่างเช่น:

Paragraph p = new Paragraph("font 1 ");
p.setFont(new Font(FontFamily.COURIER);
p.add("font 2");
document.add(p);

สิ่งนี้จะเพิ่มข้อความ font 1 ในแบบอักษรเริ่มต้นและ font 2 ใน Courier

person Bruno Lowagie    schedule 08.04.2015
comment
ฉันไม่เห็นประเด็นแรกของคุณ ในแต่ละกรณี ฉันจะสร้างย่อหน้า จากนั้นจึงสร้างแบบอักษร จากนั้นกำหนดแบบอักษรให้กับย่อหน้า ก่อนที่จะเพิ่มย่อหน้าลงในเอกสาร ถ้าฉันประกาศและไม่ใช้อะไรบางอย่าง ฉันจะได้รับคำเตือนเกี่ยวกับเรื่องนั้น ฉันค่อนข้างแน่ใจ - person B. Clay Shannon; 08.04.2015
comment
หากคุณไม่เพิ่มเนื้อหาลงใน Paragraph หลังจากตั้งค่าแบบอักษร แสดงว่าคุณไม่ได้ใช้แบบอักษรนั้นจริงๆ... - person Bruno Lowagie; 08.04.2015
comment
ตอนนี้ฉันเห็นว่าฉันมองข้ามบางสิ่งบางอย่างในคำถามของคุณ ฉันจะอัปเดตคำตอบของฉันตามนั้น - person Bruno Lowagie; 09.04.2015