我得把号码"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:\test1\A.pdf";
public const string dest = @"D:\test1\ENV1.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();
}
}
}
发布于 2018-08-04 13:50:21
这是一个问题:
PdfDictionary dict = reader.GetPageN(1);
PdfObject obj = dict.GetDirectObject(PdfName.CONTENTS);
PRStream stream = (PRStream)obj;
首先你会得到一本页面字典。那个页面字典有一个/Contents
条目。如果您阅读了PDF标准(ISO 32000),那么您将看到/Contents
条目的值可以是,可以是a流,也可以是或数组。假设它是,总是一个流。在某些情况下,您的代码可以工作,但是如果/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));
然而,这是一个非常糟糕的想法,因为在这些问题的答案中解释了原因:
您所做的假设是,您将在内容中找到一个包含值"14-1"
的文字"14-1"
。对于简单的PDF文档来说,这可能是正确的,但在许多情况下,"14-1"
在页面上的出现(您可以用眼睛阅读)并不意味着"14-1"
字符串就在内容中(您用GetPageContent
提取)。该字符串可以是XObject的一部分,也可以构造呈现"14-1"
的语法,这样xyz.Replace("14-1", "10-2")
就不会以任何方式更改xyz
。
底线: 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的付费客户的维护版本。
https://stackoverflow.com/questions/51685852
复制相似问题