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