如何使用内容创建PDF

时间:2020-01-27 12:52:57

标签: c# pdf itext

当前系统功能:系统为每个客户收集多个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;
    }

0 个答案:

没有答案
相关问题