PdfInvoiceMerge icon indicating copy to clipboard operation
PdfInvoiceMerge copied to clipboard

不错,好使,自己增强了两个功能

Open ayeah opened this issue 1 year ago • 0 comments

一、取消另存为对话框,直接存临时文件打开

            //var dlg = saveFileDialog1.ShowDialog();
            //if (dlg != DialogResult.OK)
            //    return;

            var saveFileName = Path.GetTempFileName().Replace(".tmp", ".pdf"); //临时文件名
            var type = cmbMergeType.SelectedIndex;

            var files = listInvoices.Items.Cast<string>().ToList();
            try
            {
                switch (cmbMergeType.SelectedIndex)
                {
                    case 0:
                        Merge1(files, saveFileName);//saveFileDialog1.FileName
                        break;
                    case 1:
                    default:
                        Merge2(files, saveFileName);
                        break;
                    case 2:
                        Merge4(files, saveFileName);
                        break;
                    case 3:
                        Merge9(files, saveFileName);
                        break;
                }

                Process.Start(saveFileName); //打开临时文件

二、每页9张发票

        /// <summary>
        /// 每页九张发票
        /// </summary>
        /// <param name="files"></param>
        /// <param name="outputFile"></param>
        public static void Merge9(IEnumerable<string> files, string outputFile)
        {
            var queue = new ConcurrentQueue<string>(files);
            var document = new Document();
            var margin = 10;
            try
            {
                var writer = PdfWriter.GetInstance(document, new FileStream(outputFile, FileMode.Create));
                var size = PageSize.A4.Rotate();
                document.Open();
                document.SetPageSize(size);
                PdfContentByte cb = writer.DirectContent;

                do
                {
                    document.NewPage();
                    for (int i = 0; i < 9; i++)
                    {
                        if (TryAppendPage(i) == false)
                            break;
                    }
                } while (queue.Count > 0);

                bool TryAppendPage(int type)
                {
                    if (queue.TryDequeue(out var p) == false)
                        return false;

                    var reader = new PdfReader(p);
                    var page = writer.GetImportedPage(reader, 1);

                    AffineTransform af = new AffineTransform();

                    var scaleHeight = (size.Height - margin * 4) / 3 / page.Height;
                    var scaleWidth = (size.Width - margin * 4) / 3 / page.Width;
                    var scale = Math.Min(scaleHeight, scaleWidth);

                    var height = ((size.Height - margin * 4) / 3 - scale * page.Height) / 3;
                    var width = ((size.Width - margin * 4) / 3 - scale * page.Width) / 3;

                    switch (type)
                    {

                        case 6:
                            af.Translate(margin + width, margin + height);
                            break;

                        case 7:
                            af.Translate(margin + width + size.Width / 3, margin + height);
                            break;

                        case 8:
                            af.Translate(margin + width + size.Width / 3 + size.Width / 3, margin + height);
                            break;

                        case 3:
                            af.Translate(margin + width, margin + height + size.Height / 3);
                            break;
                        case 4:
                            af.Translate(margin + width + size.Width / 3, margin + height + size.Height / 3);
                            break;
                        case 5:
                            af.Translate(margin + width + size.Width / 3 + size.Width / 3, margin + height + size.Height / 3);
                            break;
                        case 0:
                            af.Translate(margin + width, margin + height + size.Height / 3 + size.Height / 3);
                            break;
                        case 1:
                            af.Translate(margin + width + size.Width / 3, margin + height + size.Height / 3 + size.Height / 3);
                            break;
                        case 2:
                            af.Translate(margin + width + size.Width / 3 + size.Width / 3, margin + height + size.Height / 3 + size.Height / 3);
                            break;
                        default:
                            af.Translate(margin + width, margin + height);
                            break;
                    }
                    af.Scale(scale, scale);

                    cb.AddTemplate(page, af);
                    return true;
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                document.Close();
            }
        }

ayeah avatar May 23 '24 08:05 ayeah