pdf - 使用 iTextSharp 删除 PDF 中的对象并保存

标签 pdf itext

这是一个 OCR 出错的案例。我需要从 PDF 中删除隐藏文本,但我很难弄清楚如何做到这一点。

隐藏文本位于始终名为/QuickPDFsomething 的区域中,该区域位于页面的/Resources 字典中的/XObject 字典下方。

iRups CS Viewer

我已经尝试过这两件事,但都不起作用,所以我显然做错了什么。

选项 1 - 终止 obj - PDF 无法在 Acrobat 中打开,并指出“此页面存在错误”。 Acrobat 可能无法正确显示页面,但看起来没问题。 Pitstop 出现“严重解析器故障:XObject 资源丢失”的情况。

PdfReader.KillIndirect(obj);
oPdfFile.GetPdfReader().RemoveUnusedObjects();
var stamper = new PdfStamper(oPdfFile.GetPdfReader(), new FileStream(@"C:\temp.pdf", FileMode.Create));
stamper.Close();

选项 2 - CleanupProcessor - 引发有关“无法从具有索引像素格式的图像创建图形对象”的异常。

var stamper = new PdfStamper(oPdfFile.GetPdfReader(), new FileStream(@"C:\temp.pdf", FileMode.Create));
var cleanupLocations = new List<PdfCleanUpLocation>();
var pageRect = oPdfFile.GetPdfReader().GetCropBox(1);
cleanupLocations.Add(new PdfCleanUpLocation(1, pageRect));
PdfCleanUpProcessor cleaner = new PdfCleanUpProcessor(cleanupLocations, stamper);
cleaner.CleanUp();
stamper.Close();

我想删除/QuickPDF 对象(在此图像中为 41 0 R),并将其从使用/QuickPDF Do 调用它的内容流中删除。

很遗憾,我无法提供 PDF。

关于如何执行此操作有任何提示吗?

最佳答案

我不想回答自己的问题,但我想分享我找到的解决方案,以防其他人需要。

经过几天的研究,我发现上面的选项 1 确实会删除该对象,而我从 PitStop 得到的异常是因为内容流引用了/QuickPDF XObject。

所以我尝试在这里遵循@mkl的解决方案Removing Watermark from PDF iTextSharp但它不断将不需要的数据放入旋转我的 PDF 的内容流中。

然后我在这里找到了@Chris的解决方案Removing Watermark from a PDF using iTextSharp尽管我不确定这个解决方案有多稳定,但它似乎有效。

这是我从内容流中删除/QuickPDF 的解决方案:

int numPages = oPdfFile.GetPdfReader().NumberOfPages;
int pgNumber = 1;

PdfDictionary page = oPdfFile.GetPdfReader().GetPageN(pgNumber);
PdfArray contentarray = page.GetAsArray(PdfName.CONTENTS);
PRStream stream;
string content;
if (contentarray != null)
{
    //Loop through content
    for (int j = 0; j < contentarray.Size; j++)
    {
        stream = (PRStream)contentarray.GetAsStream(j);
        content = Encoding.ASCII.GetString(PdfReader.GetStreamBytes(stream));
        string[] tokens = content.Split('\n');
        for (int i = 0; i< tokens.Length; i++)
        {
            if (tokens[i].Contains("/QuickPDF"))
            {
                tokens[i] = string.Empty;
            }
        }

        string outstr = string.Join("\n", tokens.Select(p => p).ToArray());
        byte[] outbytes = Encoding.ASCII.GetBytes(outstr);
        stream.SetData(outbytes);
    }
}

关于pdf - 使用 iTextSharp 删除 PDF 中的对象并保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39251209/

相关文章:

java - 必须使用 iText java 删除 pdf 中页眉和页脚中的行

java - 使用 ITextRenderer pdf 中没有中文单词

javascript - 使用 JSPDF 从复杂的 html 表生成 PDF

java - 如何在java中的itext pdf库中为段落添加边框?

Android PDF Writer(APP) 编码

.net - iTextSharp,一款流行的 PDF 生成工具。版本 5.5.11 符合 FIPS 标准。

页面上的 Java iText 静态容器

java - 使用 IText 在 PDF 中嵌入非嵌入字体

pdf - 如何使用 pandoc 获取本地化引号?

pdf - DataDynamics.ActiveReports.Export.Pdf.PdfExport 引用的语言编码问题