如何使用 iTextSharp 将四个 "quarter pages" 组合成一个全尺寸页面?
How can I combine four "quarter pages" into one fullsize page using iTextSharp?
我想在单个 PDF 页面上创建四个重复 "templates"。每个季度页面中的 "static" 信息将是相同的,但每个季度的内容都会有所不同。您可以将其视为四个 "copies" 登录表单或类似表单,但以编程方式添加条目,例如:
Real name: B. Clay Shannon
User name: Radicalia
Password: thatDarnedKatzenjammer
Email address: clay@pigeon.com
Real name: Albert L.B. Kollenborn
User name: Grandpa
Password: caseyJonesBigBrother1907
Email address: princealbertinacan@balpeenhammer.org
(右边还有两个)
我有创建文档并添加段落的代码,如下所示:
using (var ms = new MemoryStream())
{
using (var doc = new Document(PageSize.A4, 25, 25, 25, 25))
{
using (var writer = PdfWriter.GetInstance(doc, ms))
{
doc.Open();
Paragraph realName = new Paragraph("Real name:",
times16BoldCyan);
doc.Add(realName);
. . .
这种事情对于"normal"页面是有效的,但是在上面描述的场景中(四个四分之一的页面塞进一个页面),我应该怎么做呢?应该是这样的:
using (var msNorthWestQuadrant = new MemoryStream())
{
using (var docNorthWestQuadrant = new Document(PageSize.A4, 6.25,
6.25, 6.25, 6.25))
{
using (var writer = PdfWriter.GetInstance(docNorthWestQuadrant,
msNorthWestQuadrant))
{
docNorthWestQuadrant.Open();
Paragraph realName = new Paragraph("Real name:",
times16BoldCyan);
docNorthWestQuadrant.Add(realName);
. . .
using (var msNorthEastQuadrant = new MemoryStream())
{
using (var docNorthEastQuadrant = new Document(PageSize.A4,
12.5, 12.5, 6.25, 6.25))
{
using (var writer =
PdfWriter.GetInstance(docNorthEastQuadrant, msNorthEastQuadrant))
{
docNorthEastQuadrant.Open();
Paragraph realName = new Paragraph("Real name:",
times16BoldCyan);
docNorthEastQuadrant.Add(realName);
. . .
(等等 - 还有 SouthEastQuadrant 和 SouthEastQuadrant?)
...或者这是错误的方法?如果是,我需要的 PageSize locations/sizes 的精确值是多少(上面的“1.25”只是一个疯狂的猜测)。
更新
或者我需要一个 "master" 文档对象,然后像这样(伪代码)添加四个 "sub" 文档对象:
using (var doc = new Document(PageSize.A4, 25, 25, 25, 25))
using (var docNorthwest = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
. . .
docNorthwest.Add(par);
doc.Add(docNorthwest);
. . .
using (var docSouthwest = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
docSouthwest.Add(par2);
doc.Add(docSouthwest);
. . .
using (var docSoutheast = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
docSoutheast.Add(par3);
doc.Add(docSoutheast);
. . .
using (var docNortheast = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
docNortheast.Add(par2);
doc.Add(docNortheast);
. . .
从上面的描述中,一个简单的方法来实现你的目标:
- 在内存中创建一个
Document
- 将重复的内容放在
Document
的不同页面上
- 使用
PdfPTable
将原始 Document
中的各个页面转储到新的 Document
中
首先,上面步骤1-2的一些测试数据:
byte[] GetMasterDocument(int 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(string.Format(
@"Real name: real-name-{0:D4}
User name: user-name-{0:D4}
Password: password-{0:D4}
Email address: email-{0:D4}@invalid.com",
i)));
if (i < count) document.NewPage();
}
}
return stream.ToArray();
}
}
将重复的内容转储到输出文件中:
PdfReader reader = new PdfReader(GetMasterDocument(38));
Rectangle pageSize = reader.GetPageSize(1);
using (FileStream stream = new FileStream(
outputFile,
FileMode.Create,
FileAccess.Write))
{
using (Document document = new Document(pageSize, 0, 0, 0, 0))
{
PdfWriter writer = PdfWriter.GetInstance(document, stream);
document.Open();
PdfPTable table = new PdfPTable(2);
table.TotalWidth = pageSize.Width;
table.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);
}
}
如果重复内容和上面一样小,并且有太多空白 space,(页面缩放以适合 PdfPCell
)在 GetMasterDocument()
中设置较小的页面大小。 PageSize.A6
与上面的示例数据配合得很好:
我想在单个 PDF 页面上创建四个重复 "templates"。每个季度页面中的 "static" 信息将是相同的,但每个季度的内容都会有所不同。您可以将其视为四个 "copies" 登录表单或类似表单,但以编程方式添加条目,例如:
Real name: B. Clay Shannon
User name: Radicalia
Password: thatDarnedKatzenjammer
Email address: clay@pigeon.com
Real name: Albert L.B. Kollenborn
User name: Grandpa
Password: caseyJonesBigBrother1907
Email address: princealbertinacan@balpeenhammer.org
(右边还有两个)
我有创建文档并添加段落的代码,如下所示:
using (var ms = new MemoryStream())
{
using (var doc = new Document(PageSize.A4, 25, 25, 25, 25))
{
using (var writer = PdfWriter.GetInstance(doc, ms))
{
doc.Open();
Paragraph realName = new Paragraph("Real name:",
times16BoldCyan);
doc.Add(realName);
. . .
这种事情对于"normal"页面是有效的,但是在上面描述的场景中(四个四分之一的页面塞进一个页面),我应该怎么做呢?应该是这样的:
using (var msNorthWestQuadrant = new MemoryStream())
{
using (var docNorthWestQuadrant = new Document(PageSize.A4, 6.25,
6.25, 6.25, 6.25))
{
using (var writer = PdfWriter.GetInstance(docNorthWestQuadrant,
msNorthWestQuadrant))
{
docNorthWestQuadrant.Open();
Paragraph realName = new Paragraph("Real name:",
times16BoldCyan);
docNorthWestQuadrant.Add(realName);
. . .
using (var msNorthEastQuadrant = new MemoryStream())
{
using (var docNorthEastQuadrant = new Document(PageSize.A4,
12.5, 12.5, 6.25, 6.25))
{
using (var writer =
PdfWriter.GetInstance(docNorthEastQuadrant, msNorthEastQuadrant))
{
docNorthEastQuadrant.Open();
Paragraph realName = new Paragraph("Real name:",
times16BoldCyan);
docNorthEastQuadrant.Add(realName);
. . .
(等等 - 还有 SouthEastQuadrant 和 SouthEastQuadrant?)
...或者这是错误的方法?如果是,我需要的 PageSize locations/sizes 的精确值是多少(上面的“1.25”只是一个疯狂的猜测)。
更新
或者我需要一个 "master" 文档对象,然后像这样(伪代码)添加四个 "sub" 文档对象:
using (var doc = new Document(PageSize.A4, 25, 25, 25, 25))
using (var docNorthwest = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
. . .
docNorthwest.Add(par);
doc.Add(docNorthwest);
. . .
using (var docSouthwest = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
docSouthwest.Add(par2);
doc.Add(docSouthwest);
. . .
using (var docSoutheast = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
docSoutheast.Add(par3);
doc.Add(docSoutheast);
. . .
using (var docNortheast = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
docNortheast.Add(par2);
doc.Add(docNortheast);
. . .
从上面的描述中,一个简单的方法来实现你的目标:
- 在内存中创建一个
Document
- 将重复的内容放在
Document
的不同页面上
- 使用
PdfPTable
将原始
Document
中的各个页面转储到新的 Document
中
首先,上面步骤1-2的一些测试数据:
byte[] GetMasterDocument(int 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(string.Format(
@"Real name: real-name-{0:D4}
User name: user-name-{0:D4}
Password: password-{0:D4}
Email address: email-{0:D4}@invalid.com",
i)));
if (i < count) document.NewPage();
}
}
return stream.ToArray();
}
}
将重复的内容转储到输出文件中:
PdfReader reader = new PdfReader(GetMasterDocument(38));
Rectangle pageSize = reader.GetPageSize(1);
using (FileStream stream = new FileStream(
outputFile,
FileMode.Create,
FileAccess.Write))
{
using (Document document = new Document(pageSize, 0, 0, 0, 0))
{
PdfWriter writer = PdfWriter.GetInstance(document, stream);
document.Open();
PdfPTable table = new PdfPTable(2);
table.TotalWidth = pageSize.Width;
table.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);
}
}
如果重复内容和上面一样小,并且有太多空白 space,(页面缩放以适合 PdfPCell
)在 GetMasterDocument()
中设置较小的页面大小。 PageSize.A6
与上面的示例数据配合得很好: