Win
Generiranje .pdf kopije dokumenta
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.
