我一直在 C# 项目中使用 PdfSharp 库来保存带注释的 PDF 文件。我想使用自定义图像创建一个 RubberStamp 注释。 PfSharp 有一个很好的 RubberStamp 实现,但它不允许您指定自定义图像,只能指定像 TopSecret 这样的预定义图标。
我尝试使用自定义图章分析其他 PDF 文件,并尝试通过手动创建 XObjects、将图像添加到 Resources 以及创建 Appearance Stream 来模仿相同的结构。
长话短说,它不起作用。我有一种感觉,简单地将对象写入外观流并不是一个好主意,即使图像到达文件,我可以在 PDF 查看器中看到注释矩形,但它是一个空白的白色矩形,什么也不显示。
理想情况下,我想触发 PDFSharp 创建外观流,但经过几个小时的在线研究,我没有找到任何有用的东西。
谁能指出如何将自定义图像添加到 RubberStamp Appearance-Stream 中?或者触发 PdfSharp 重新创建外观流?
public void SavePdf()
{
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
// Create a new PDF document
PdfDocument pdfDocument = new PdfDocument();
pdfDocument.Version = 15;
// Create an empty page
PdfPage pdfPage;
pdfPage = pdfDocument.AddPage();
pdfPage.Width = XUnit.FromInch(8.5);
pdfPage.Height = XUnit.FromInch(11.00);
// Get an XGraphics object for drawing
XGraphics gfx = XGraphics.FromPdfPage(pdfPage);
// Creating the Rubber Stamp with some default settings
PdfRubberStampAnnotation cstamp = new PdfRubberStampAnnotation() { Icon = PdfRubberStampAnnotationIcon.TopSecret };
XRect rect = gfx.Transformer.WorldToDefaultPage(new XRect(new XPoint(10, 10), new XSize(200, 50)));
cstamp.Rectangle = new PdfRectangle(rect);
cstamp.Color = XColor.FromArgb(255, 0, 0);
// Load the custom image
var image = XImage.FromFile(@"c:\temp\test.bmp");
var pdfImage = new PdfImage(pdfDocument, image);
string r = pdfPage.Resources.AddImage(pdfImage); // adding the image to the Page References
// Now let's create the XForm object, and reference the image
var matrix = new PdfArray();
matrix.Elements.Add(new PdfReal(1));
matrix.Elements.Add(new PdfReal(0));
matrix.Elements.Add(new PdfReal(0));
matrix.Elements.Add(new PdfReal(1));
matrix.Elements.Add(new PdfReal(0));
matrix.Elements.Add(new PdfReal(0));
var xform = new PdfDictionary(pdfDocument);
xform.Elements.Add("/Type", new PdfName("/XObject"));
xform.Elements.Add("/Subtype", new PdfName("/Form"));
xform.Elements.Add("/FormType", new PdfInteger(1));
xform.Elements.Add("/BBox", new PdfRectangle(new XRect(10, 10, image.PointWidth, image.PointHeight)));
xform.Elements.Add("/Matrix", matrix);
xform.Elements.Add("/Resources", pdfImage.Reference);
xform.Elements.Add("/Length", new PdfInteger(0));
// Now let's create the appearance stream, and add the XForm object
var appearanceStream = new PdfDictionary(pdfDocument);
appearanceStream.Elements.Add("/N", xform);
cstamp.Elements.Add("/AP", appearanceStream);
// Add to the page
gfx.PdfPage.Annotations.Add(cstamp);
pdfDocument.Save(@"c:\temp\1.pdf");
}