iTextSharp CreateInk 方法:曲线和角

2023-11-29

我正在使用 iTextSharp 使用 PdfAnnotation.CreateInk 在 PDF 文档中绘制标记图形。我正在尝试绘制矩形,并传入五个坐标的数组。我知道 iTextSharp 有一个专门用于绘制矩形的函数,但我尝试仅使用一种方法来绘制我需要的各种标记线,而且 CeateInk 似乎应该能够做到这一点。

问题在于 CreateInk 正在绘制带有曲线而不是角的矩形。我一直不知道如何改变这一点。这个答案建议解决方案可能是创建一个 PdfAppearance;我还没弄清楚这是否有效。这是我的代码(第一位将点列表列表转换为 InkList 需要的数组数组):

    public void MarkupInk(List<List<float>> InkList){   
    float[][] Coords = new float[InkList.Count][];                      
    for (int i = 0; i < InkList.Count; i++) {                   
        float[] thisarr = InkList [i].ToArray ();
        Coords[i] = new float[InkList[i].Count];
        System.Array.Copy (thisarr, Coords [i], InkList [i].Count);  
    }
    using(MemoryStream ms = new MemoryStream ()){   
        PdfReader reader = new PdfReader (textmaster.pdfDocArr);
        PdfStamper stamper = new PdfStamper (reader, ms);
        pagerect = reader.GetPageSize (textmaster.currentfirstpage + 1);
        PdfAnnotation an2 = PdfAnnotation.CreateInk (stamper.Writer, pagerect, "", Coords);
        an2.Color = strokeColor;
        an2.BorderStyle = new PdfBorderDictionary (strokeWeight, PdfBorderDictionary.STYLE_SOLID);
        stamper.AddAnnotation (an2, textmaster.currentfirstpage+1);
        stamper.Close ();
        textmaster.pdfDocArr = ms.ToArray ();
        reader.Close ();
    }
}

非常感谢任何建议。谢谢!

编辑:按照 @mkl 的代码,我现在有了使用外观创建 PDFAnnotations 的代码。大多数注释在我使用的查看应用程序中正确显示。但有一个奇怪的行为我无法解决。

发生的情况是,在我创建另一个注释之前,最近创建的注释不会出现在查看应用程序中。因此,如果我创建注释 A,则在创建注释 B 之前它是不可见的,此时注释 A 会出现,而 B 不会出现。创建注释 C 会导致注释 B 出现,依此类推。

即使我关闭 pdf 文件和查看应用程序并从磁盘重新加载,此行为仍然存在。因此,描述上次创建的注释的数据作为 pdf 文件的一部分存在,但在我创建新注释之前它不会呈现。

我怀疑我用来创建注释和 pdfAppearances 的代码中仍然缺少一些东西。以下是创建单行注释的代码:

public void WriteLineAnnotation(List<float> polyCoords){    

    using (MemoryStream ms = new MemoryStream ()) {
        PdfReader reader = new PdfReader (textmaster.pdfDocArr);
        PdfStamper stamper = new PdfStamper (reader, ms) { AnnotationFlattening = true };
        pagerect = reader.GetPageSize (textmaster.currentfirstpage + 1);

        //Create the pdfAnnotation polyline
        PdfAnnotation polyann = PdfAnnotation.CreatePolygonPolyline (stamper.Writer, pagerect, "", false, new PdfArray (polyCoords.ToArray ()));
        polyann.Color = strokeColor;
        polyann.BorderStyle = new PdfBorderDictionary (strokeWeight, PdfBorderDictionary.STYLE_SOLID);
        polyann.Flags = iTextSharp.text.pdf.PdfAnnotation.FLAGS_PRINT;

        //create the PdfAppearance and set attributes
        PdfAppearance app = PdfAppearance.CreateAppearance (stamper.Writer, pagerect.Width, pagerect.Height);
        app.SetColorStroke (strokeColor);
        app.MoveTo (polyCoords [0], polyCoords [1]);
        app.LineTo (polyCoords [2], polyCoords [3]);
        app.Stroke ();

        //set the annotation's appearance, add annotation, clean up
        polyann.SetAppearance (PdfName.N, app);
        stamper.AddAnnotation (polyann, textmaster.currentfirstpage + 1);
        stamper.Close ();
        reader.Close ();

        //create bytearray from memorystream and send to pdf renderer
        textmaster.pdfDocArr = ms.ToArray ();
    }
}

[/code]

我是否缺少一些明显的东西?预先感谢您的任何帮助。


使用哪种注释类型

我知道 iTextSharp 有一个专门用于绘制矩形的函数,但我尝试仅使用一种方法来绘制我需要的各种标记线,而且 CeateInk 似乎应该能够做到这一点。

请注意,iText 不仅针对不同的表单具有单独的功能,这些不同的功能还创建不同类型的 PDF 注释。

特别是墨迹注释-- 您希望将其用于所有表单 -- 指定为

An 墨迹注释(PDF 1.3) 代表由一条或多条不相交路径组成的手绘“涂鸦”。

(第 12.5.6.13 节 - 墨水注释 - ISO 32000-1)

As a 徒手“涂鸦”通常不被认为是一系列直线和尖角,而是更柔和和圆润;因此,PDF 查看器自然会显示由矩形角坐标给出的墨迹注释用曲线而不是角.

当然,您可以使用外观流来提供外观的可视化,但这将是对此 PDF 功能的一个小误用。

相反,我建议您使用不同类型的注释绘制您需要的各种标记线:折线注释。它们被指定为:

多边形注释 (PDF 1.5) 在页面上显示闭合多边形。这样的多边形可以具有由直线连接的任意数量的顶点。折线注释 (PDF 1.5) 与多边形类似,但第一个和最后一个顶点不是隐式连接的。

(第 12.5.6.9 节 - 多边形和折线注释 - ISO 32000-1)

iTextSharp)也提供了这种注释的方法:

/**
 * Creates a polygon or -line annotation
 * @param writer the PdfWriter
 * @param rect the annotation position
 * @param contents the textual content of the annotation
 * @param polygon if true, the we're creating a polygon annotation, if false, a polyline
 * @param vertices an array with the vertices of the polygon or -line
 * @since 5.0.2
 */
public static PdfAnnotation CreatePolygonPolyline(
    PdfWriter writer, Rectangle rect, String contents, bool polygon, PdfArray vertices)

您最终可能仍然需要创建注释,因为并非所有 PDF 查看器(特别是所谓的“预览器”)都会生成外观,而是依赖它们预显示的 PDF 中提供的外观...

Examples

没有自己的外表

using (PdfReader pdfReader = new PdfReader(inputPath))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream))
{
    PdfArray vertices = new PdfArray(new int[]{ 100, 100, 300, 300, 100, 300, 300, 100 });
    PdfAnnotation polyLine = PdfAnnotation.CreatePolygonPolyline(pdfStamper.Writer, pdfReader.GetPageSize(1),
        "", false, vertices);
    polyLine.Color = BaseColor.GREEN;
    pdfStamper.AddAnnotation(polyLine, 1);
}

添加这个:

Screenshot

在 PDF 查看器中支持注释,包括根据规范生成外观。

有着自己的外貌

using (PdfReader pdfReader = new PdfReader(inputPath))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream))
{
    Rectangle pageSize = pdfReader.GetPageSize(1);
    PdfArray vertices = new PdfArray(new int[] { 100, 100, 300, 300, 100, 300, 300, 100 });
    PdfAnnotation polyLine = PdfAnnotation.CreatePolygonPolyline(pdfStamper.Writer, pageSize,
        "", false, vertices);
    polyLine.Color = BaseColor.GREEN;

    PdfAppearance appearance = PdfAppearance.CreateAppearance(pdfStamper.Writer, pageSize.Width, pageSize.Height);
    appearance.SetColorStroke(BaseColor.RED);
    appearance.MoveTo(100, 100);
    appearance.LineTo(300, 300);
    appearance.LineTo(100, 300);
    appearance.LineTo(300, 100);
    appearance.Stroke();

    polyLine.SetAppearance(PdfName.N, appearance);
    pdfStamper.AddAnnotation(polyLine, 1);
}

添加这个

Screenshot

在支持注释的 PDF 查看器中,根据规范带来注释。

(我在外观中明确使用了不同的颜色,以确保 PDF 查看器显示我的外观并且不会自行创建外观。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iTextSharp CreateInk 方法:曲线和角 的相关文章

  • 为什么这个 SIMD 数组添加示例与简单的实现相比没有表现出任何性能提升?

    class Program static void Main string args Console WriteLine Vector IsHardwareAccelerated SIMD supported SIMD not suppor
  • 将 Google 云端硬盘访问权限委派给服务帐户失败

    我参与构建了一个内部使用的应用程序 用户可以通过该应用程序上传文件 并将其存储在 Google Drive 中 由于建议不要使用服务帐户作为文件所有者 因此我希望代表公司系统管理员有权访问的指定用户帐户上传应用程序 我已经创建了该应用程序以
  • 从 WatchOS 捕获 Apple Watch 的型号标识符

    似乎没有任何记录的官方方法可以从手表应用程序获取 Apple Watch 模型 但有一篇文章显示了特殊用途sysctlbyname 如何确定Apple Watch型号 https stackoverflow com questions 49
  • pop() 期间提升 Fibonacci 堆访问冲突

    Context 我目前正在实现某种形式的 A 算法 我决定使用 boost 的斐波那契堆作为底层优先级队列 我的图表是在算法运行时构建的 作为我使用的顶点对象 class Vertex public Vertex double double
  • 共享库 C++ Makefile

    我需要编译胖二进制文件才能在另一台 Linux 机器上使用它 但缺少一些库 因此据我了解 我应该使用一些 shared 选项来编译它 但我不明白如何为此配置 Makefile 目前我的 makefile 如下所示 CC g CC FLAGS
  • 如何正确使用memcpy?

    我有一个mainbuf bufsize 最初为空 我正在阅读一些输入 read fd otherbuf sizeof otherbuf 分配给不同的字符串otherbuf 每次我分配一个新字符串给otherbuf我想将其附加到mainbuf
  • 如何使用 lstat() 确定是否为硬链接

    我的操作系统是linux 我用 C 编程 我知道我可以使用 lstat 来识别软链接 即使用 S ISLNK st st mode 但我如何识别该链接是硬链接呢 如果链接是硬链接 它将被视为常规文件 但是 我还想区分常规文件和硬链接 有什么
  • C++ 局部变量销毁顺序

    C 11 中是否存在局部变量释放的定义顺序 更简洁地说 同一作用域中两个局部变量的析构函数的副作用将以什么顺序变得可见 e g struct X X do something int main X x1 X x2 return 0 Is x
  • C# 中的 memcpy 函数 [重复]

    这个问题在这里已经有答案了 可能的重复 C memcpy 等效项 https stackoverflow com questions 510971 c memcpy equivalent 相当于什么memcpyC 中的函数 正如已经说过的
  • 处理可选依赖项 (C#)

    我们有一个可以选择与 TFS 集成的应用程序 但是由于集成是可选的 所以我显然不希望所有机器都需要 TFS 程序集作为要求 我应该怎么办 我是否可以在主程序集中引用 TFS 库 并确保在使用 TFS 集成时仅引用 TFS 相关对象 或者 更
  • 在 UserControl C# .NET 中添加/停靠控件

    我正在编写一个 UserControl 它以编程方式添加子控件 目前我正在添加新的控件 如下所示 this Controls Add new Control Height 16 Dock DockStyle Top 我遇到的问题是新控件添加
  • 如何重命名 MacOS/X 程序中的程序名称菜单标签?

    我有一个在 MacOS X 下运行的基于 Qt 的 GUI 程序 我希望能够更改该程序的第一个菜单标题的标签 即此屏幕截图中用红色圈出的标签 有没有一种编程方法可以做到这一点 假设不存在基于 Qt 的解决方案 则 Objective C 本
  • 为什么 VS 2008 在 Intellisense 中不显示 String 类的扩展方法

    由于 String 实现了IEnumerable
  • 我不明白这个霍夫曼算法的实现

    template
  • 像 MS Excel 一样在 C++ 中舍入双精度值

    我在网上进行了搜索 但找不到解决我的问题的方法 我只是想要一个像 MS Excel 那样对双精度值进行舍入的函数 这是我的代码 include
  • 运行 SQL Server 报告服务时如何解决“远程服务器返回错误:(401) 未经授权”?

    我正在用这个code http www codeproject com Articles 25994 Creating a Proxy to Download PDF Reports from SRS从 SSRS 创建和下载 PDF 报告
  • 当调试器退出且没有调用堆栈时,用于跟踪 C# 崩溃的工具?

    我有一个大型 复杂的 C GUI 应用程序 它以完全可重现的方式崩溃 但我无法轻松诊断崩溃的原因 因为调试会话不是以通常的方式使用调用堆栈破坏调试器 而是完全退出 唯一的提示是输出窗口末尾有一条消息 STATUS STACK BUFFER
  • MVC - 从视图调用控制器

    我是 MVC 新手 我正在使用 MVC 开发一个 Web 应用程序 该应用程序仅包含一个页面 所以在这个视图中我必须填充多个数据 假设应用程序是 新闻提要 应用程序 我需要填充最近的新闻 您喜欢的新闻 您朋友推荐的新闻等 那么我应该从视图到
  • 着色器可以旋转形状以面向相机吗?

    我制作了一个球出现在 3D 空间中的场景 三角球耗费大量资源 所以我使用带有球纹理的二维表面 四边形 来完成此操作 但现在我需要在每次相机移动时调整形状的方向 我使用位置变换和 LookAt 方法来完成此操作 问题是我可以优化这个吗 如果可
  • C++ 中的 golang 风格“延迟”[重复]

    这个问题在这里已经有答案了 我正在阅读有关 go 语言的defer http blog golang org defer panic and recover陈述 它允许您指定函数结束时要执行的操作 例如 如果您有一个文件指针或资源 则只需指

随机推荐

  • Android:展开/折叠动画

    假设我有一个垂直的 LinearLayout v1 v2 默认情况下 v1 可见 GONE 我想用展开动画显示 v1 并同时按下 v2 我尝试过这样的事情 Animation a new Animation int initialHeigh
  • python zlib如何解压多个对象

    我尝试在我的文件上写入许多 zlib 块 有没有办法可以从我的文件中获取所有未压缩的内容 从下面的示例代码我只能得到我的第一个数据 预先感谢您的任何意见 Python 3 6 8 Anaconda Inc default Dec 29 20
  • xsd 从枚举或等效类型中选择多个值

    我有以下 XSD 示例
  • 以编程方式设置 AUTO_INCRMENT 值

    所以这有效 ALTER TABLE variation AUTO INCREMENT 10 但我想这样做 ALTER TABLE variation AUTO INCREMENT SELECT MAX id 1 FROM old db va
  • Java 中的字符串解析,使用 split 分隔符选项卡“\t”

    我正在处理一个以制表符分隔的字符串 我正在使用以下方法来完成此操作split功能 并且在大多数情况下都有效 当某个字段丢失时就会出现问题 因此我不会在该字段中获取 null 而是获取下一个值 我将解析后的值存储在字符串数组中 String
  • 为什么我要 make() 或 new() ?

    介绍文档用了很多段落来解释之间的区别new and make 但实际上 您可以在本地范围内创建对象并返回它们 为什么要使用这对分配器 Go 有多种内存分配和值初始化的方式 T someLocalVar new make 创建复合文字时也可能
  • 如何在 IIS 中托管 WCF 服务而无需 SVC 文件

    我想在 IIS 中部署双接口 SOAP REST XML JSON WCF 服务 只需一个配置文件和二进制文件 URL 中没有 svc 文件 我们使用VS2012和 Net 4 5 我们有类似的东西 我遵循这里的指南 http blogs
  • 使用 chrome 驱动程序/firefox 驱动程序时如何更改 Webdriver 中的文件下载位置

    我试图通过使用特定文件夹内的 另存为 选项来保存图像 我找到了一种方法 可以右键单击要使用另存为选项保存的图像 但我遇到的问题是在获取操作系统窗口询问在哪里保存文件后 我无法发送所需的位置 因为我不知道该怎么做 我浏览了这个论坛上提出的类似
  • SwiftUI - Mapkit - 绑定 Mapkit 并在注释标注按钮上显示视图

    我有一个 SwiftUI 应用程序 其中显示了一张地图 使用由 UIViewRepresentable 制作的 Mapkit 并显示了不同的注释 在每个注释上 我都实现了一个标注按钮 我想在按下按钮时完全更改主视图 我的想法是使用主视图和地
  • 如何使用 itext 7.1.0 将以文本为内容的矩形旋转到某个角度(例如逆时针方向 90')?

    我必须有一个矩形 其中包含一些上下文作为文本 我必须将矩形旋转到某个角度 例如逆时针 90 这样内容也会旋转 然而 当我编写这段代码时 它只显示一个矩形 这是代码 package main import java io FileNotFou
  • XSLT 1.0 分组依据

    我有以下 XML 数据
  • 有没有办法在 pandas 数据框中附加列表? [复制]

    这个问题在这里已经有答案了 我在 pandas 中有一个专栏dataframe dfr其中有一个空列表 当我尝试附加它时 整个列都被更改 下面是附加的代码 N 10 Nr list range 10 dfr pd DataFrame Nr
  • 计算图像浏览次数

    我想要一个图像代码来计算图像被查看的次数 无论图像在哪个网站上找到 我想使用 img src 标签 并让 src 指向一个 php 页面 该页面计算该视图 然后返回要查看的图像 我在想这样的事情 img src www mywebsiteu
  • 在导航选项卡上切换处于活动状态的 css 类

    我对 Vue 还很陌生 所以我正在构建一个测试项目来尝试一下 我有一些标签 div class tabs ul li class is active a first tab a li li a second tab a li li a th
  • 在 R 中将数据帧按 3 列拆分为所有可能的数据帧组合

    我需要从原始数据帧拆分为 3 列的所有可能组合中接收所有可能的数据帧 所有数据框必须包含 id 列 我陷入了困境 不知道如何保存所有可能的数据帧 以便可以进一步处理所有数据帧 想法之一是将它们保存到列表中 但我仍然不知道如何将所有必要的列绑
  • 通过 ref 传入对象

    有什么区别 public function Foo ref Bar bar bar Prop 1 public function Foo Bar bar bar Prop 1 本质上 ref 的意义是什么 对象不总是通过引用吗 关键是你从来
  • 重写所有 URL

    我想重写类似的东西 http www example com index php var1 val1 var2 val2 var3 val3 Into http www example com var1 val1 var2 val2 var
  • C++:为事件处理程序创建匿名类

    免责声明 该描述包含许多 Qt 细节 他们没有必要回答这个问题 我只是想给你介绍一下背景 我需要对此做出反应focusInEvent of a QTextEdit 不幸的是 这不能作为信号使用 这就是为什么我需要子类化QTextEdit 由
  • 从另一个 ViewController 获取 NSDate 到 titleForHeaderInSection

    我有两个视图 第一个是日历 第二个是带有tableView 我正在尝试显示从第一个视图中选择的日期 设法获取里面选定的日期ViewDidLoad我的 secondaryView 的方法 我如何添加我的NSDate to my NSStrin
  • iTextSharp CreateInk 方法:曲线和角

    我正在使用 iTextSharp 使用 PdfAnnotation CreateInk 在 PDF 文档中绘制标记图形 我正在尝试绘制矩形 并传入五个坐标的数组 我知道 iTextSharp 有一个专门用于绘制矩形的函数 但我尝试仅使用一种