using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using HiQPdf.Next;
namespace HiQPdf_Next_AspNetDemo.Controllers
{
public class Create_PDF_DocumentsController : Controller
{
private readonly IWebHostEnvironment m_hostingEnvironment;
public Create_PDF_DocumentsController(IWebHostEnvironment hostingEnvironment)
{
m_hostingEnvironment = hostingEnvironment;
}
public IActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult CreatePdf(IFormCollection collection)
{
// Replace the demo serial number with the serial number received upon purchase
// to run the converter in licensed mode
Licensing.SerialNumber = "YCgJMTAE-BiwJAhIB-EhlWTlBA-UEBRQFBA-U1FOUVJO-WVlZWQ==";
PdfDocumentCreateSettings pdfCreateSettings = new PdfDocumentCreateSettings()
{
PageSize = PdfPageSize.A4,
PageOrientation = PdfPageOrientation.Portrait,
Margins = new PdfMargins(36, 36, 36, 36)
};
// Create a new PDF document with the specified settings
using PdfDocument pdfDocument = new PdfDocument(pdfCreateSettings);
const int startXPos = 0;
const int startYPos = 0;
const int ySeparator = 15;
int currentPage = pdfDocument.PageNumber;
int crtXPos = startXPos;
int crtYPos = startYPos;
// Create a standard Helvetica font
PdfFont fontHelvetica = PdfFontManager.CreateStandardFont(PdfStandardFont.Helvetica, 16f,
PdfFontStyle.Bold | PdfFontStyle.Underline, PdfColor.Black);
// Add a title using the Helvetica font
PdfTextElement pdfTitle1 = new PdfTextElement("Transparent PNG Image with Custom Width", fontHelvetica)
{
X = crtXPos,
Y = crtYPos
};
PdfTextRenderInfo textRenderInfo = pdfDocument.AddText(pdfTitle1);
// Update the Y position after rendering the title
crtYPos = textRenderInfo.LastPageRectangle.Bounds.Bottom + ySeparator;
string imagesPath = GetDemoImagesPath();
// Add a transparent PNG image with custom width
PdfImageElement pdfPngImage = new PdfImageElement(Path.Combine(imagesPath, "transparent.png"))
{
X = crtXPos,
Y = crtYPos,
Width = 150
};
PdfImageRenderInfo imageRenderInfo = pdfDocument.AddImage(pdfPngImage);
crtYPos = imageRenderInfo.BoundingBox.Bottom + ySeparator;
// Create a standard Courier font
PdfFont fontCourier = PdfFontManager.CreateStandardFont(PdfStandardFont.Courier, 16f,
PdfFontStyle.Bold | PdfFontStyle.Italic, PdfColor.Green);
// Add a title for the JPEG image
PdfTextElement pdfTitle2 = new PdfTextElement("JPEG Image with Custom Height", fontCourier)
{
X = crtXPos,
Y = crtYPos
};
textRenderInfo = pdfDocument.AddText(pdfTitle2);
crtYPos = textRenderInfo.LastPageRectangle.Bounds.Bottom + ySeparator;
// Ensure there is enough vertical space on the current page for the image.
// Add a new page and reset Y position if needed
EnsureSpaceOnPage(ref crtYPos, 200, pdfDocument);
// Add a JPEG image with custom height
PdfImageElement pdfJpgImage = new PdfImageElement(Path.Combine(imagesPath, "image.jpg"))
{
X = crtXPos,
Y = crtYPos,
Height = 150
};
imageRenderInfo = pdfDocument.AddImage(pdfJpgImage);
crtYPos = imageRenderInfo.BoundingBox.Bottom + ySeparator;
string fontsPath = GetDemoFontsPath();
string textsPath = GetDemoTextsPath();
string alphabetFilePath = Path.Combine(textsPath, "Alphabet.txt");
string alfabetString = System.IO.File.ReadAllText(alphabetFilePath);
// Create a blue bold Courier font
PdfFont fontCourier2 = PdfFontManager.CreateStandardFont(PdfStandardFont.Courier, 16f,
PdfFontStyle.Bold, PdfColor.Blue);
// Add a title for the Unicode text
PdfTextElement pdfTitle3 = new PdfTextElement("Multi Page Unicode Text with Custom Font", fontCourier2)
{
Y = crtYPos,
Alignment = PdfTextAlignment.Center
};
textRenderInfo = pdfDocument.AddText(pdfTitle3);
crtYPos = textRenderInfo.LastPageRectangle.Bounds.Bottom + ySeparator;
string dejaVuRegularFontFile = Path.Combine(fontsPath, "DejaVuSerif.ttf");
// Create an Unicode TrueType font from file
PdfFont trueTypeFont = PdfFontManager.CreateFont(dejaVuRegularFontFile, 16f,
PdfFontStyle.Normal, PdfColor.Black);
// Add long Unicode text using the TrueType font, allowing continuation on next pages
PdfTextElement pdfText1 = new PdfTextElement(alfabetString, trueTypeFont)
{
X = crtXPos,
Y = crtYPos,
Alignment = PdfTextAlignment.Left,
ContinueOnNextPage = true
};
// Draw a rectangle around rendered text in each page
pdfText1.OnPageRendered = (pageNumber, boundingBox) =>
{
PdfRectangleElement border = new PdfRectangleElement(boundingBox.X, boundingBox.Y,
boundingBox.Width, boundingBox.Height + 5)
{
BorderColor = PdfColor.Blue,
};
pdfDocument.AddRectangle(border);
};
textRenderInfo = pdfDocument.AddText(pdfText1);
// Set the next page to landscape A4
pdfDocument.SetPageSize(PdfPageSize.A4, PdfPageOrientation.Landscape);
// Add a new page
pdfDocument.AddPage();
// Reset positions
crtXPos = 0;
crtYPos = 0;
// Add the same text again, with the same font, centered
PdfTextElement pdfText2 = new PdfTextElement(alfabetString, trueTypeFont)
{
X = crtXPos,
Y = crtYPos,
Alignment = PdfTextAlignment.Center,
ContinueOnNextPage = true
};
pdfText2.OnPageRendered = (pageNumber, boundingBox) =>
{
PdfRectangleElement border = new PdfRectangleElement(boundingBox.X, boundingBox.Y,
boundingBox.Width, boundingBox.Height + 5)
{
BorderColor = PdfColor.Purple,
};
pdfDocument.AddRectangle(border);
};
textRenderInfo = pdfDocument.AddText(pdfText2);
// Add a new page
pdfDocument.AddPage();
// Reset positions
crtXPos = 0;
crtYPos = 0;
PdfFont rtlTileFont = PdfFontManager.CreateStandardFont(PdfStandardFont.Courier, 16f,
PdfFontStyle.Normal, PdfColor.Purple);
PdfTextElement rtlTitle = new PdfTextElement("Add Right to Left Text", rtlTileFont)
{
X = crtXPos,
Y = crtYPos
};
textRenderInfo = pdfDocument.AddText(rtlTitle);
crtYPos = textRenderInfo.LastPageRectangle.Bounds.Bottom + ySeparator;
// Create a Unicode font that supports Arabic (RTL)
string notoSansArabicRegularFontFile = Path.Combine(fontsPath, "NotoSansArabic-Regular.ttf");
PdfFont trueTypeFontArabic = PdfFontManager.CreateFont(notoSansArabicRegularFontFile, 16f,
PdfFontStyle.Normal, PdfColor.Black);
string rtlFilePath = Path.Combine(textsPath, "RightToLeft.txt");
string rtlString = System.IO.File.ReadAllText(rtlFilePath);
// Render the right to left text
PdfTextElement pdfTextRtl = new PdfTextElement(rtlString, trueTypeFontArabic)
{
X = crtXPos,
Y = crtYPos,
Direction = PdfTextDirection.RightToLeft
};
textRenderInfo = pdfDocument.AddText(pdfTextRtl);
// Save to memory buffer
byte[] outPdfBuffer = pdfDocument.Save();
// Send PDF to browser
FileResult fileResult = new FileContentResult(outPdfBuffer, "application/pdf");
fileResult.FileDownloadName = "PdfDocument.pdf";
return fileResult;
}
private void EnsureSpaceOnPage(ref int crtYPos, int requestedHeight, PdfDocument pdfDocument)
{
if (crtYPos + requestedHeight > pdfDocument.ContentHeight)
{
pdfDocument.AddPage();
crtYPos = 0;
}
}
private string GetDemoFilesPath()
{
return m_hostingEnvironment.ContentRootPath + "/wwwroot" + "/DemoFiles/";
}
private string GetDemoImagesPath()
{
return Path.Combine(GetDemoFilesPath(), "Images");
}
private string GetDemoFontsPath()
{
return Path.Combine(GetDemoFilesPath(), "Fonts");
}
private string GetDemoTextsPath()
{
return Path.Combine(GetDemoFilesPath(), "Text");
}
}
}