PdfInvoiceMerge
PdfInvoiceMerge copied to clipboard
不错,好使,自己增强了两个功能
一、取消另存为对话框,直接存临时文件打开
//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();
}
}