如何用c#替换PDF中的文本
本文关键字:文本 PDF 替换 何用 | 更新日期: 2023-09-27 18:06:13
我在这里看到了很多解决方案,但没有一个是清晰或好的答案。
这是我的一个简单的问题,希望有一个直接的答案。
我有一个PDF文件(一个模板),它创建的文本是这样的:
{名}{姓}{地址}{电话号码}
是否有可能用我选择的文本替换这些模板的c#代码?
没有字段,没有其他复杂的东西。
有任何开源库帮助我实现这一点吗?
这个线程是死的,但是我发布了我的解决方案,为其他迷失的灵魂,可能面临这个问题在未来。不幸的是,我的公司不允许在线发布代码,所以我将描述解决方案:)。
所以基本上你要做的就是使用PdfSharp并修改这个示例来替换流中的文本,但是你必须考虑到文本可能被分割成许多括号(将流转换为字符串以查看格式是什么)。
然后,使用与此示例类似的代码逐页遍历源pdf,并通过在PdfReference项中搜索PdfContent项并替换内容流中的文本来修改当前页面。
PDF文档的"问题"在于它们天生不适合编辑。尤其是那些没有字段的。最好的方法是后退一步,查看您的流程,看看是否有办法在生成PDF之前替换文本。显然,您可能并不总是拥有这种自由。
如果您将能够替换文本,那么您应该意识到,在被替换的文本之后不会自动回流文本。如果你对此很满意,那么很少有解决方案允许你替换文本。
我知道你在寻找一个开源的解决方案,所以我不愿意给你一个商业的解决方案。我们提供了一个PDFKit.NET。它允许您将页面上的所有内容提取为所谓的形状(文本,图像,曲线等)。参见方法Page。在类型引用中创建eshapes。然后,您可以通过编程方式导航和编辑此形状结构,然后再次将其写回PDF。
如下:http://www.tallcomponents.com/pdfkit
披露:我是TallComponents的创始人,该组件的供应商
对于简单的文本替换使用iTextSharp库。下面是用一个字符串替换另一个字符串的代码。请注意,这将只替换简单的文本,并不是在所有情况下都有效。
//using iTextSharp.text.pdf;
void VerySimpleReplaceText(string OrigFile, string ResultFile, string origText, string replaceText)
{
using (PdfReader reader = new PdfReader(OrigFile))
{
for (int i = 1; i <= reader.NumberOfPages; i++)
{
byte[] contentBytes = reader.GetPageContent(i);
string contentString = PdfEncodings.ConvertToString(contentBytes, PdfObject.TEXT_PDFDOCENCODING);
contentString = contentString.Replace(origText, replaceText);
reader.SetPageContent(i, PdfEncodings.ConvertToBytes(contentString, PdfObject.TEXT_PDFDOCENCODING));
}
new PdfStamper(reader, new FileStream(ResultFile, FileMode.Create, FileAccess.Write)).Close();
}
}
正如在类似的线程中所述,这不是一个真正可能的简单方法。更简单的方法似乎是获取DocX文件并使用DocX库,该库允许简单的文字交换,然后将DocX转换为PDF(使用PDF Creator打印机或其他)。
或使用pdf sharp/migradoc创建新文档
更新PDF是困难和肮脏的。所以可能是在现有的基础上添加内容也会为你工作,因为它对我有用。如果是这样,这里是我的原始的,但工作的解决方案,涵盖了很多情况("覆盖",确实):
https://github.com/astef/PatchPdfText