Hình 3.13:Lựa chọn phƣơng thức bình
Hình 3.15: Thể hiện kết quả
Hình 3.16: Phóng to kết quả
3.6. Kết luận chƣơng
Quá trình xây dựng chương trình gặp nhiểu khó khăn vì thuật toán phức tạp trong khi cài đặt, nhưng tôi vẫn cố gắng thiết kế giao diện tương tác tốt với các lớp bên dưới, hạn chế khai báo biến dư thừa, mỗi khi sinh ra đối tượng mới thi để làm việc, sau đó phải giải phóng bộ nhớ
luôn, nếu không chương trình sẽ bị treo luôn tại chỗ khi xếp một số trang lên khuôn. Với giao diện dễ dàng sử dụng, kỹ thuật viên sẽ thao tác trực quan và linh hoạt, có thể kéo thả tệp vào quá trình nhận. sau đó lựa chọn các ―‖Dấu màu, thang đo màu, dấu ốc xén cạnh và dấu gấp‖,
Phần bình nhãn cũng rất tiện ích cho kỹ thuật viên thao tác xếp nhãn, tem, phần mềm tự động tính toán khoảng cách các nhãn, kích thước nhãn cho từng loại gấp, do đó các kỹ thuật viên sẽ rất yên tâm làm việc với sản phẩm này, giúp tăng tốc độ làm việc tiết kiệm thời gian chi phí, tránh sai sót, hy vọng sau này phần mềm sẽ được ứng dụng trong đời sống thực tiễn.
Kết luận chung
Các kết quả đạt đƣợc
Phần này đề cập triển khai, đánh giá và thực nghiệm - cài đặt phần mềm, khảo sát các phản hồi từ người sử dụng. Lập các biểu đồ dựa trên các kết quả khảo sát và từ đó đưa ra kết luận về các tính năng của hệ thống, khả năng áp dụng trong thực tế.
1. Sau khi hoàn thành sản phẩm phần mềm này tôi đã cho dùng thử tại Nhà máy in Khoa học và công nghệ thuộc viện khoa học Việt Nam và được Ông Đậu Đăng Doanh- giám đốc Nhà in đánh giá phần mềm rất cao, rất hữu ích cho ngành in Việt Nam.
2. Và tôi đã chạy thử tại Công ty cổ phần Indesign Phố Chùa Láng- Đống Đa-Hà Nội với kết quả rất bất ngờ, độ chính xác 100%, và chất lượng in cao.
3. Và cũng được chạy thử nghiệm tại Xưởng in thực nghiệm của trường Cao đẳng công nghiệp in. cũng có kết quả tương tự;
4. Ngoài ra còn một số bạn bè trong cả nước đã chạy thử phần mềm cũng cho kết quả rất tốt.
Định hƣớng phát triển
Sau khi được Hội Đồng đánh giá luận văn tôi có nguyện vọng chỉnh sửa phần mềm một cách tối ưu để có ích cho ngành thiết kế nước nhà, và cài đặt phát triển nhiều tính năng mở của phần mềm cho Văn phòng nói chung. Ebooks truyền thông;
Tham gia nghiên cứu mở rộng tính năng đồ họa trực quan, xây dựng phần mềm Vẽ và trực tiếp cho kết quả Tệp.PDF giúp người sử dụng dễ dàng Out put ra Tệp.PDF mà không cần sự hộ trợ của các phần mềm trước đây, cũng như các máy POSTSCRIPT Printer;
Dần dần thay cho các chức năng của máy in Lazer, in công nghiệp cách layout trang giúp các cá nhân, doanh nghiệp in, các tổ chức văn phòng khi muốn in những cuốn sách nhỏ, in Card, Stemp… Một cách dễ dàng mà Driver của các máy in này không hỗ trợ được.
Tài liệu tham khảo
[1]. ThS.Giang Văn Khuyến, Lý thuyết bình bản, NXB. Trường cao đẳng công nghiệp in (Lưu hành nội bộ), 2014.
[2]. http://www.adobe.com/content/dam/Adobe/en/.../pdfs/PDF32000_2008.pd, ―Document management, Portable document format, Part 1: PDF 1.7 First Edition, N 2008-7-1, 2008‖
[3]. http://www.manning.com/ItextSHARP Text was the first open source PDF solution. In 2007, Andrew Binstock wrote;
[4]. http://www. sourceforge.net/projects/itextsharp/ Open Source, 2014 [5]. http://www.apress.com/9781430225492
/Pro.C#.2010.and.the...NET.4.Platform.Fifth.Edition Andrew Troelsen. [6]. SOFTWARE ENGINEERING Ninth Edition Addison-Wesley.
Phụ lục
1. Thiết kế Class chính
Thiết kế bao gồm các tham số liên quan và các phương thức đại diện cho Actor chính. public class lop_chinh
{ // khoang cach tu truc X den san pham; // khai báo các thuộc tính chính
public double KC_X_SP{get;set;} // khoang cach tu tru Y den san pham public double KC_Y_SP {get;set;} // khoang cach song ngang
public double KC_NGANG { get; set; } // khoang cach song doc
public double KC_DOC { get; set; } // khoang cach oc xen san pham
public double KC_OC_XEN { get; set; } // khoang cach oc mau den san pham public double KC_OC_MAU { get; set; } // khoang cach dai mau den san pham public double KC_DAIMAU { get; set; } // chieu dai cua oc xen
public double DO_DAI_OCXEN { get; set; } // tran xen dinh sach
public double Bleed_DINH { get; set; } // tran xen day sach
public double bleed_DAY { get; set; } // tran xen bug sach
public double bleed_BUNG { get; set; } // tran xen gay sach
public double bleed_GAY { set; get; } // khang cach xen toi dinh sach
public double KC_DINH { get; set; } public String Ten_tệp_ghi_vao { get; set; } // khoang cach xen toi bung sach
public double KC_BUNG { get; set; } // khoang cah xen toi day sach
public double KC_DAY { get; set; } public double KC_GAY { get; set; } // kiem tra dai mau ngang
public bool chon_dai_mau_ngang;
public double kc_gay_2trang_ngoai_cung { get; set; } // kiem tra dai mau doc
public bool chon_dai_mau_doc; // kiểm tra dải màu
public bool chonsach_ngang; // lựa chọn kiểu sách ngang hay dọc public bool chonsach_doc;
public int so_tay_sach16; public int so_du_tay_32; public int so_tay_sach32; public int so_du_tay_12; public int so_tay_sach12; public int so_du_tay_8; public int so_tay_sach8; public int so_du_tay_24; public int so_tay_sach24;
public int so_tay_sach_dong_2vach;
public int so_du_tay_sach_dong_long_2vach; public int so_du_tay_sach_dong_long_3vach; public int so_tay_sach_dong_long_3vach; public double do_dai__dau_gay; Độ dài dấu gáy // het phan khai bao cac bien dung chung;
public String tensach { get; set; } public lop_chinh () { this.KC_X_SP = 0; this.KC_Y_SP = 0; this.KC_OC_XEN = 0; this.KC_OC_MAU = 0; this.KC_NGANG = 0; this.KC_DOC = 0; this.KC_DINH = 0; this.KC_DAY = 0; this.KC_DAIMAU = 0; this.KC_BUNG = 0; }// het contructor 1 public void Dispose () { // hàm hủy của lớp chính
GC.SuppressFinalize (this); }
public lop_chinh (double KC_X_SP1, double KC_Y_SP1, double KC_OC_XEN1, double KC_OC_MAU1, double KC_NGANG1, double KC_DOC1, double KC_DINH1, double KC_DAY1, double KC_DAI_MAU1, double KC_BUNG1)
{ this.KC_X_SP = KC_X_SP1; this.KC_Y_SP = KC_Y_SP1; this.KC_OC_XEN = KC_OC_XEN1; this. KC_OC_MAU=KC_OC_MAU1; this.KC_NGANG = KC_NGANG1; this.KC_DOC = KC_DOC1; this.KC_DINH = KC_DINH1; this.KC_DAY = KC_DAY1; this.KC_DAIMAU = KC_DAI_MAU1;
this.KC_BUNG = KC_BUNG1; }// het contructor 2
2. Giải thuật Uscase tay sách 8 trang
if (so_du_tay_8 > 0)
{// khai bao 2 mang a, ba de nhan hai day so khac nhau a = new int[ (inputPages - so_du_tay_8) / 2 + 1];
b = new int[ (inputPages - so_du_tay_8) / 2 + 1]; a[1] = 1;
b[1] = 2;
for (int k = 2; k <= inputPages - so_du_tay_8; k++) { if (k % 2 == 0) { a[k] = doan_dau[2 * k]; b[k] = doan_dau[2 * k] - 1; } else { a[k] = doan_dau[2 * k] - 1; b[k] = doan_dau[2 * k]; }
if (a[k] == inputPages || b[k] == inputPages)
// so sanh neu mang a hoac b chua so cuoi cung cua so trang thi thoat { break; }
} } else {
a = new int[ (inputPages) / 2 + 1]; b = new int[ (inputPages) / 2 + 1]; a[1] = 1;
b[1] = 2;
for (int k = 2; k <= inputPages; k++) { if (k % 2 == 0) { a[k] = 2 * k; b[k] = 2 * k - 1; } else { a[k] = 2 * k - 1; b[k] = 2 * k; }
// so sanh neu mang a hoac b chua so cuoi cung cua so trang thi thoat { break; }
} }
Sau khi chia thành hai nhóm trang, Tiếp tục sử dụng 2 mảng số nguyên m, n để lưu số trang trên từng khuôn trong vòng lặp vẽ, mỗi một lần vẽ mảng sẽ thay đổi giá trị bên trong các phần tử.
int getlena = a.Length;// lấy chiều dài mảng a, b int getlenb = b.Length;
for (int k = 0; k <=inputPages/8; k++)
// tổng số trang chia cho 8 đó là khuôn 8 trang {
// mỗi lần k tăng 1, thì 1 lần vẽ lên trên trang for (int j = 1; j <=4; j++) { if ((k * 4 + j) > a.Length) { break; } m[j] = a[k * 4 + j]; n[j] = b[k * 4 + j]; } }
// khai bao layout mới cho trang mới trong layout PdfPage page = outputDocument.AddPage (); page.Orientation = PageOrientation.Landscape; // lấy chiều dài và chiều rộng trang gốc
double extWidth = form.PixelWidth; double extHeight = form.PixelHeight; double rong_trang_goc = form.PixelWidth; double cao_trang_goc = form.PixelHeight;
page.Width = 2 * rong_trang_goc + 2 * KC_X_SP + KC_GAY + KC_DOC; page.Height = 2 * cao_trang_goc + KC_NGANG + 2 * KC_Y_SP;
double width = extWidth; double height = extHeight; //---
gfx = XGraphics.FromPdfPage (page)
// vẽ trang đầu, Trong đó các biến Kc_gay: Khoảng cách gáy sách, KC_doc: Khoảng cách dọc sách, Bleed_gay: tràn xén phần gáy, witdth, height là chiều rộng và chiều cao của trang sách.
// vẽ trang đầu tiên.
form.PageNumber = m[1];
box = new XRect (KC_X_SP + width + KC_GAY + KC_DOC - bleed_GAY, KC_Y_SP + height + KC_NGANG - Bleed_DINH, width + bleed_GAY + bleed_BUNG, height + Bleed_DINH + bleed_DAY);
//Tương tự vẽ trang thứ 2 trên Layout:
form.PageNumber = m[2];
box = new XRect (……); vẽ trang thứ 2
gfx.DrawImage (form, box); //; Tương tự vẽ cho trang thứ 3….
Vẽ hết 4 trang, chuyển sang vẽ mặt sau: với mảng n lưu số trang mặt sau Rồi cuối cùng vẽ phần trang dư.
Tương tự cho thuật toán bình tay sách 16
3. Use case Bình 16 trang:
Giải thuật này tương tự như khuôn 8, mảng a chứa dãy thứ nhất, mảng b chứa dãy thứ 2 nhưng mỗi mảng m, n gồm 8 phần tử, layout được đặt rộng thêm gấp đôi.
Mảng a chứa tập {1, 4, 5, 8, 9, 12, 13, 16, 17, …...} Mảng b chứa tập {2, 3, 6, 7, 10, 11, 14, 15, 18, 19… }
int inputPages = form.PageCount; //đếm tổng số trang trong tệp int[] A = new int[inputPages];
int[] B = new int[inputPages];
int TSTRANG_DUOC_CHON = this.so_tay_sach16 * 16; int[] doan_cuoi = new int[inputPages];
int[] doan_dau = new int[inputPages - so_du_tay_16 + 1]; int[] doan_du = new int[so_du_tay_16 + 1];
int dem = 1;
if (so_du_tay_16 > 0) {
for (int v = TSTRANG_DUOC_CHON + 1; v <= (TSTRANG_DUOC_CHON + so_du_tay_16 + 1); v++) { doan_du[dem] = v; dem = dem + 1; if (dem == so_du_tay_16 + 1) { break; } }
for (int v = 1; v <= inputPages; v++) {
if (v <= TSTRANG_DUOC_CHON) { doan_dau[v] = v; }
else { doan_dau[v] = v + so_du_tay_16; } if (doan_dau[v] == inputPages)
{ break; } }
}
// sau khi phân đoạn tay sách dư, biến doan_dau : Đoạn có nghĩa là tập số tự nhiên đại diện cho số trang
int[] n = new int[8 + 1]; int[] a;
int[] b;
if (so_du_tay_16 > 0) {
a = new int[ (inputPages - so_du_tay_16) / 2 + 1]; b = new int[ (inputPages - so_du_tay_16) / 2 + 1]; a[1] = 1;
b[1] = 2;
for (int k = 2; k <= inputPages - so_du_tay_16; k++) { if (k % 2 == 0) { a[k] = doan_dau[2 * k]; b[k] = doan_dau[2 * k] - 1; } else { a[k] = doan_dau[2 * k] - 1; b[k] = doan_dau[2 * k]; }
if (a[k] == inputPages || b[k] == inputPages)
// so sanh neu mang a hoac b chua so cuoi cung cua so trang thi thoat { break; }
} } else {
a = new int[ (inputPages) / 2 + 1]; b = new int[ (inputPages) / 2 + 1]; a[1] = 1;
b[1] = 2;
for (int k = 2; k <= inputPages; k++) { if (k % 2 == 0) { a[k] = 2 * k; b[k] = 2 * k - 1; } else { a[k] = 2 * k - 1; b[k] = 2 * k; }
if (a[k] == inputPages || b[k] == inputPages)
// so sanh neu mang a hoac b chua so cuoi cung cua so trang thi thoat { break; }
}
// Bắt đầu Paint
int demtay = inputPages / 16; for (int k = 0; k < demtay; k++) {
// moi lan k thi 1 lan ve len tren trang for (int j = 1; j <= 8; j++)
{
m[j] = a[k * 8 + j]; n[j] = b[k * 8 + j]; }
// ve trang moi dau tien trong vong lap
PdfPage page = outputDocument.AddPage (); page.Orientation = PageOrientation.Landscape; double extWidth = form.PixelWidth;
double extHeight = form.PixelHeight; double rong_trang_goc = form.PixelWidth; double cao_trang_goc = form.PixelHeight;
page.Width = 4 * rong_trang_goc + 2 * KC_X_SP + 2 * KC_GAY + KC_DOC; page.Height = 2 * cao_trang_goc + KC_NGANG + 2 * KC_Y_SP;
double width = extWidth; double height = extHeight;
gfx = XGraphics.FromPdfPage (page); XRect box;
// ve trang 1
form.PageNumber = m[1];
box = new XRect (KC_X_SP + 3 * width + KC_GAY + KC_DOC + KC_GAY - bleed_GAY, KC_Y_SP + height + KC_NGANG - Bleed_DINH, width + bleed_GAY + bleed_BUNG, height + Bleed_DINH + bleed_DAY); // định dạng hình chữ nhật
gfx.DrawImage (form, box); // ve trang 4
form.PageNumber = m[2];
box = new XRect (KC_X_SP - bleed_BUNG, KC_Y_SP + height + KC_NGANG - Bleed_DINH, width + bleed_BUNG + bleed_GAY, height + Bleed_DINH + bleed_DAY);
//
gfx.DrawImage (form, box);
3. Giải thuật cho việc đống lồng hai vạch
Cũng giống như vẽ khâu chỉ ta cũng phân hai tập hợp số trang tập a là mảng {1, 4, 5, 8, 9, 12, 13, 16, 19, 20…} tập b là mảng của các số {2, 3, 6, 7, 10, 11, 14, 15…}
a = new int[ (inputPages) / 2 + 1]; b = new int[ (inputPages) / 2 + 1]; a[1] = 1;
b[1] = 2;
{ if (k % 2 == 0) { a[k] = 2 * k; b[k] = 2 * k - 1; } else { a[k] = 2 * k - 1; b[k] = 2 * k; }
if (a[k] == inputPages || b[k] == inputPages)
// so sanh neu mang a hoac b chua so cuoi cung cua so trang thi thoat { break; }
}
// Sau khi có hai mảng a, b thì cho vào vòng lặp vẽ int getlena = a.Length;
int getlenb = b.Length;
so_gia_gay = (this.kc_gay_2trang_ngoai_cung / (inputPages /4)); for (int k = 0; k <=inputPages/8; k++)
{
// moi lan k thi 1 lan ve len tren trang for (int j = 1; j <=2; j++) { if ((k * 2 + j) > (getlena-1)/2) { break; } m[j] = a[k*2+j]; n1[j] = b[ (getlenb) - (k*2+j)]; m1[j] = a[ (getlena)- (k*2+j)]; n[j] = b[k*2+j]; }
// hai mảng m lưu giá trị các trang trên từng layout khuôn in tính từ trang số 1, mảng m1 lưu giá trị của các trang tính từ cuối cuốn sách trở về tức là giảm xuống;
Mảng n: Lưu giá trị khuôn trở tính từ trang số 2, mảng n1 cũng vậy tính ngược lại từ cuối cuốn sách.
// Bước Pain: Vẽ cho khuôn in, khuôn trở tương tự
PdfPage page = outputDocument.AddPage (); // thêm trang mới trong layout page.Orientation = PageOrientation.Landscape;
double extWidth = form.PixelWidth; double extHeight = form.PixelHeight; double rong_trang_goc = form.PixelWidth; double cao_trang_goc = form.PixelHeight;
page.Width = 2 * rong_trang_goc + 2 * KC_X_SP + KC_GAY + KC_DOC; page.Height = 2 * cao_trang_goc + KC_NGANG + 2 * KC_Y_SP;
double width = extWidth; double height = extHeight; //---
gfx = XGraphics.FromPdfPage (page); // gfx = XGraphics.FromPdfPage (page); XRect box;
form.PageNumber = m[1];
box = new XRect (KC_X_SP + width + KC_GAY + KC_DOC - bleed_GAY, KC_Y_SP + height + KC_NGANG - Bleed_DINH, width + bleed_GAY + bleed_BUNG, height + Bleed_DINH + bleed_DAY);
gfx.DrawImage (form, box); // ve trang n
form.PageNumber = m1[1];
box = new XRect (KC_X_SP - bleed_BUNG, KC_Y_SP + height + KC_NGANG - Bleed_DINH, width + bleed_BUNG + bleed_GAY, height + Bleed_DINH + bleed_DAY);
//
gfx.DrawImage (form, box); // ve trang 4
form.PageNumber = m1[2];
box = new XRect (KC_X_SP - bleed_BUNG, KC_Y_SP - bleed_DAY, width + bleed_BUNG + bleed_GAY, height + Bleed_DINH + bleed_DAY);
//
// quay 180 d
gfx.RotateAtTransform (180, new XPoint (KC_X_SP + width / 2 - bleed_BUNG / 2 + bleed_GAY / 2, KC_Y_SP + height / 2 + Bleed_DINH / 2 - bleed_DAY / 2));
gfx.DrawImage (form, box); // ve trang 4
form.PageNumber = m[2];
box = new XRect (KC_X_SP + width + KC_GAY + KC_DOC - bleed_GAY, KC_Y_SP - bleed_DAY, width + bleed_BUNG + bleed_GAY, height + Bleed_DINH + bleed_DAY);
gfx.RotateAtTransform (180, new XPoint (KC_X_SP + width + KC_GAY + KC_DOC + width / 2 - bleed_GAY / 2 + bleed_BUNG / 2, KC_Y_SP + height / 2 + Bleed_DINH / 2 - bleed_DAY / 2));
gfx.DrawImage (form, box);
4. Thuật toán về tiện ích
Cài đặt mã như sau:
Mã này được gắn sự kiện Buton_noi_sach: try
{
if (list_danh_sach_tệp.Items.Count >= 2) {
t_tệp1 = list_danh_sach_tệp.Items[0].ToString (); t_tệp2 = list_danh_sach_tệp.Items[1].ToString (); }
XPdfForm form1 = XPdfForm.FromTệp (t_tệp1); XPdfForm form2 = XPdfForm.FromTệp (t_tệp2); // lay ra tham so chieu cao chieu rong trang
int inputPages1 = form1.PageCount; int inputPages2 = form2.PageCount;
PdfDocument outputDocument = new PdfDocument (); XGraphics gfx;
XRect box;
// tao layout cho trang
outputDocument.PageLayout = PdfPageLayout.SinglePage; XGraphicsState state;
for (int k = 1; k <= inputPages1; k++) {
PdfPage page = outputDocument.AddPage (); page.Orientation = PageOrientation.Landscape; double extWidth = form1.PixelWidth;
double extHeight = form1.PixelHeight; double rong_trang_goc = form1.PixelWidth; double cao_trang_goc = form1.PixelHeight; page.Width = rong_trang_goc;
page.Height = cao_trang_goc; double width = extWidth; double height = extHeight;
gfx = XGraphics.FromPdfPage (page); // ve trang 1
state = gfx.Save (); form1.PageNumber = k;
box = new XRect (0, 0, width, height); gfx.DrawImage (form1, box);
}// ve sach 2 noi sach1
for (int k = 1; k <= inputPages2; k++) {
PdfPage page = outputDocument.AddPage (); page.Orientation = PageOrientation.Landscape; double extWidth = form2.PixelWidth;
double extHeight = form2.PixelHeight; double rong_trang_goc = form2.PixelWidth; double cao_trang_goc = form2.PixelHeight;
page.Width = rong_trang_goc; page.Height = cao_trang_goc; double width = extWidth; double height = extHeight;
gfx = XGraphics.FromPdfPage (page); // gfx = XGraphics.FromPdfPage (page) state = gfx.Save (); // XRect box; // ve trang 1 form2.PageNumber = k;
box = new XRect (0, 0, width, height); gfx.DrawImage (form2, box);
}
// het ve sach, và ghi vào tệp mới