【问题标题】:Duplicate a page on Document using iTextSharp使用 iTextSharp 在 Document 上复制页面
【发布时间】:2014-12-05 14:46:57
【问题描述】:

我正在使用 iTextSharp 创建 PDF。此 PDF 将包含 n-pages,其中所有页面都完全相同,除了小的文本更改。所以我想克隆我的Document 对象,进行更改并作为新页面添加到文档中,可以吗?

编辑:澄清一下我必须做的事情。我正在创建一个文档,现在作为iTextSharp.Document 对象在内存中。用户将其保存到他的计算机(它是一个 Web 应用程序),但在这种情况下,他将保存的文件应该由 3 页组成,每一页都具有相同的内容,除了底部的一个段落发生变化。

我现在所做的是在文档的每一页上重新创建表格\段落等,我想要的是获取我创建的代表一页的Document,将其克隆 3 次,然后作为文档页面加入。

【问题讨论】:

  • 也许很容易,也许很难。这完全取决于您要应用的小文本更改 的性质。你能详细说明一下吗?
  • 每一页都会改变一段文字。但基本上我需要更多的是在文档上复制一页n 次。例如,我创建第 1 页,现在我需要第 3 页和第 4 页与第 1 页相同。
  • 我的回答中指出,是什么让您无法使用 PdfSmartCopy
  • PdfSmartCopy 不需要物理文件才能工作吗?我没有这些,我在内存上做所有事情并向另一个函数发送一个 MemoryStream ,它将被发送到响应对象
  • 不,PdfSmartCopy 需要一个 PdfReader 实例。您可以使用byte[] 创建这样的实例。您可以从包含完整 PDF 的 MemoryStream 获得 byte[]。在我回答的 Java 示例中,我有 reader = new PdfReader(baos.toByteArray());,这也存在于 C# 中。

标签: pdf itextsharp


【解决方案1】:

这是一个可能的解决方案。这可能不是您想要的解决方案,但是……这不是我们的错,因为您让我们猜测您的意图。

假设您有一个单页的 PDF 文档:state.pdf

您想在此页面中添加一些文本,使其看起来像这样:california.pdf

你不想这样做一次,但你想多次这样做,所以你得到这个:united_states_2.pdf

在这种情况下,您需要PdfStamper(将内容添加到单个页面)和PdfSmartCopy(组合不同页面而不会使文档膨胀)的组合。

这显示在FillFlattenMerge2 示例中:

public void manipulatePdf(String src, String dest) throws DocumentException, IOException {
    Document document = new Document();
    PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest));
    document.open();
    ByteArrayOutputStream baos;
    PdfReader reader;
    PdfStamper stamper;
    AcroFields fields;
    StringTokenizer tokenizer;
    BufferedReader br = new BufferedReader(new FileReader(DATA));
    String line = br.readLine();
    while ((line = br.readLine()) != null) {
        // create a PDF in memory
        baos = new ByteArrayOutputStream();
        reader = new PdfReader(SRC);
        stamper = new PdfStamper(reader, baos);
        fields = stamper.getAcroFields();
        tokenizer = new StringTokenizer(line, ";");
        fields.setField("name", tokenizer.nextToken());
        fields.setField("abbr", tokenizer.nextToken());
        fields.setField("capital", tokenizer.nextToken());
        fields.setField("city", tokenizer.nextToken());
        fields.setField("population", tokenizer.nextToken());
        fields.setField("surface", tokenizer.nextToken());
        fields.setField("timezone1", tokenizer.nextToken());
        fields.setField("timezone2", tokenizer.nextToken());
        fields.setField("dst", tokenizer.nextToken());
        stamper.setFormFlattening(true);
        stamper.close();
        reader.close();
        // add the PDF to PdfCopy
        reader = new PdfReader(baos.toByteArray());
        copy.addDocument(reader);
        reader.close();
    }
    br.close();
    document.close();
}

如果这不是您想要的,请澄清您的问题。无论如何:这个答案是对您问题的许多可能的正确解释之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多