当前系统功能:系统为每个客户收集多个pdf发票,并将所有这些发票合并为1个pdf发票,然后向客户发送一封电子邮件。 如果客户一个月内有10张发票,则系统会将所有这些发票合并为一个pdf,然后将其发送给客户。 PDF将使用一个发票名称。所有客户都会遇到这种情况。
要求的更改:有些更改不再希望将其发票合并为一个pdf。 他们希望每张发票单独发送。 这将基于客户端,因为某些客户端将继续使用现有功能。 AccountId是主键,我将使用它排除发票合并。如果没有找到AccountId,这意味着它将被合并,请参阅。发票名称必须唯一(AccountName_1)。它将每次增加1或放入GuidID。
我的问题:正在创建一个空发票,就像我在创建现有pdf的新实例一样,因此它变成了空。我在段落上添加了一些文本,它将写入这些文本,但不会写入实际的发票数据。我不确定如何/在何处附加发票数据。请帮忙,对不起。
现有功能代码。
方法1:
public MessageQueue CollateDocumentsForMessage(MessageQueue message, MessageSchedulerSettings settings, CompanySegmentSettings currentCompanySegmentsSetings)
{
---
---Some existing codes for checks
---
//Retrieve documents
var resultCollection = new ConcurrentBag<FinancialDocument>();
ParallelLoopResult loopResults = Parallel.ForEach(documents, d =>
{
try
{
d.Document = RetrieveDocument(d.DocumentUrl);
resultCollection.Add(d);
}
catch (Exception ex)
{
logger.Error(ex, "Failed to download DocumentNumber: {0}", d.MetaData.DocumentNumber);
throw;
}
});
if (!loopResults.IsCompleted)
{
message.Status = MessageQueueStatus.Error;
message.ErrorName = "DocumentGeneratorError";
message.ErrorDescription = string.Format("Failed to download one of the documents for message {0}", message.Id);
}
var reorderedFinDocs = resultCollection.OrderBy(a => a.MetaData.DocumentDate).ThenBy(a => a.MetaData.DocumentNumber);
var currentOutputDirectory = generatedPDFsDirectory(settings.DocumentOutputDirectory);
var outputFileName = $"{currentCompanySegmentsSetings.FriendlySegmentName}-{Translator.TranslateDocumentType("invoice", currentCompanySegmentsSetings).ToLower()}-{message.documents.First().AccountNumber}.pdf";
string documentPath = documentProvider.MergeAndSaveDocument(message, reorderedFinDocs, coverPageTemplateLocation, currentOutputDirectory, outputFileName, currentCompanySegmentsSetings);
message.FinancialDocumentAttachments.Add(new MessageQueueAttachment()
{
Location = documentPath,
IsNew = true,
Id = Guid.NewGuid()
});
}
}
return message;
}
方法2:
public string MergeAndSaveDocument(MessageQueue message, IEnumerable<FinancialDocument> financialDocument, string coverPageTemplate, string outputDirectory, string outputFilename, CompanySegmentSettings currentCompanySegmentsSetings)
{
System.IO.Directory.CreateDirectory(outputDirectory);
var firstDocsMetadata = financialDocument.First().MetaData;
string generatedPDFLocation = System.IO.Path.Combine(outputDirectory, outputFilename);
var filesToMerge = FinancialDocumentsToPDFDocs(financialDocument);
//Creates new pdf
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(generatedPDFLocation, CreateEncryptionWriteProperties()));
Document doc = new Document(pdfDoc);
//Bookmarks
pdfDoc.GetCatalog().SetPageMode(PdfName.UseOutlines);
doc.SetMargins(22f, 22f, 22f, 22f);
doc.SetFontSize(8);
doc.SetFontColor(Color.BLACK);
//2. Merge financial documents
mergeDocumentsAndAddBooks(doc, filesToMerge);
//3. Close documents
doc.Close();
foreach (PdfDocument srcDoc in filesToMerge.Values)
{
srcDoc.Close();
}
doc.Close();
return System.IO.Path.GetFullPath(generatedPDFLocation);
}
方法3:此方法合并所有发票
private void mergeDocumentsAndAddBooks(Document targetDocument, Dictionary<FinancialDocument, PdfDocument> filesToMerge)
{
int n;
PdfDocument pdfDoc = targetDocument.GetPdfDocument();
int pageNo = pdfDoc.GetNumberOfPages();
//Create bookmarks
PdfOutline docOutline = pdfDoc.GetOutlines(false);
foreach (var entry in filesToMerge)
{
PdfOutline outline = docOutline.AddOutline(string.Format("{0}-Page 1 of 1", entry.Key.MetaData.DocumentNumber.ToString()));
string destinationText = "p" + entry.Key.MetaData.DocumentNumber;
outline.AddDestination(PdfDestination.MakeDestination(new PdfString(destinationText)));
n = entry.Value.GetNumberOfPages();
for (int i = 1; i <= n; i++)
{
pageNo++;
Text text = new Text("");
entry.Value.CopyPagesTo(i, i, pdfDoc);
if (i == 1)
{
text.SetDestination(entry.Key.MetaData.DocumentNumber);
}
targetDocument.Add(new Paragraph(text).SetFixedPosition(pageNo, 549, 870, 40));
}
}
}
我尝试过的方法:我尝试对方法1进行一些更改。我不确定这是否是正确的放置位置或执行的操作。
public MessageQueue CollateDocumentsForMessage(MessageQueue message, MessageSchedulerSettings settings, CompanySegmentSettings currentCompanySegmentsSetings)
{
--
--Some checks
--
var reorderedFinDocs = resultCollection.OrderBy(a => a.MetaData.DocumentDate).ThenBy(a => a.MetaData.DocumentNumber);
var currentOutputDirectory = generatedPDFsDirectory(settings.DocumentOutputDirectory);
#region Excluded accounts for invoice merging
//Accounts for separate invoices
//<add key="AccountNumbers" value="account1,account2,account3,account4" />
string[] accountArray = System.Configuration.ConfigurationManager.AppSettings["AccountNumbers"].Split(',').Select(s => s.Trim()).ToArray();
List<string> accountlist = new List<string>(accountArray);
foreach (var item in documents)
{
if (accountlist.Contains(item.MetaData.AccountNumber))
{
var guidID = Guid.NewGuid().ToString();
var newFileName = $"{currentCompanySegmentsSetings.FriendlySegmentName}-{Translator.TranslateDocumentType("invoice", currentCompanySegmentsSetings).ToLower()}-{guidID}-{message.documents.First().AccountNumber}.pdf";
outputFileNames.Add(newFileName);
System.IO.Directory.CreateDirectory(currentOutputDirectory);
var firstDocsMetadata = documents.First().MetaData;
string generatedPDFLocation = System.IO.Path.Combine(currentOutputDirectory, newFileName);
var files = FinancialDocsToPDFDocs(documents);
//Creates new pdf
FinDoc.DocumemtProvider.PDFDocumentProvider.PDFDocumentProvider docProvider = new PDFDocumentProvider();
var encription = docProvider.CreateEncryptionWriteProperties();
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(generatedPDFLocation, encription));
//Document doc = new Document(files.First().Value);
Document doc = new Document(pdfDoc);
//Bookmarks
pdfDoc.GetCatalog().SetPageMode(PdfName.UseOutlines);
doc.SetMargins(22f, 22f, 22f, 22f);
doc.SetFontSize(8);
doc.SetFontColor(Color.BLACK);
PdfOutline docOutline = pdfDoc.GetOutlines(false);
PdfOutline outline = docOutline.AddOutline(string.Format("{0}-Page 1 of 1", item.MetaData.DocumentNumber.ToString()));
string destinationText = "p" + item.MetaData.DocumentNumber;
outline.AddDestination(PdfDestination.MakeDestination(new PdfString(destinationText)));
doc.Add(new Paragraph("Example"));
doc.Close();
string filePath = @"C:\xxxx\xxxxx\";
string absolutePath = Path.GetFullPath(filePath + currentOutputDirectory + newFileName);
//string absolutePath = documentProvider.NoMergeDocumentsAndAddBooks(message, reorderedFinDocs, coverPageTemplateLocation, currentOutputDirectory, newFileName, currentCompanySegmentsSetings);
message.FinancialDocumentAttachments.Add(new MessageQueueAttachment()
{
Location = absolutePath,
IsNew = true,
Id = Guid.NewGuid()
});
}
else
{
var outputFileName = $"{currentCompanySegmentsSetings.FriendlySegmentName}-{Translator.TranslateDocumentType("invoice", currentCompanySegmentsSetings).ToLower()}-{message.documents.First().AccountNumber}.pdf";
string documentPath = documentProvider.MergeAndSaveDocument(message, reorderedFinDocs, coverPageTemplateLocation, currentOutputDirectory, outputFileName, currentCompanySegmentsSetings);
message.FinancialDocumentAttachments.Add(new MessageQueueAttachment()
{
Location = documentPath,
IsNew = true,
Id = Guid.NewGuid()
});
}
}
#endregion
return message;
}