由於去年的一個專案需要在PDF 新增公司二維條碼 ,當時在網上找了很多操作PDF方案,第一種Aspose.PDF,很遺憾 Aspose.PDF 有新增版權的背景還是頁尾我忘記了,不適合公司專案,最終放棄此方案。第二種FreeSpire.PDF,很遺憾Free有限制放棄了,第三種選擇OpenXml 自己去摸索太複雜放棄,最後選擇了PdfSharpCore. 二維條碼選擇的方案QRCoder,當時專案採用的.net core 3.1 ,目前專案升級到net 6.0 遇到問題,QRCoder依賴System.Drawing,但是微軟放棄 System.Drawing,推薦使用SkiaSharp。
生成二維條碼的高度和寬度,可以進行調整,以適應PDF的頁首大小
using var generator = new QRCodeGenerator(); var qr = generator.CreateQrCode("XXX", ECCLevel.M); var info = new SKImageInfo(250, 250); using var surface = SKSurface.Create(info); var canvas = surface.Canvas; canvas.Render(qr, info.Width, info.Height);
PdfSharpCore 有很多Open方法(支援PDF私有密碼模式,讀寫模式)
PdfDocument doc = PdfReader.Open(@"a.pdf", PdfDocumentOpenMode.Modify);
迴圈PDF的每一頁,增加PDF的頁首,再將二維條碼的流寫入PDF中,頁首的高度請根據PDF進行調整.
using (SKImage image = surface.Snapshot()) { PdfDocument doc = PdfReader.Open(@"a.pdf", PdfDocumentOpenMode.Modify); using (SKData p = image.Encode(SKEncodedImageFormat.Png, 100)) { using (MemoryStream stream = new MemoryStream()) { p.SaveTo(stream); float x = 90; float y = 20; stream.Position = 0; XImage headerImage = XImage.FromStream(() => stream); double width = headerImage.Size.Width / 7; double height = headerImage.Size.Height / 7; for (int i = 0; i < doc.Pages.Count; i++) { var renderer = XGraphics.FromPdfPage(doc.Pages[i]); XSize pageSize = renderer.PageSize; renderer.DrawImage(headerImage, x, y, width, height); XPen pen = new XPen(XBrushes.Gray, 0.5f); renderer.DrawLine(pen, x, y + height, pageSize.Width - x, y + height); } stream.Dispose(); stream.Close(); } var filePath = $"b.pdf"; doc.Save(filePath); } }
例子是Hololens workshop 的PDF ,實現的如下,其實還可以加頁碼頁尾這些,各位大佬可以研究一下進行分享。目前在部落格園看到了另外一個QuestPDF 可以操作PDF.
SkiaSharp.QrCode 參考:https://www.cnblogs.com/berkerdong/p/16779385.html
QuestPDF 參考:https://www.cnblogs.com/qpjlove/p/16181232.html
PdfSharpCore 更多參考: https://github.com/ststeiger/PdfSharpCore
本文來自部落格園,作者:Code的那些事,轉載請註明原文連結:https://www.cnblogs.com/honglinjia/p/16814372.html