Több PDF és kép nyomtatása A4-es lapokra

Több PDF és kép nyomtatása A4-es lapokra
2014-07-05T16:15:21+02:00
2014-07-08T10:05:27+02:00
2022-12-01T08:15:41+01:00
iolah2
Sziasztok
Van egy listám a nyomtatni kivánt PDF, illetve kép(jpg, tiff,...) fileokról.
Szeretném sorban, oldalanként 6 darabot szövegdobozzal(cikkszám) kinyomtatni.
Csináltam egy c# osztályt hozzá

using PdfSharp; using PdfSharp.Drawing; using PdfSharp.Pdf; using System; using System.Collections.Generic; using System.Diagnostics; namespace Rajznyomtatás { class PdfGenerate { //http://www.codeproject.com/Articles/686994/Create-Read-Advance-//PDF-Report-using-iTextSharp-in //List<DateTime> timeInfos; // DateTime.Now; List<string> listaNev; List<string> cikkszamList; List<string> fileok; PdfDocument document; //Process p; public PdfGenerate(List<string> listam, List<string> cikkszamok, ref bool vanElem) { if (listam.Count==0) { vanElem=false; return; } fileok = new List<string>(); listaNev = listam; cikkszamList = cikkszamok; var kepekszama = listaNev.Count; int oldal= kepekszama/6; int marKepSz = kepekszama % 6; if (marKepSz != 0) ++oldal; for (int i = 0; i < oldal; i++) { if (i == oldal - 1 && marKepSz != 0) { //timeInfos.Add(DateTime.Now); GeneratePDFNow(i, marKepSz, listaNev); //timeInfos.Add(DateTime.Now); } else { //timeInfos.Add(DateTime.Now); GeneratePDFNow(i, 6, listaNev); //timeInfos.Add(DateTime.Now); } } //var aktNev = "Rajznyomt.pdf"; //document.Save(aktNev); //SendToPrinter(aktNev); //timeInfos.Add(DateTime.Now); //timeInfos.Add(DateTime.Now); } private void GeneratePDFNow(int oldalSzam, int kepSzam, List<string> listam) { document = new PdfDocument(); PdfPage page = document.AddPage(); page.Size = PageSize.A4; var heightPage = page.Height; // Obtain an XGraphics object to render to XGraphics gfx = XGraphics.FromPdfPage(page); XRect rect; // Create a font double fontHeight = 12; XFont font = new XFont("Times New Roman", fontHeight, XFontStyle.BoldItalic); for (int i = 0; i < kepSzam; i++) { rect = new XRect((i % 2) * page.Width / 2+2, ((i - (i % 2)) / 2) * heightPage / 3, page.Width / 2, fontHeight); gfx.DrawString(cikkszamList[oldalSzam * 6 + i], font, XBrushes.Black, rect, XStringFormats.TopLeft); try { gfx.DrawImage(XImage.FromFile(listam[oldalSzam * 6 + i]), (i % 2) * page.Width / 2, ((i - (i % 2)) / 2) * heightPage / 3 + rect.Height, page.Width / 2, heightPage / 3 - rect.Height); } catch { var rect2 = new XRect((i % 2) * page.Width / 2 + 8, ((i - (i % 2)) / 2) * heightPage / 3 + (heightPage/3-rect.Height)/2, page.Width / 2, fontHeight); gfx.DrawString(listam[oldalSzam * 6 + i], font, XBrushes.Black, rect2, XStringFormats.TopLeft); } } string nev = "Page" + oldalSzam+".pdf"; document.Save(nev); SendToPrinter(nev); fileok.Add(nev); #region } private void SendToPrinter(string fileName) { ProcessStartInfo info = new ProcessStartInfo(); info.Verb = "PrintTo";//"print"; info.FileName = fileName; info.CreateNoWindow = false; info.WindowStyle = ProcessWindowStyle.Hidden; Process p = new Process(); p.StartInfo = info; p.Start(); //p.WaitForExit(); p.WaitForInputIdle(); //System.Threading.Thread.Sleep(3000); System.Threading.Thread.Sleep(6000); //p.Close(); //if (false == p.CloseMainWindow()) // p.Kill(); //File.Delete(fileName); }
Sajnos Ezzel van pár problémám:

1) Minden generált pdf-et bement a program mappájába, pedig én csak nyomtatni szeretném, de a PdfDocument-re nem találtam print utasítást.
2) Nem várja meg míg az elözőt kinyomtatja, pedig logikailag sorban szeretném nyomtatni a page-eket.

3) Esetleg ha lenne Pdf generálásnál gyorsabb egyszerűbb módszer, az is érdekelne.

Köszönettel
Isti
Mutasd a teljes hozzászólást!
A reportviewer egy megjelenítő a report-okhoz.
Kreálj egy rdlc-t, szinte bármit beletehetsz..
Segíthet..(How to Create Report (RDLC) in WPF)
Mutasd a teljes hozzászólást!

  • Szia!
    Bocsi, de akkor a C# WPF projectemhez kellene adni egy Formsot és azt töltögetni, vagy félreértettem?

    Walkthrough: Printing a Local Report without Preview
    Ezt találtam abban amit küldtél, de Pdf-re is jó lehet?
    Mutasd a teljes hozzászólást!
  • Szia
    Elküldöm a pontos elképzelésem.
    Van egy listám,           Kigyüjtött lista(nem kell plusz adatbázis kapcsolat)
    Legyen pl.: 92 elem, célom hogy minden oldalra a Minta.png-hez hasonlóan (4 helyett) 6 képet vagy PDF oldalt illesszek és sorban elküldjem nyomtatni első 6, második 6 stb.




    Mint korábban írtam eddig csak pdf generálót találtam hozzá. A report-ot néztem de ott valami adatbázis kapcsolódásokat példázgat, amire most nincs szükségem.

    A gondjaim:

    1) ha pdf generálóval dolgozom, ne kelljen pdf-be mentenem, azaz mondjuk valami printdocument kellene hozzá.
    2) ha sorban elküldöm, az általam generált kezdetben megadott kóddal,
             NEM várja meg hogy az elöző pdf készítés végbemenjen és a nyomtatás elinduljon, így van hogy a 4-et hamarabb nyomtatja mint a 3-at stb.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Bocsi, de tán rossz helyen kopogtatsz, mert én WPF-ben nem vagyok igazán otthon.
    A topikod címéből még nem sejtettem a WPF-et, ezért ajánlottam a reportviewer-t, ami egyébként szvsz WPF-ben is használható (mint az adott link is jelzi), de a maga módján.
    Egy sima winform-os alkalmazásban nem kötelező a reportviewer-nek az adatbázis kapcsolat, csak legyen egy dataset amiből kiemelheti a nyomtatandókat.
    Mutasd a teljes hozzászólást!
  • Bocsi de nem teljesen értem, akkor egy reportviewer-t fel tudok tölteni 6 kép/vagy PDf formátummal valahogy, és közé szövegeket beileszteni?. Mert nekem elég lenne egy egyszerű page, vagy hasonló, ha azt föl tudom töltögetni és A4-es méretbe kinyomtatni?
    Esetleg hol találok gyorsan egy-két képes példát?
    Köszi
    Isti
    Mutasd a teljes hozzászólást!
  • A reportviewer egy megjelenítő a report-okhoz.
    Kreálj egy rdlc-t, szinte bármit beletehetsz..
    Segíthet..(How to Create Report (RDLC) in WPF)
    Mutasd a teljes hozzászólást!
  • Szia
    Megnéztem, de ha mindent nekem kell ott felépítgetnem, akkor inkább maradok a kezdeti PdfSharp Pdf készítőnél, csak ott minden pdf-et el kell tárolni. Maradnak akkor a kezdeti kérdéseim.

    Azt nem értem ez az RDLC-s dolog gyorsabb lehetne valamivel mint pdf-et készíteni és kinyomtatni, mert az összerakását nem igen találtam meg. Például hogy rakhatok bele képet, pdf-et mikor listán van az elérhetősége. Mert ez akkor lenne jó ha gyorsan megcsinál egy pár százas listából 30-40 oldalt nyomtatással
    (persze az oldal nem kell a végén).



    Köszi
    Mutasd a teljes hozzászólást!
  •  ha mindent nekem kell ott felépítgetnem

    Pontosan mire gondolsz?
    Mutasd a teljes hozzászólást!
  • Köszi a válaszokat,végül maradtam a PdfSharp-nál.
    A problémám arra generálódott, hogy ha előállítottam pdf-ek listáját(elérhetőség) és sorban nyomtatok, foreach-el, akkor Bullzip pdf generáló nyomtató keverten adja az oldalakat(Amin több a tartalom, azt késöbb, gondolom). Esetleg ezt hol érdemesmegkérdeznem, ha nem tudsz benne segíteni?
    A segítségedért megadom a pontot, remélem a jövőben annak is hasznát tudom venni.
    Mutasd a teljes hozzászólást!
  • Akkor maradt ez. 
    System.Threading.Thread.Sleep(6000);
    -Ezzel el tudtam volna érni, hogy alahogy sorban maradjon, de inkább, kinyomtatom, aztán sorba teszem őket. Ha egyoldalas akkor nemgond.

    Meg lehet hogy a Bullzip sajátossága ez a kevert nyomtatás. Mert ahogy tudom ha sima nyomtatóra küldök pdf-eket azoknak sorban kell kinyomtatódniuk.

    Köszi mindent

    using PdfSharp.Pdf; using PdfSharp.Pdf.Advanced; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; namespace Rajznyomtatás { class PdfGenerate { IList<DataSet.Alkatrészek1Row> listamAkt; //List<string> listaNev; //List<string> cikkszamList; string[] fileok; int[] fileSorszam; PdfDocument document; string currentFolder; //Process p; public PdfGenerate(IList<DataSet.Alkatrészek1Row> listam, string curFold) { //document = new PdfDocument(); currentFolder = curFold; //timeInfos = new List<DateTime>(); //timeInfos.Add(DateTime.Now); //pl cikkszam1: 900018287/1 listamAkt = listam; //listaNev = listam[0].; // cikkszamList = cikkszamok; var kepekszama = listam.Count; int oldal= kepekszama/6; int marKepSz = kepekszama % 6; if (marKepSz != 0) ++oldal; fileok = new string[oldal]; fileSorszam = new int[oldal]; //var t0 = DateTime.Now; //for (int i = 0; i < oldal; i++) for (int i = 0; i < oldal; i++) { if (i == oldal - 1 && marKepSz != 0) { GeneratePDFNow(i, marKepSz); } else { GeneratePDFNow(i, 6); } } //string nev = currentFolder + "kepek" + ".pdf";//"..\..\PdfActual\"+ //document.Save(nev); foreach (var nev in fileok) { SendToPrinter(nev); } } private void GeneratePDFNow(int oldalSzam, int kepSzam)//, List<string> listam) { // Create a new document and add a page //PdfDocument document = new PdfDocument(); //document.Info.Author = "Rolf Baxter"; //document.Info.Keywords = "PdfSharp, Examples, C#"; //vált document = new PdfDocument(); //vált PdfPage page = document.AddPage(); PdfPage page = document.AddPage(); page.Size = PageSize.A4; var heightPage = page.Height; // Obtain an XGraphics object to render to XGraphics gfx = XGraphics.FromPdfPage(page); XRect rect; // Create a font double fontHeight = 12; XFont font = new XFont("Times New Roman", fontHeight, XFontStyle.BoldItalic); DateTime t0 = DateTime.Now; for (int i = 0; i < kepSzam; i++) { rect = new XRect((i % 2) * page.Width / 2+2, ((i - (i % 2)) / 2) * heightPage / 3, page.Width / 2, fontHeight); gfx.DrawString(listamAkt[oldalSzam * 6 + i].Cikkszám, font, XBrushes.Black, rect, XStringFormats.TopLeft); try { gfx.DrawImage(XImage.FromFile(listamAkt[oldalSzam * 6 + i].Dokumentum), (i % 2) * page.Width / 2, ((i - (i % 2)) / 2) * heightPage / 3 + rect.Height, page.Width / 2, heightPage / 3 - rect.Height); } catch { var rect2 = new XRect((i % 2) * page.Width / 2 + 8, ((i - (i % 2)) / 2) * heightPage / 3 + (heightPage/3-rect.Height)/2, page.Width / 2, fontHeight); gfx.DrawString(listamAkt[oldalSzam * 6 + i].Dokumentum, font, XBrushes.Black, rect2, XStringFormats.TopLeft); } rect = new XRect( page.Width/2 - 44, heightPage-40 , 40, fontHeight); gfx.DrawString(oldalSzam.ToString() +". oldal", font, XBrushes.Black, rect, XStringFormats.TopLeft); } DateTime t1 = DateTime.Now; var tDif = t1 - t0; /*vált*/ string nev = currentFolder + oldalSzam + ".pdf";//"..\..\PdfActual\"+ document.Save(nev); //SendToPrinter(nev); // fileok[oldalSzam] =nev; fileSorszam[oldalSzam] = oldalSzam; } private void SendToPrinter(string fileName) { ProcessStartInfo info = new ProcessStartInfo(); info.Verb = "PrintTo"; info.FileName = fileName; info.CreateNoWindow = true; info.WindowStyle = ProcessWindowStyle.Hidden; Process p = new Process(); p.StartInfo = info; p.Start(); //p.WaitForExit(); p.WaitForInputIdle(); //http://bytes.com/topic/access/answers/204094-wait-pdf-printing-stop-before-next-code //System.Threading.Thread.Sleep(3000); //System.Threading.Thread.Sleep(6000); //p.Close(); //if (false == p.CloseMainWindow()) // p.Kill(); //File.Delete(fileName); } #region } }
    Mutasd a teljes hozzászólást!
  • A nyomtató spool queue-ja programból vezérelhető.
    Elvileg te kontrolálhatod a nyomtatási folyamatot.

    Keress egy PDF nyomtató komponenst, ne egy külső program futtatással nyomtass, ha kézben akarod tartani.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd