使用iTextSharp从PDF文档中提取嵌入式控件?

时间:2014-04-18 20:01:40

标签: c#-4.0 itextsharp

我搜索过此功能但无法找到任何相关内容。我已经看过从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值与此有关。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

在努力寻找解决方案后,我现在认为获得该领域的维度(非Acro Field)是不可能的,至少我没有看到这样做的方法。我所做的就是想出一个解决方法。

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

我所做的工作是放置图像而不是文本字段。我在工作表上放置了一个彩色图像,并像放置文本字段一样调整大小/放置它们。我放置了JPG图像,因为在C#应用程序中我能够读取PDF文档,从文件中读取所有JPG图像,检索它们的宽度,高度,x轴,y轴,然后我在这些坐标上使用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文档上绘制TextFields。