Win

Generiranje .pdf kopije dokumenta

Kreirano: Ponedjeljak, 21 Ožujak 2016 Ažurirano: Utorak, 19 Ožujak 2019

Generiranje pozadinske Elektronska (pdf) dokumentacija ima dvije funkcije: U aktualnom periodu, za reprint dokumenta i za arhiviranje nakon završetka poslovne godine. Više je načina za realizaciju tog cilja:

1. Generiranje PdfDokument paralelno sa PrintDocument znači duplo koda i duplo održavanja, pa je u startu odbačeno.

2. Korištenjem PdfCreatora, je najjednostavnije riješenje ali ima dosta nedostataka: 
- Knjigovodstveni program je vezan na neki drugi vanjski program, što komplicira instalaciju. Veza je isključivo na određenu verziju tako da morate paziti i da ne dođe do nadogradnje nove verzije. 
- Kod ispada, morate posebno paziti da se PdfCreator zatvori. 
- nemate kontrolu nad kodom, a kopija koju proizvodi nije identična originalu. Kod štampanja u raster (naljepnice) dolazi do pomaka u odnosu na original.

3. Vlastito riješenje. Bazira se na PrintDocumentu, tako da se napravi print preview, a zatim se slika stranice upisuje u PdfDocument, iz kojeg se kreira .pdf file.

Za ovo riješenje potrebno je napisati pojednostavljeni PdfWriter. Pojednostavljeni jer PdfDocumenta sadrži samo par objekata (malo teksta i image stranice izvještaja). Glavni konstruktor PdfDocumenta bi izgledao ovako:

    // PDF document constructor - generira dokument A4 (210 * 297) u px (1/72 inch) 
   public PdfDocument(String FileName) 
   { 
            // Veličina stranice je A4 (px jedinice) 
            PageSize = new SizeD(21.0 * 72 / 2.54, 29.7 * 72 / 2.54);// A4 

            // PDF document glavni Catalog objekata 
            CatalogObject = new PdfObject(this, ObjectType.Dictionary, "/Catalog"); 

            // dodavanje viewer preferences 
            CatalogObject.Dictionary.Add("/ViewerPreferences", "<</PrintScaling/None>>"); 

            // Izvorni objekt za sve stranice 
            PagesObject = new PdfObject(this, ObjectType.Dictionary, "/Pages"); 

            // dodavanje indirektne reference na stranice u catalog objektu 
            CatalogObject.Dictionary.AddIndirectReference("/Pages", PagesObject); 

            // document id 
            DocumentID = RandomByteArray(16); 

            // save file name 
            this.FileName = FileName; 

            // convert stream to binary writer 
            PdfFile = new PdfBinaryWriter(new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.None)); 

            // upis broja verzije PDF  
            PdfFile.WriteString("%PDF-1.7\n"); 

            // dodati ovaj comment da se kaže kompress programu ga je to binary file 
            PdfFile.WriteString("%\u00b5\u00b5\u00b5\u00b5\n"); 

            // izlaz 
            return; 
        }//-----------------------------------------------------------------

Cijela priča (myPdfWriter.cs) ima oko 1250 linija koda, što i nije tako puno za posao koji obavlja.

Sa druge strane, iz PrintDocument treba izvući sadržaj sa kojim ćemo napuniti PdfDocument. Kod koji to radi bi izgledao ovako:

                // Kreiranje praznog documenta (A4 format) 
                PdfDocument pdfDocument = new PdfDocument(FileName); 

                // Add pages to PDF document 
                // The PrintDoc.Print method will call BeginPrint method, next it will call multiple times PrintPage method and finally 
                // it will call EndPrint method.  
                System.Drawing.Printing.PreviewPrintController previewControler = new System.Drawing.Printing.PreviewPrintController(); 
                printDoc.PrintController = previewControler; 
                printDoc.Print(); 

                // get printing results in the form of array of images one per page - image format is Metafile 
                PreviewPageInfo[] pageInfo = previewControler.GetPreviewPageInfo(); 

                // page size in px units 
                Double PageWidth = pdfDocument.PageSize.Width; 
                Double PageHeight = pdfDocument.PageSize.Height; 
                Double Resolution = 150.0; 

                // add pages to pdf document 
                for(Int32 ImageIndex = 0; ImageIndex < pageInfo.Length; ImageIndex++) 
                { 
                    // add page to document 
                    PdfPage Page = new PdfPage(pdfDocument); 

                    // add contents to the page 
                    PdfContents Contents = new PdfContents(Page); 

                    // page image 
                    Image PageImage = pageInfo[ImageIndex].Image; 
                    // convert metafile image to PdfImage 
                    PdfImage Image = new PdfImage(pdfDocument, PageImage, Resolution); 

                    // crta image 
                    Contents.DrawImage(Image, 10.0, -12.5, PageWidth, PageHeight); 

                } 
                // oslobađa printDoc object 
                printDoc.Dispose(); 

                // kreira PDF file 
                pdfDocument.CreateFile(); 

                return FileName;   // koristi ga Mail

Istina, file generiran sa myPdfWriter-om ja nešto veći nego generiran sa PdfCreator-om, ali sa današnjim hardverskim resursima to je zanemarivo. Prednosti ovog načina je prored eliminiranja svih nedostataka PdfCreatora velika kreativna sloboda i kontrola nad tim dijelom programa

Malo složenija ali bolja varijanta je ako se koristi 'class PdfPrintDocument : PrintDocument', koji radi sličnu stvar, ali daje dva do četiri puta manji .pdf file, što je važno kada se dokument prosljeđuje e-mailom. Riješenje je nešto drukčije, unaprijed se definira naziv .pdf-a i način kako će se spremiti (crno-bijelo, sivo ili u boji) o čemu ovisi veličina .pdf zapisa.

Kreirao i izradio Ivan Smilović!.
Blue joomla theme by Template Joomla