如何使用此代码生成PDF文件时增加字体大小?

时间:2016-04-03 02:26:42

标签: c# pdf fonts itextsharp

我得到了关于打印四页"季度页面"的问题的工作答案。使用iTextSharp here在一个完整大小的页面上显示部分。

问题是印刷品有点微不足道;这是页面上半部分的一个示例 - 您可以看到打印的小小以及可用的额外空间:

enter image description here

这是根据迄今为止链接的SO帖子提供的答案使用的代码:

public static void PrintSlips(List<AssignmentStudentMashup> asmList)
{
    PdfReader reader = new PdfReader(GetMasterDocument(asmList));
    Rectangle pageSize = reader.GetPageSize(1);
    string printedDate = DateTime.Now.ToShortDateString();
    printedDate = printedDate.Replace("/", "_");
    string printedSlipsFile = $"C:\\AYttFMApp\\AYttFMSlips_{printedDate}.pdf";

    // Delete the file if it exists.
    if (File.Exists(printedSlipsFile))
    {
        File.Delete(printedSlipsFile);
    }

    using (FileStream stream = new FileStream(
        printedSlipsFile,
        FileMode.Create,
        FileAccess.Write))
    {
        using (Document document = new Document(pageSize, 0, 0, 0, 0)) // pageSize could be replaced with "A4"
        {
            PdfWriter writer = PdfWriter.GetInstance(document, stream);
            document.Open();
            PdfPTable table = new PdfPTable(2)
            {
                TotalWidth = pageSize.Width,
                LockedWidth = true
            };
            table.DefaultCell.Border = Rectangle.NO_BORDER;
            table.DefaultCell.FixedHeight = pageSize.Height / 2;

            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                PdfImportedPage page = writer.GetImportedPage(reader, i);
                table.AddCell(Image.GetInstance(page));
            }
            document.Add(table);
        }
    }
}

internal static byte[] GetMasterDocument(List<AssignmentStudentMashup> asmList)
{
    int count = asmList.Count;
    using (var stream = new MemoryStream())
    {
        using (var document = new Document())
        {
            PdfWriter.GetInstance(document, stream);
            document.Open();
            for (int i = 1; i < count; ++i)
            {
                document.Add(new Paragraph(
                    $@"WeekOfAssignment: {asmList[i].WeekOfAssignment}
                      TalkTypeName: {asmList
                        [i].TalkTypeName}
                      StudentFullname: {asmList[i]
                            .StudentFullname}
                      AssistantFullname: {asmList[i]
                                .AssistantFullname}
                      CounselPointNum: {asmList[i]
                                    .CounselPointNum}
                      CounselPointStr: {asmList[i
                                        ].CounselPointStr}"));
                if (i < count) document.NewPage();
            }
        }
        return stream.ToArray();
    }
}

我认为增加字体的位置会出现在GetMasterDocument()中,但我不知道在哪里/做什么。另外,我想加粗每一行的第一部分(&#34;:&#34;之前的部分)。

更新

我从他提供的链接中尝试了Agus Rdz的建议:

BaseFont bfCourier = BaseFont.CreateFont(BaseFont.COURIER, BaseFont.CP1252, false);
Font courier = new Font(bfCourier, 12, Font.BOLD, Color.Black);
. . .
CounselPointStr: {asmList[i
    //].CounselPointStr}"));
      ].CounselPointStr}", courier));

......但是那不会编译;我明白了:

错误CS1503参数1:无法转换为&#39; iTextSharp.text.pdf.BaseFont&#39; to&#39; iTextSharp.text.Font.FontFamily&#39;

...和

错误CS1503参数4:无法转换为&#39; System.Drawing.Color&#39; to&#39; iTextSharp.text.BaseColor&#39; AYttFMScheduler

所以我根据添加到该博客帖子的评论尝试了这个:

Font fMSGothic = FontFactory.GetFont("MS-PGothic", BaseFont.IDENTITY_H, 16);
. . .
CounselPointStr: {asmList[i
    //].CounselPointStr}"));
      ].CounselPointStr}", courier));

...编译,但是我得到了一个I / O异常,更具体地来说&#34; 文档没有页面&#34;

1 个答案:

答案 0 :(得分:1)

这是错误的:

/imports

在第一行中,您将创建一个BaseFont bfCourier = BaseFont.CreateFont(BaseFont.COURIER, BaseFont.CP1252, false); Font courier = new Font(bfCourier, 12, Font.BOLD, Color.Black); 对象。您可以使用该对象创建BaseFont,如下所示:

Font

如果您希望字体为粗体,可以像这样创建Font courier = new Font(bfCourier, 12);

BaseFont

您遇到的错误是由BaseFont bfCourier = BaseFont.CreateFont(BaseFont.COURIER_BOLD, BaseFont.CP1252, false); 也可以以不同方式创建的事实引起的:

Font

您混淆了Font courier = new Font(Font.FontFamily.COURIER, 12, Font.BOLD, BaseColor.BLACK); BaseFont的概念。字体系列(例如Courier)是由不同字体组成的字体系列(Courier regular,Courier bold,Courier italic,Courier bold-italic)。基本字体是单个字体(例如Courier粗体)。

请注意,您还混合了类FontFamilyColor。实际上,你得到的错误信息非常自我解释。

&#34;文档没有页面&#34;错误还解释了出现了什么问题:当您BaseColor文档时,没有添加任何内容。也许你你已经添加了内容,但你没有。如果你认为你做了,最可能的原因是被抛出的另一个例外。例如:您使用的字体不存在。发生Close()并忽略它。结果,没有添加任何文本,你得到一个&#34;文档没有页面&#34;错误。或者,您尝试添加IOException,但该图像的路径是错误的。因此,没有添加任何内容,并且您得到了一个&#34;文档没有页面&#34;错误。

在您的情况下,您可能会收到该错误,因为Image为空。在这种情况下,您创建的文档没有任何内容,因为asmList中没有学生。