前序 由於去年的一個項目需要在PDF 添加公司二維碼 ,當時在網上找了很多操作PDF方案,第一種Aspose.PDF,很遺憾 Aspose.PDF 有添加版權的背景還是頁腳我忘記了,不適合公司項目,最終放棄此方案。第二種FreeSpire.PDF,很遺憾Free有限制放棄了,第三種選擇OpenXml ...
前序
由於去年的一個項目需要在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。
1.導入negut 包
2.生成二維碼
生成二維碼的高度和寬度,可以進行調整,以適應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);
3. 用PdfSharpCore 打開 PDF文件
PdfSharpCore 有很多Open方法(支持PDF私有密碼模式,讀寫模式)
PdfDocument doc = PdfReader.Open(@"a.pdf", PdfDocumentOpenMode.Modify);
4.寫入二維碼
迴圈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.
docker 模式,需要在 dockerfile 中添加如下配置
RUN apt-get update && apt-get -y install libfontconfig1
如需要指定字體,請將欄位文件進行拷貝(比如雅黑)
COPY /xx/xxx/SIMHEI.TTF /usr/share/fonts/SIMHEI.TTF
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