PDFsharp - Comment créer un 2ème page
Je ne peux pas trouver de la documentation dans PDFsharp à montrer comment ajouter une 2ème page à l'aide de C#!
Par exemple, plus de en VB6, j'utilise une méthode de création de fichiers PDF appelé mjwPDF. Pour indiquer que la page est fini
objPDF.PDFEndPage
Et de commencer une nouvelle page:
objPDF.PDFNewPage
Mon PDFsharp paramètres initiaux:
//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);
Malheureusement dans PDFsharp je ne peux pas savoir comment démarrer/écrire sur une nouvelle page. Je vois ces commandes, mais ne peut pas obtenir une deuxième page commencé.
document.AddPage();
document.InsertPage();
J'ai essayé les deux, mais ma sortie continue à écrire sur la page 1, page 2.
Toutes les idées seraient grandement appréciés.
Voici le code:
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);
}
}
Voici mon code corrigé:
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);
}
}
Voici le code en question:
OriginalL'auteur Bob T | 2014-01-15
Vous devez vous connecter pour publier un commentaire.
Vous créez une nouvelle page avec
et ensuite appeler
pour obtenir un gfx objet de la deuxième page (c'est probablement l'étape manquante).
Donc, répétez les étapes à partir de l'exemple de code pour chaque nouvelle page:
Mise à jour: Dans votre boucle, vous procédez de la manière suivante:
AddPage() renvoie une "poignée" de la page nouvellement créée - qui de vous jeter dans la poubelle.
Puis vous appelez "XGraphics.FromPdfPage()" pour créer encore une autre gfx pour la première page que vous avez également la jeter à la poubelle, mais vous obtenez une exception, puisqu'il y a déjà un gfx pour la première page.
Un petit changement devrait faire l'affaire:
Voir aussi:
http://www.pdfsharp.net/wiki/PageSizes-sample.ashx
"Je n'ai jamais rêvé d'en ajouter un deuxième page pourraient être si difficile! Pas de chance avec la suggestion de code".
PDFsharp comprend tout à fait un peu de travail échantillons pour avoir des gens qui vont. Pas de chance avec la suggestion de code depuis que vous avez ignoré la partie importante: les valeurs renvoyées par les méthodes.
Maintenant, je vais essayer de trouver comment se débarrasser de la XGraphics.
Je n'ai jamais rêvé d'en ajouter un deuxième page pourraient être si difficile! Pas de chance avec la suggestion de code.
Mise à jour de ma réponse.
PDFsharp est livré avec MigraDoc. Avec MigraDoc vous ajouter les Paragraphes de votre Document, puis laissez MigraDoc ajouter des sauts de page lors de la création d'un fichier PDF. PDFsharp est le faible niveau de l'outil qui vous donne le plein contrôle - mais vous avez aussi d'ajouter des sauts de ligne et les sauts de page. pdfsharp.net/wiki/MigraDocSamples.ashx
OriginalL'auteur Vive la déraison
Ne pas oublier de mettre à jour votre "toile" ou "graphique" variable objet de la nouvelle page:
Vous pouvez faire quelque chose comme ceci:
Et, il doit être quelque chose comme:
J'ai aussi fait cette erreur.
OriginalL'auteur umlcat
vous pouvez imprimer en plusieurs pages par la diminution de la taille de "Ypoint" comme indiqué ci-dessous de code.
sa valeur donnée est "yPoint = yPoint + 40"
changer pour "yPoint = yPoint + 8" je.e incrément ypoint de +8 à chaque itération de boucle,
réponse pour tous les doutes.
reportez-vous alors que la boucle ci-dessous
ce qui concerne,
Shivanand
OriginalL'auteur Shivanand
Avant d'essayer de créer un nouveau XGraphics objet de la nouvelle page, jetez l'ancien objet existant:
Merci beaucoup pour la technique! Il semble que lorsque je créer un nouveau gfx il doit être un nom différent, c'est à dire, gfx, gfx1, gfx2,...etc. Ce programme pourrait rencontrer une énorme liste qui exigerait beaucoup de gfx1-gfx100. Il serait difficile de le faire par programmation (sp?) créer le nouveau gfx est parce que je ne pense pas que vous pouvez déclarer une nouvelle "XGraphics gfx = Xgraphics.FromPdfPage(page);" d'où je utiliser un nom de variable pour le nouveau gfx. Si je suis la lecture de votre commentaire correctement, vous pourriez être en train de me dire que le xgrObject.Dispose() me permet de réutiliser le même "gfx" lors de la déclaration de un nouveau!?!
Au lieu d'écrire "XGraphics gfx = Xgraphics.FromPdfPage(page);" vous pouvez simplement écrire "gfx = Xgraphics.FromPdfPage(page);" et la ré-utilisation de la variable que vous avez déjà. Voir la réponse ci-dessus: "Dispose()" n'est pas le problème, vous vous trompez "page" de l'objet et de la tentative de créer un deuxième gfx pour la première page où vous devez créer le premier gfx pour la deuxième page.
Je suis embourbé avec un problème différent et n'ont pas été en mesure de retourner à ce problème encore. Je vais revenir ce week-end et à essayer vos techniques.
OriginalL'auteur Vicky P