无法将类型 'iTextSharp.text.pdf.PdfArray' 的对象强制转换为类型 'iTextSharp.text.pdf.PRStream'



我必须将数字"14-1"替换为"10-2"。我正在使用以下iText代码,但得到以下类型转换错误。有人能帮我修改程序并删除铸造问题吗:

我有很多PDF,我必须替换相同位置的数字。我还需要从逻辑上理解如何做到这一点:

using System;
using System.IO;
using System.Text;
using iTextSharp.text.io;
using iTextSharp.text.pdf;
using System.Windows.Forms;
namespace iText5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public const string src = @"D:test1A.pdf";
public const string dest = @"D:test1ENV1.pdf";
private void button1_Click(object sender, EventArgs e)
{
FileInfo file = new FileInfo(dest);
file.Directory.Create();
manipulatePdf(src, dest);
}
public void manipulatePdf(String src, String dest)
{
PdfReader reader = new PdfReader(src);
PdfDictionary dict = reader.GetPageN(1);
PdfObject obj = dict.GetDirectObject(PdfName.CONTENTS);
PRStream stream = (PRStream)obj;
byte[] data = PdfReader.GetStreamBytes(stream);
string xyz = Encoding.UTF8.GetString(data);
byte[] newBytes = Encoding.UTF8.GetBytes(xyz.Replace("14-1", "10-2"));
stream.SetData(newBytes);
PdfStamper stamper = new PdfStamper(reader, new FileStream(dest, FileMode.Create));
stamper.Close();
reader.Close();
}
}
}

这是一个问题:

PdfDictionary dict = reader.GetPageN(1);
PdfObject obj = dict.GetDirectObject(PdfName.CONTENTS);
PRStream stream = (PRStream)obj;

首先你会得到一本字典。该页字典有一个/Contents条目。如果您阅读PDF标准(ISO 32000(,则会发现/Contents条目的值可以是流、数组。您假设它总是一个流。在某些情况下,您的代码可以工作,但在/Contents条目的值是对一系列流的引用的数组的情况下,会出现类强制转换错误(原因很明显,流的数组与流不同(。

我认为你想做这样的事情:

byte[] data = reader.GetPageContent(i);
string xyz = PdfEncodings.ConvertToString(data, PdfObject.TEXT_PDFDOCENCODING);
string abc = xyz.Replace("14-1", "10-2");                 
reader.SetPageContent(i, PdfEncodings.ConvertToBytes(abc, PdfObject.TEXT_PDFDOCENCODING));

然而,这是一个非常糟糕的主意,因为这些问题的答案中解释了原因:

  • 使用itextSharp替换pdf文档中的文本
  • PDF文本替换不起作用
  • C#或.net中是否有API可以编辑pdf文档
  • 使用ContentByteUtils进行原始PDF操作

您假设您将在内容中找到值为"14-1"的文字string。对于简单的PDF文档来说,这可能是正确的,但在许多情况下,"14-1"在页面上的出现(你可以用眼睛阅读(并不意味着字符串"14-1"就存在于内容中(你用GetPageContent提取的(。该字符串可以是XObject的一部分,也可以以xyz.Replace("14-1", "10-2")不会以任何方式更改xyz的方式构造用于呈现"14-1"的语法。

一句话:PDF不是一种可编辑的格式。PDF文件中的页面由添加在绝对位置的内容组成。如果更改页面上的内容,则不会回流(例如,如果添加额外内容,则现有内容不会移动到下一行或下一页(。您不应该编辑PDF文档,而应该编辑用于创建文档的源,然后从该源创建新的PDF。

重要信息:您使用的是旧版本的iText。两年多前,我们放弃了iTextSharp的名称,转而支持iText for.NET。iText的当前版本是iText 7.1.2;请参阅Nuget:https://www.nuget.org/packages/itext7/

许多人认为iText 5.5.13是最新版本。这种假设是错误的。iText 5已停产,不再受支持。最近的5.5.x版本是维护版本,适用于无法立即迁移到iText 7的付费客户。

相关内容

最新更新