我在PDFsharp中找不到文档来说明如何使用C#添加第2页!
例如,在VB6中我使用名为mjwPDF的PDF创建方法。表示页面已完成
objPDF.PDFEndPage
开始新页面:
objPDF.PDFNewPage
我的PDFsharp初始设置:
// Create a new PDF document
PdfDocument document = new PdfDocument();
// Create an empty page
PdfPage page = document.AddPage();
//page.Contents.CreateSingleContent().Stream.UnfilteredValue;
// Get an XGraphics object for drawing
XGraphics gfx = XGraphics.FromPdfPage(page);
不幸的是,在PDFsharp中,我无法找到如何在新页面上启动/写入。我看到这些命令但无法启动第二页。
document.AddPage();
document.InsertPage();
我已尝试过这两种方法,但我的输出继续写在第1页,而非第2页。
非常感谢任何想法。
这是实际的代码:
private void buttonPrint_Click(object sender, EventArgs e)
{
// Create a new PDF document
PdfDocument document = new PdfDocument();
// Create an empty page
PdfPage page = document.AddPage();
//page.Contents.CreateSingleContent().Stream.UnfilteredValue;
// Get an XGraphics object for drawing
XGraphics gfx = XGraphics.FromPdfPage(page);
XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);
// Create a font
XFont fontArial20 = new XFont("Arial", 20, XFontStyle.Bold, options);
XFont fontArial14 = new XFont("Arial", 14, XFontStyle.Regular, options);
XFont fontArial14Bold = new XFont("Arial", 14, XFontStyle.Bold, options);
XFont fontArial10 = new XFont("Arial", 10, XFontStyle.Regular, options);
XFont fontArial10Bold = new XFont("Arial", 10, XFontStyle.Bold, options);
XFont fontArial9 = new XFont("Arial", 9, XFontStyle.Regular, options);
XFont fontArial9Bold = new XFont("Arial", 9, XFontStyle.Bold, options);
XFont fontArial8 = new XFont("Arial", 8, XFontStyle.Regular, options);
XFont fontArial8Bold = new XFont("Arial", 8, XFontStyle.Bold, options);
XFont fontCour10 = new XFont("Courier New", 10, XFontStyle.Regular, options);
XFont fontCour10Bold = new XFont("Courier New", 10, XFontStyle.Bold, options);
XFont printFontCour8 = new XFont("Courier New", 8, XFontStyle.Regular);
XFont printFontCour8Bold = new XFont("Courier New", 8, XFontStyle.Bold);
XFont printFontCour8Italic = new XFont("Courier New", 8, XFontStyle.Italic);
XFont printFontCour10 = new XFont("Courier New", 10, XFontStyle.Regular);
XFont printFontCour10Bold = new XFont("Courier New", 10, XFontStyle.Bold);
XFont printFontCour14 = new XFont("Courier New", 14, XFontStyle.Bold);
XFont printFontCour10BoldItalic = new XFont("Courier New", 10, XFontStyle.Bold | XFontStyle.Italic);
XFont printFontArial8 = new XFont("Arial", 8, XFontStyle.Regular);
XFont printFontArial10 = new XFont("Arial", 10, XFontStyle.Regular);
XFont printFontArial10Bold = new XFont("Arial", 10, XFontStyle.Bold);
XFont printFontArial14 = new XFont("Arial", 14, XFontStyle.Bold);
// Create pen.
Pen blackPen = new Pen(Color.Black, 3);
Pen blackPen3 = new Pen(Color.Black, 3);
Pen blackPen1 = new Pen(Color.Black, 1);
Pen greyPen1 = new Pen(Color.Gray, 1);
Pen greyPen3 = new Pen(Color.Gray, 3);
Pen lightgreyPen1 = new Pen(Color.LightGray, 1);
//define margins
double leftMargin = 40.0;
double rightMargin = 570.0;
double topMargin = 20.0;
double lineTop = 0d;
double lineFooter = 780d;
double rowStep = 12d;
//double rowStep = 15d;
double newRow = topMargin + rowStep;
double beginRow = newRow;
double currentRow = beginRow;
double currentRowCol2 = 0;
double firstCustomerRow = 100d;
//double firstCustomerRow = 110d;
//float firstCustomerRow = 120;
double txtShift = 8d;
string hcString = string.Empty; //---added 6-26-13
//---top section--------------------------------------------------------
// draw the TIW Logo
Image Logo = Image.FromFile(Settings.Default.LogoPath);
gfx.DrawImage(Logo, leftMargin, topMargin);
// title & version
string textToPrint = "TIW Purchasing - Master Buy List";
gfx.DrawString(textToPrint, fontArial14Bold, Brushes.Black, leftMargin + 160, topMargin + 30);
string eiNum = listView1.Items[0].Text;
string eiDesc = listView1.Items[0].SubItems[1].Text;
string partNum = listView1.Items[0].SubItems[2].Text;
string partDesc = listView1.Items[0].SubItems[3].Text;
string price = listView1.Items[0].SubItems[4].Text;
string partType = listView1.Items[0].SubItems[5].Text;
string partQty = listView1.Items[0].SubItems[6].Text;
if (eiDesc.Length > 80)
eiDesc = eiDesc.Substring(0, 80) + "...";
textToPrint = eiNum + " - " + eiDesc;
gfx.DrawString(textToPrint, fontArial10Bold, Brushes.Black, leftMargin, topMargin + 70);
int lineInc = 70;
for (int i = 0; i < listView1.Items.Count; i++)
{
if (listView1.Items[i].Text == eiNum)
{
lineInc = lineInc + 12;
if (lineInc >= 480)
{
//PdfPage page2 = document.AddPage();
document.AddPage();
XGraphics.FromPdfPage(page);
// title & version
textToPrint = "TIW Purchasing - Master Buy List - (continued)";
gfx.DrawString(textToPrint, fontArial14Bold, Brushes.Black, leftMargin + 160, topMargin + 30);
lineInc = 70;
}
partNum = listView1.Items[i].SubItems[2].Text;
partDesc = listView1.Items[i].SubItems[3].Text;
price = listView1.Items[i].SubItems[4].Text;
partType = listView1.Items[i].SubItems[5].Text;
partQty = listView1.Items[i].SubItems[6].Text;
textToPrint = partNum;
gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 10, topMargin + lineInc);
//textToPrint = partDesc.Substring(0, 50);
textToPrint = partDesc;
gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 70, topMargin + lineInc);
textToPrint = price;
gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 450, topMargin + lineInc);
textToPrint = partType;
gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 470, topMargin + lineInc);
textToPrint = partQty;
gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 490, topMargin + lineInc);
}
else
{
lineInc = lineInc + 16;
eiNum = listView1.Items[i].Text;
eiDesc = listView1.Items[i].SubItems[1].Text;
if (eiDesc.Length > 80)
eiDesc = eiDesc.Substring(0, 80) + "...";
textToPrint = eiNum + " - " + eiDesc;
gfx.DrawString(textToPrint, fontArial10Bold, Brushes.Black, leftMargin, topMargin + lineInc);
lineInc = lineInc + 12;
partNum = listView1.Items[i].SubItems[2].Text;
partDesc = listView1.Items[i].SubItems[3].Text;
price = listView1.Items[i].SubItems[4].Text;
partType = listView1.Items[i].SubItems[5].Text;
partQty = listView1.Items[i].SubItems[6].Text;
textToPrint = partNum;
gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 10, topMargin + lineInc);
//textToPrint = partDesc.Substring(0, 20);
textToPrint = partDesc;
gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 70, topMargin + lineInc);
textToPrint = price;
gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 450, topMargin + lineInc);
textToPrint = partType;
gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 470, topMargin + lineInc);
textToPrint = partQty;
gfx.DrawString(textToPrint, fontArial10, Brushes.Black, leftMargin + 490, topMargin + lineInc);
}
}
//------ footer
DateTime dateTime = DateTime.Now;
String.Format("{0:F}", dateTime);
textToPrint = "eView " + EViewMethods.eviewVersion + " " + Environment.UserName + " " + String.Format("{0:F}", dateTime);
gfx.DrawString(textToPrint, printFontCour8Italic, Brushes.Black, leftMargin, lineFooter);
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "pdf files (*.pdf)|*.pdf|All files (*.*)|*.*";
saveFileDialog1.FilterIndex = 1;
saveFileDialog1.RestoreDirectory = true;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
document.Save(saveFileDialog1.FileName);
Process.Start(saveFileDialog1.FileName);
}
}
这是我更正后的代码:
private void createPDF()
{
// Create a new PDF document
PdfDocument document = new PdfDocument();
// Create an empty page
PdfPage page = document.AddPage();
// Get an XGraphics object for drawing
XGraphics gfx = XGraphics.FromPdfPage(page);
XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);
// Create fonts
XFont printFontArial8 = new XFont("Arial", 8, XFontStyle.Regular);
XFont printFontArial10 = new XFont("Arial", 10, XFontStyle.Regular);
XFont printFontArial10Bold = new XFont("Arial", 10, XFontStyle.Bold);
XFont printFontCour10BoldItalic = new XFont("Courier New", 10, XFontStyle.Bold | XFontStyle.Italic);
XFont printFontArial14 = new XFont("Arial", 14, XFontStyle.Bold);
XFont printFontCour8 = new XFont("Courier New", 8, XFontStyle.Regular);
// Create pen.
Pen blackPen = new Pen(Color.Black, 3);
float lineInc = 20.0f;
//--------------------------------------------
//define margins
double leftMargin = 40.0;
//double rightMargin = 570.0;
double topMargin = 20.0;
//double lineTop = 0d;
//double lineFooter = 780d;
string eiNum = string.Empty;
string eiDesc = string.Empty;
string partNum = string.Empty;
string partDesc = string.Empty;
string price = string.Empty;
string partType = string.Empty;
string partQty = string.Empty;
string thisEndItem = string.Empty;
string textToPrint = string.Empty;
int pageCounter = 0;
string filename = string.Empty;
bool morePages = true;
while (morePages)
{
if (pageCounter == 0 && counter == 0)
{
// draw image/logo
Image Logo = Image.FromFile(Settings.Default.LogoPath);
gfx.DrawImage(Logo, leftMargin, 35f);
// draw title
textToPrint = "TIW Purchasing - Master Buy List";
gfx.DrawString(textToPrint, printFontArial14, Brushes.Black, leftMargin + 160f, 54f);
// date
DateTime thisDay = DateTime.Today;
textToPrint = thisDay.ToString("d");
gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 280f, 76f);
eiNum = listView1.Items[0].Text;
eiDesc = listView1.Items[0].SubItems[1].Text;
if (eiDesc.Length > 80)
eiDesc = eiDesc.Substring(0, 80) + "...";
textToPrint = eiNum + " - " + eiDesc;
gfx.DrawString(textToPrint, printFontArial10Bold, Brushes.Black, leftMargin, topMargin + 90);
}
else if (pageCounter > 0)
{
double remainder = counter % amtperpage;
if (remainder == 0) //---means we're at the top of the page
{
//title & version
textToPrint = "TIW Purchasing - Master Buy List";
gfx.DrawString(textToPrint, printFontArial10Bold, Brushes.Black, leftMargin + 120, 54f);
textToPrint = "(continued from page " + page + ")";
gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 400, 54f);
}
}
if (pageCounter == 0)
lineInc = 90;
else
lineInc = 78;
int stop = counter + amtperpage;
if (stop > listView1.Items.Count)
stop = listView1.Items.Count;
while (counter < stop)
{
thisEndItem = listView1.Items[counter].SubItems[0].Text;
partNum = listView1.Items[counter].SubItems[2].Text;
partDesc = listView1.Items[counter].SubItems[3].Text;
price = listView1.Items[counter].SubItems[4].Text;
partType = listView1.Items[counter].SubItems[5].Text;
partQty = listView1.Items[counter].SubItems[6].Text;
if (thisEndItem == eiNum) //---still working on the same end item
{
lineInc += 12;
textToPrint = partNum;
gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 10, topMargin + lineInc);
if (partDesc.Length > 70)
partDesc = partDesc.Substring(0, 70) + "...";
textToPrint = partDesc;
gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 70, topMargin + lineInc);
textToPrint = price;
gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 600, topMargin + lineInc);
textToPrint = partType;
gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 630, topMargin + lineInc);
textToPrint = partQty;
gfx.DrawString(textToPrint, printFontArial10, Brushes.Black, leftMargin + 670, topMargin + lineInc);
}
else //---starting a new end item
{
lineInc += 16;
eiNum = listView1.Items[counter].Text;
eiDesc = listView1.Items[counter].SubItems[1].Text;
if (eiDesc.Length > 80)
eiDesc = eiDesc.Substring(0, 80) + "...";
textToPrint = eiNum + " - " + eiDesc;
gfx.DrawString(textToPrint, printFontArial10Bold, Brushes.Black, leftMargin, topMargin + lineInc);
}
counter++;
}
//---footer-------------------------------
DateTime dateTime = DateTime.Now;
textToPrint = "eView " + EViewMethods.eviewVersion + " " + Environment.UserName + " " + String.Format("{0:F}", dateTime);
gfx.DrawString(textToPrint, printFontCour8, Brushes.Black, leftMargin, 1060f);
printpagenum = pageCounter + 1;
textToPrint = printpagenum.ToString();
gfx.DrawString(textToPrint, printFontArial10Bold, Brushes.Black, leftMargin + 740, 1060f);
//----------------------------------------
if (counter == listView1.Items.Count)
{
morePages = false;
}
else
{
pageCounter++;
page = document.AddPage();
gfx = XGraphics.FromPdfPage(page);
}
}
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "pdf files (*.pdf)|*.pdf|All files (*.*)|*.*";
saveFileDialog1.FilterIndex = 1;
saveFileDialog1.RestoreDirectory = true;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
document.Save(saveFileDialog1.FileName);
Process.Start(saveFileDialog1.FileName);
}
}
答案 0 :(得分:12)
您使用
创建新页面document.AddPage();
然后致电
XGraphics.FromPdfPage(page);
获取第二页的gfx对象(可能这是缺少的步骤)。
因此,请为每个新页面重复代码示例中的步骤:
// Create an empty page
PdfPage page = document.AddPage();
// Get an XGraphics object for drawing
XGraphics gfx = XGraphics.FromPdfPage(page);
更新:在循环中执行以下操作:
document.AddPage();
XGraphics.FromPdfPage(page);
AddPage()为新创建的页面返回一个“句柄” - 您将其放入bin中。 然后你调用“XGraphics.FromPdfPage()”来为第一个页面创建另一个gfx - 你也会把它放在bin中,但是你会得到一个例外,因为第一页已经有了一个gfx。
应该做一个小小的改变:
page = document.AddPage();
gfx = XGraphics.FromPdfPage(page);
另见: http://www.pdfsharp.net/wiki/PageSizes-sample.ashx
“我从来没有想过添加第二页可能会非常困难!建议的代码没有运气。” PDFsharp包含了不少工作样本以吸引人们前进。由于您忽略了重要部分 - 方法返回的值,因此建议的代码没有运气。
答案 1 :(得分:2)
不要忘记将“canvas”或“graphics”对象变量更新到新页面:
你可能会这样做:
// First time:
this.page = document.AddPage();
this.gfx = XGraphics.FromPdfPage(page);
...
// next time (forgot to update graphics or canvas variable):
this.page = document.AddPage();
而且,应该是这样的:
// First time:
this.page = document.AddPage();
this.gfx = XGraphics.FromPdfPage(page);
...
// next time:
this.page = document.AddPage();
// update graphics object, also
this.gfx = XGraphics.FromPdfPage(page);
我也犯了这个错误。
答案 2 :(得分:-1)
您可以通过减小“Ypoint”的大小来打印多个页面,如下所示。
其给定值为“yPoint = yPoint + 40”
将其更改为“yPoint = yPoint + 8”,即在每次循环迭代中将ypoint增加+8,
回答任何疑问。 参考下面的循环
While dr.Read
username = dr.Item(0)
Action_Performed = dr.Item(1)
datetim = dr.Item(2)
graph.DrawString(username, font, XBrushes.Black, _
New XRect(40, yPoint, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft)
graph.DrawString(Action_Performed, font, XBrushes.Black, _
New XRect(280, yPoint, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft)
graph.DrawString(datetim, font, XBrushes.Black, _
New XRect(420, yPoint, pdfPage.Width.Point, pdfPage.Height.Point), XStringFormats.TopLeft)
yPoint = yPoint + 10
counter += 1
If counter = 30 Then
pdfPage = pdf.AddPage()
graph.Dispose()
graph = XGraphics.FromPdfPage(pdfPage)
font = New XFont("Verdana", 7, XFontStyle.Regular)
yPoint = 0
yPoint = yPoint + 100
counter = 0
End If
End While
Dim pdfFilename As String = "dbtopdf.pdf"
pdf.Save(pdfFilename)
Process.Start(pdfFilename)
的问候, Shivanand
答案 3 :(得分:-2)
在尝试为新页面创建新的XGraphics对象之前,请先处理旧的现有对象:
xgrObject.Dispose();