【问题标题】:Extracting embedded control from PDF document using iTextSharp?使用 iTextSharp 从 PDF 文档中提取嵌入式控件?
【发布时间】:2014-04-18 20:01:39
【问题描述】:

我已经搜索过此功能,但找不到任何相关内容。我已经看到了从 PDF 文档中提取图像、文本和 Acro 字段的各种示例,但我想要一些不同的东西。我已经将一个 Excel 工作表转换为 PDF,其中有几个 ActiveX TextFields。转换为 PDF 后,这些字段不再是交互式的。我正在从 C# 应用程序读取 PDF 文件,我想检索这些 ActiveX 文本字段的坐标,然后需要删除这些字段。我正在尝试通过阅读 PDF 文件资源,

var fields = (PdfDictionary)page.Get(PdfName.CONTENTS);

我不确定要使用哪个正确的枚举值,或者是否可以通过这种方式检索字段。 示例 PDF 文件可以从这里查看PDF File Link

更新:到目前为止,我已经设法确定从 excel 导出到 pdf 时的 ActiveX 文本字段是这样的(如果我弄错了,抱歉),

<</Type/XObject/Subtype/Form/BBox[ 0 0 377.07 40.005] /Matrix[ 0.19094 0 0 1.7998 0 0] /Filter/FlateDecode/Length 155>>

我还在我的代码中检索了这些值。我只需要每个字段的坐标,我的猜测是 BBox 和 Matrix 值与此有关。有什么建议吗?

【问题讨论】:

  • 基本上,如果字段不是(Acroform 或 XFA)表单字段,它们就不是字段,只有我们(查看 PDF)认为是字段框的行。因此,一般来说,您必须收集线条并寻找特定的矩形。但是,对于您的特定 PDF,单个“字段”使用单个 xobjects 表示。因此,您可以使用更新帖子的数据以及绘制 xobject 时的当前转换矩阵来获取坐标,例如3.92 0 0 0.40333 183.42 582.54 cm /Meta9 Do 为公司名称。不过,这很脆弱。
  • 感谢 mkl 的回复。我不完全理解它“您可以使用更新帖子的数据以及绘制 xobject 时的当前转换矩阵来获取坐标”。我已经从 MS Excel 中放置了这些 XOBject,然后将其转换为 PDF。应用程序不知道用于放置 XObject 的坐标。从值 "3.92 0 0 0.40333 183.42 582.54" 我可以理解 183.42 和 582.54 提到了位置,但是我在哪里可以获得尺寸?
  • 从值...我可以理解... - 此外,3.92 0 0 0.40333 是一个缩放子矩阵,应用于您已经找到的0.19094 0 0 1.7998 矩阵之后.将此缩放应用于边界框大小377.07 40.005 应该会产生 xobject 的尺寸。除非 xobject 本身有一些边距,否则它们应该是“字段”尺寸。

标签: c#-4.0 itextsharp


【解决方案1】:

在努力寻找解决方案之后,我现在认为获得场地(非 Acro 场地)的尺寸是不可能的,至少我没有看到这样做的方法。我所做的是想出一个变通方法。

当时我正在从 MS Excel 创建表单,并希望将它们转换为交互式 pdf 文件。在 C# 中创建它们的原因是将其作为批处理。我在 Excel 的工作表上放置了各种文本字段,然后将 PDF 文件传递​​给 C# 应用程序,以便所有字段都转换为交互式文本字段,最终用户能够填写它们,然后将它们提交到服务器,这是另一个故事。

我所做的解决方法是放置图像而不是文本字段。我在工作表上放置了一个单色图像,并像放置文本字段一样调整它们的大小/放置它们。我放置了 JPG 图像,因为然后在 C# 应用程序中,我能够读取 PDF 文档,从文件中读取所有 JPG 图像,检索它们的宽度、高度、xaxis、yaxis,然后我在这些坐标上使用 iTextSharp 绘制了文本字段。我知道我的要求是独一无二的,如果有人有相同的要求,那么下面是我使用的代码,

public static void ProcessRequest(PdfReader reader)
    {
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        MyImageRenderListener listener = new MyImageRenderListener();

        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            parser.ProcessContent(i, listener);
        }

        if (listener != null)
        {
            bool success = DrawTextFields(reader, pdfPath, newFullFilePath, listener.ImageCoordinates);
        }
    }

下面是自定义监听类。

public class MyImageRenderListener : IRenderListener
{
    public void RenderText(TextRenderInfo renderInfo) { }
    public void BeginTextBlock() { }
    public void EndTextBlock() { }
    public List<ImageCoordinates> ImageCoordinates = new List<ImageCoordinates>();


    public void RenderImage(ImageRenderInfo renderInfo)
    {
        PdfImageObject image = renderInfo.GetImage();
        PdfName filter = image.Get(PdfName.FILTER) as PdfName;

        // PdfName.DCTDECODE   --  (For JPG Images)
        // PdfName.JPXDECODE   --  (For JP2 Images)
        // PdfName.FLATDECODE  --  (For PNG Images)
        // PdfName.LZWDECODE   --  (For TIFF Images)

        if (filter != null)
        {
            if (filter == PdfName.DCTDECODE)
            {
                        Matrix ctm = renderInfo.GetImageCTM();
                        ImageCoordinates coord = new ImageCoordinates();
                        coord.Width = ctm[Matrix.I11];
                        coord.Height = ctm[Matrix.I22];
                        coord.XAxis = ctm[Matrix.I31];
                        coord.YAxis = ctm[Matrix.I32];

                        ImageCoordinates.Add(coord);
            }
        }
    }
}

ImageCoordinates 类是一个包含属性的简单类。

class ImageCoordinates
{
    private float width;
    public float Width
    {
        get { return width; }
        set { width = value; }
    }

    private float height;
    public float Height
    {
        get { return height; }
        set { height = value; }
    }

    private float xaxis;
    public float XAxis
    {
        get { return xaxis; }
        set { xaxis = value; }
    }

    private float yaxis;
    public float YAxis
    {
        get { return yaxis; }
        set { yaxis = value; }
    }
}

这里我没有提到 DrawTextField 方法,因为网上有很多关于在 PDF 文档上绘制 TextField 的教程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2014-06-06
    • 2013-01-08
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多