使用 PdfSharp 创建自定义 RubberStamp 注释外观流

问题描述 投票:0回答:1

我一直在 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");
}
c# pdf pdfsharp
1个回答
0
投票

xform 需要是一个流,并且您必须在该流中实际绘制图像:

q
10 0 0 10 0 0 cm
/ImageID Do
Q

10 是 xform 的大小(来自代码),因此上面的代码会缩放图像以覆盖整个 xform。

/ImageID
是 xform 资源中的图像标识符(我假设 r 变量包含该值)。

请参阅下面的屏幕截图,其中显示了自定义图章注释的 PDF 文件中的 COS 对象结构。

XO0
是用作自定义外观的图像的 id。

© www.soinside.com 2019 - 2024. All rights reserved.