我得到了关于打印四页"季度页面"的问题的工作答案。使用iTextSharp 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;
答案 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粗体)。
请注意,您还混合了类FontFamily
和Color
。实际上,你得到的错误信息非常自我解释。
&#34;文档没有页面&#34;错误还解释了出现了什么问题:当您BaseColor
文档时,没有添加任何内容。也许你想你已经添加了内容,但你没有。如果你认为你做了,最可能的原因是被抛出的另一个例外。例如:您使用的字体不存在。发生Close()
并忽略它。结果,没有添加任何文本,你得到一个&#34;文档没有页面&#34;错误。或者,您尝试添加IOException
,但该图像的路径是错误的。因此,没有添加任何内容,并且您得到了一个&#34;文档没有页面&#34;错误。
在您的情况下,您可能会收到该错误,因为Image
为空。在这种情况下,您创建的文档没有任何内容,因为asmList
中没有学生。