IText7 PDF Html генератор с верхним и нижним колонтитулами для C# - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь создать PDF-файл из предопределенного HTML содержимого. Мне удалось сгенерировать контент, но без требуемого HTML верхнего колонтитула, HTML нижнего колонтитула и языка арабского языка c также не поддерживается.

Мои требования:

  1. Арабский c языковая поддержка.
  2. Возможность создания более 10 страниц.
  3. Нижний колонтитул может отличаться на разных страницах.

  4. Существует веб приложение, которое отправляет запрос службе WCF, а служба возвращает байтовый массив, содержащий PDF.

Итак, я искал пару дней хороший инструмент, и я нашел SelectPdf, он идеален, за исключением того, что он НЕ бесплатный, поэтому единственным решением является IText7 PDF Html. Дело в том, что в этой библиотеке есть хорошая документация для JAVA, и я действительно изо всех сил стараюсь следовать примерам C# и преобразовывать из JAVA API в C# код. Кто-нибудь делал что-то подобное раньше с c#?

1 Ответ

0 голосов
/ 19 марта 2020

После долгого процесса поиска и попыток, я запустил его и получил следующие функции:

  1. Изображение в шапке.

  2. Изображение Base64 в нижнем колонтитуле, в дополнение к возможности записать некоторый текст на другой стороне нижнего колонтитула.

  3. Создание одинакового нижнего колонтитула для всех страниц, кроме последней.
  4. количество сгенерированных страниц не ограничено.
  5. Нумерация страниц.

Все предыдущие функции были бесплатными, однако для поддержки арабского языка c требуется лицензия Так что я должен заплатить в любом случае:)

Пожалуйста, найдите ниже мой C# код и опубликуйте ваши улучшения, если они у вас есть.

public class Pdfgenerator
{
    public const string FONT = "Fonts/NotoNaskhArabic-Regular2.ttf";
    public static string HEADER_TEXT = "<table width=\"100%\" border=\"0\"><tr><td>Header</td><td align=\"right\">Some title</td></tr></table>";
    public static string FOOTER_TEXT = "<table width=\"100%\" border=\"0\"><tr><td>Footer</td><td align=\"right\">Some title</td></tr></table>";
    public MemoryStream createPdf()
    {
        string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
        MemoryStream file = new MemoryStream();
        PdfDocument pdfDocument = null;
        PdfDocument pdfDoc = null;
        PdfDocument pdfDocument1 = null;
        try
        {

            using (file)
            {
                PdfFont f = PdfFontFactory.CreateFont(apPath + FONT, PdfEncodings.IDENTITY_H);
                string header = "pdfHtml Header and footer example using page-events";
                Header headerHandler = new Header(header);
                Footer footerHandler = new Footer();
                ConverterProperties converterProperties = new ConverterProperties();
                PdfWriter writer1 = new PdfWriter(apPath + "test1.pdf");
                pdfDocument1 = new PdfDocument(writer1);
                pdfDocument1.AddEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);
                pdfDocument1.AddEventHandler(PdfDocumentEvent.END_PAGE, footerHandler);
                converterProperties = new ConverterProperties().SetBaseUri(apPath);

                HtmlConverter.ConvertToDocument(File.ReadAllText(apPath + "content.html"), pdfDocument1, converterProperties);
                footerHandler.lastPage = pdfDocument1.GetLastPage();

                pdfDocument1.Close();
            }
        }
        catch (Exception ex)
        {

        }
        finally
        {
            file.Dispose();
        }

        return new MemoryStream();
    }
}

Создание заголовка:

class Header : IEventHandler
{
    private string header;
    private Image image;
    public Header(string header)
    {
        string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
        this.header = header;
        image = new Image(ImageDataFactory.Create(apPath + "Images/RANDOM_PHOTO.jpg"));

    }

    public void HandleEvent(Event @event)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
        PdfDocument pdf = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        Rectangle pageSize = page.GetPageSize();

        Canvas canvas = new Canvas(new PdfCanvas(page), pdf, pageSize);
        canvas.SetFontSize(18);


        // Write text at position
        canvas.Add(image);
        canvas.Close();
    }
}

Генерация нижнего колонтитула:

class Footer : IEventHandler
{
    public PdfPage lastPage = null;
    protected PdfFormXObject placeholder;
    protected float side = 20;
    protected float x = 300;
    protected float y = 25;
    protected float space = 4.5f;
    protected float descent = 3;

    public Footer()
    {
        placeholder = new PdfFormXObject(new Rectangle(0, 0, side, side));
    }

    public void HandleEvent(Event @event)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
        PdfDocument pdf = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        int pageNumber = pdf.GetPageNumber(page);
        Rectangle pageSize = page.GetPageSize();
        // Creates drawing canvas
        PdfCanvas pdfCanvas = new PdfCanvas(page);
        Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);

        IList<iText.Layout.Element.IElement> elements = HtmlConverter.ConvertToElements("<table border=\"0\"><tr><td><img src=\"data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\" alt=\"Italian Trulli\"></td></tr></table>");
        Paragraph p = new Paragraph();

        foreach (iText.Layout.Element.IElement e in elements)
        {
            if (e is IBlockElement) {
                p.Add((IBlockElement)e);
            }
        }
        if (lastPage == docEvent.GetPage()) {

        }
        else
        {
            canvas.ShowTextAligned(p, 25, 75, TextAlignment.LEFT);
        }

        canvas.Close();

        // Create placeholder object to write number of pages
        pdfCanvas.AddXObject(placeholder, x + space, y - descent);
        pdfCanvas.Release();
    }

    public void writeTotal(PdfDocument pdf)
    {
        Canvas canvas = new Canvas(placeholder, pdf);
        canvas.ShowTextAligned(pdf.GetNumberOfPages().ToString(),
                0, descent, TextAlignment.LEFT);
        canvas.Close();
    }
}

Я пытался получить поток в качестве вывода, поэтому, если вы этого хотите, вы также можете использовать следующее в своей основной службе:

public byte[] GetData()
    {
        MemoryStream stream = new Pdfgenerator().createPdf();
        byte[] arr = stream.ToArray();
        return stream.ToArray();
    }
...