itext 将文本添加到 pdf 增加文件大小
itext add text to pdf increase file size
我有一个 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 文件。
这是完全错误的:
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();
说 "I am copying a file using Document
, PdfWriter
, PdfImportedPage
and AddTemplate
, why does my file size increase?" 就像在问 "I've stabbed myself in the belly with a sharp knife, why do I bleed?"
如果要向现有文档添加页码,则必须使用 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
这样的 BaseFont.CreateFont("C:\windows\Fonts\times.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)
时,您认为您使用的是未嵌入的字体。这不是真的。如文档所述,使用 BaseFont.IDENTITY_H
时会忽略 BaseFont.NOT_EMBEDDED
。参见 Why is iText embedding a font even when I specify not to embed? 如果需要较小的文件大小,建议您不要嵌入字体。
您的代码的主要问题是您没有以正确的方式操作文件。我认为这是因为您 copy/pasted 您的代码来自一个编写糟糕的教程。请不要从不知道自己在做什么的人那里复制代码。
我有一个 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 文件。
这是完全错误的:
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();
说 "I am copying a file using Document
, PdfWriter
, PdfImportedPage
and AddTemplate
, why does my file size increase?" 就像在问 "I've stabbed myself in the belly with a sharp knife, why do I bleed?"
如果要向现有文档添加页码,则必须使用 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
这样的BaseFont.CreateFont("C:\windows\Fonts\times.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)
时,您认为您使用的是未嵌入的字体。这不是真的。如文档所述,使用BaseFont.IDENTITY_H
时会忽略BaseFont.NOT_EMBEDDED
。参见 Why is iText embedding a font even when I specify not to embed? 如果需要较小的文件大小,建议您不要嵌入字体。
您的代码的主要问题是您没有以正确的方式操作文件。我认为这是因为您 copy/pasted 您的代码来自一个编写糟糕的教程。请不要从不知道自己在做什么的人那里复制代码。