【问题标题】:itext add text to pdf increase file sizeitext 将文本添加到 pdf 增加文件大小
【发布时间】:2016-08-04 01:42:38
【问题描述】:

我有一个 PDF 文件,我想在每一页上添加一个简单的数字。

这是我的代码:

reader = new PdfReader(fileOut);
Document final = new Document(reader.GetPageSize(1));
PdfWriter w = PdfWriter.GetInstance(final, new FileStream(finalFile, FileMode.Create, FileAccess.Write));
w.SetFullCompression();

final.Open();

for (int i = 1; i <= reader.NumberOfPages; i++)
{
    final.NewPage();
    PdfContentByte cb = w.DirectContent;
    ControlNumberTimes(cb, "C"+i, 560, 725, 270, Element.ALIGN_LEFT);
    cb.AddTemplate(w.GetImportedPage(reader, i), 0, 0);
}

final.Close();
reader.Close();



private static void ControlNumberTimes( PdfContentByte cb1, string control, int x, int y, int rotation, int allign )
{
    cb1.BeginText();

    cb1.SetColorFill(BaseColor.BLACK);
    cb1.SetFontAndSize(BaseFont.CreateFont("C:\\windows\\Fonts\\times.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED), 7.5f);
    cb1.ShowTextAligned(allign, control, x, y, rotation);
    cb1.EndText();
}

在添加此文本之前,PDF 文件大小为 3.6 Mb,之后大小为 11 Mb。 我做错了什么?

这是我现在的代码:

string finalFile = System.IO.Path.GetDirectoryName(fileOut) + "\\" +
                           System.IO.Path.GetFileNameWithoutExtension(fileOut) + "_num.pdf";

        reader = new PdfReader(fileOut);

        using (FileStream fs = new FileStream(finalFile, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            using (PdfStamper stamper = new PdfStamper(reader, fs))
            {
                int pageCount = reader.NumberOfPages;
                for (int i = 1; i <= pageCount; i++)
                {
                    ColumnText.ShowTextAligned(stamper.GetUnderContent(i), Element.ALIGN_CENTER, new Phrase(
                        $"C{i}"), 560, 725, 0);
                }
            }
        }

由于机密信息,我无法共享的 pdf 文件。

【问题讨论】:

  • 由于机密信息,我无法共享的 pdf 文件。 - 很遗憾,因为代码乍一看还可以,所以很可能您的问题是由于该文件的一些特殊性。
  • 我已经尝试了另一个 pdf 文件,现在返回的文件大小还可以。我认为问题出在原始输入的 pdf 文件上。非常感谢您的帮助。

标签: c# pdf itextsharp


【解决方案1】:

这是完全错误的:

reader = new PdfReader(fileOut);
Document final = new Document(reader.GetPageSize(1));
PdfWriter w = PdfWriter.GetInstance(final, new FileStream(finalFile, FileMode.Create, FileAccess.Write));
w.SetFullCompression();
final.Open();
for (int i = 1; i <= reader.NumberOfPages; i++)
{
    final.NewPage();
    PdfContentByte cb = w.DirectContent;
    ControlNumberTimes(cb, "C"+i, 560, 725, 270, Element.ALIGN_LEFT);
    cb.AddTemplate(w.GetImportedPage(reader, i), 0, 0);
}
final.Close();

说“我正在使用DocumentPdfWriterPdfImportedPageAddTemplate 复制文件,为什么我的文件大小会增加?”就像在问“我被一把锋利的刀刺穿了自己的腹部,为什么我会流血?”

如果您想为现有文档添加页码,您必须使用PdfStamper,如chapter 6 of my book 中所述。

你想manipulate an existing PDF,更具体地说,你想在页脚中添加页码。这样做是这样的:

PdfReader reader = new PdfReader(outputFile);
using (FileStream fs = new FileStream(secondFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
    using (PdfStamper stamper = new PdfStamper(reader, fs)) {
        int PageCount = reader.NumberOfPages;
        for (int i = 1; i <= PageCount; i++) {
            ColumnText.ShowTextAligned(stamper.GetOverContent(i), Element.ALIGN_CENTER, new Phrase(String.Format("Page {0} of {1}", i, PageCount)), 560, 725, 270);
        }
    }
}

一些备注:

  • 您正在使用绝对坐标(X = 560,Y = 725)。最好使用官方文档中描述的相对于页面大小的坐标:How to position text relative to page?
  • 您正在使用BeginText() ... EndText(),但您可能更容易使用ColumnText.ShowTextAligned()
  • 当您创建像这样的BaseFont.CreateFont("C:\\windows\\Fonts\\times.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)BaseFont 时,您认为您正在使用未嵌入的字体。这不是真的。如文档所述,BaseFont.NOT_EMBEDDED 在使用 BaseFont.IDENTITY_H 时会被忽略。见Why is iText embedding a font even when I specify not to embed?如果需要小文件,建议不要嵌入字体。

您的代码的主要问题是您没有以正确的方式操作文件。我认为这是由于您从写得不好的教程中复制/粘贴了代码。请不要从不知道自己在做什么的人那里复制代码。

【讨论】:

  • 我根据你的例子改变了我的代码,但是结果文件大小是一样的。
  • @Razvan 请分享您的确切当前代码和您输入的 PDF,以便我们重现您的问题。
猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2011-03-21
  • 2018-04-08
  • 2015-05-06
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多