删除iTextSharp中的所有嵌入文件

时间:2017-01-10 02:36:51

标签: java c# itext

由于我对iTextSharp感兴趣,我需要学习C#。由于我知道一些AutoHotkey(用于Windows的简单而强大的脚本编程语言),对我来说更容易。但是,我经常遇到用Java编写的代码,据说很容易转换为C#。不幸的是,我遇到了一些问题。我们来看看Bruno Lowagie编写的原始代码。

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfDictionary root = reader.getCatalog();
    PdfDictionary names = root.getAsDict(PdfName.NAMES);
    names.remove(PdfName.EMBEDDEDFILES);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.close();
}

这是我自己写的:

static void removeFiles(string sourceFilePath, string destFilePath)
{

    try
    {
    // read src file
    FileStream inputStream = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read, FileShare.None);
    Document source = new Document();
    // open for reading
    PdfWriter reader = PdfReader.GetInstance(inputStream);
    source.Open();

    // create dest file
    FileStream outputStream = new FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite, FileShare.None);
    Document dest = new Document();
    PdfWriter writer = PdfWriter.GetInstance(dest, inputStream); // open stream from src

    // remove embedded files from dest
    PdfDictionary root = dest.getCatalog().getPdfObject();
    PdfDictionary names = root.getAsDictionary(PdfName.Names);
    names.remove(PdfName.EmbeddedFiles);

    // close all
    source.Close();
    dest.Close();   

    }
    catch (Exception ex)
    {
    }

}

不幸的是,有许多错误,例如:

'Document' does not contain a definition for 'getCatalog' and no extension method 'getCatalog' 'PdfReader' does not contain a definition for 'GetInstance'

这是我在无数个小时的编码和谷歌搜索后设法做到的。

1 个答案:

答案 0 :(得分:0)

有一些iTextSharp示例可用。例如,请参阅:How to read a PDF Portfolio using iTextSharp

我对C#了解不多,但这是第一次尝试修复您的代码:

static void RemoveFiles(string sourceFilePath, string destFilePath)
{
    // read src file
    FileStream inputStream = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read, FileShare.None);
    // open for reading
    PdfReader reader = new PdfReader(inputStream);
    FileStream outputStream = new FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite, FileShare.None);
    PdfStamper stamper = new PdfStamper(reader, outputStream);

    // remove embedded files
    PdfDictionary root = reader.Catalog;
    PdfDictionary names = root.GetAsDict(PdfName.NAMES);
    names.Remove(PdfName.EMBEDDEDFILES);

    // close all
    stamper.Close();
    reader.Close();   
}

请注意,我不明白您使用DocumentPdfWriter的原因。您应该使用PdfStamper代替。另外:您只删除文档级附件。如果有文件附件注释,它们仍将出现在PDF中。