您好,为什么用podofo这个库加了水印之后保存的PDF文件大小会比原先的要大几十倍从100k到10M呢,是哪里代码中需要设置一下吗?
void CPODOFOEXEDlg::WatermarkFile(const char* pszInFilename, const char* pszOutFilename, PdfString strWaterMark, PdfString strWaterMarkCS, PdfString URL,bool bLink)
{
printf("Running watermark test\n");
UpdateData(TRUE);
PdfMemDocument doc(pszInFilename, true);
PdfPainter painter;
PdfPage* pPage;
PdfRect rect;
CString strFontSize;
double dx= 2.0;
double dy= 2.0;
const PdfEncoding* pp = PdfEncodingFactory::GlobalIdentityEncodingInstance();
PdfFont* pFont = doc.CreateFont("Arial Unicode MS", false, new PdfIdentityEncoding(0, 0xffff, true));
cboFontSize.GetWindowText(strFontSize);
float fontsize = _wtof(strFontSize);
pFont->SetFontSize(fontsize);
double w, h;
for (int i = 0; i<doc.GetPageCount(); i++)
{
pPage = doc.GetPage(i);
w = pPage->GetPageSize().GetWidth();
h = pPage->GetPageSize().GetHeight();
if (!pPage)
{
PODOFO_RAISE_ERROR(ePdfError_InvalidHandle);
}
painter.SetPage(pPage);
painter.SetFont(pFont);
painter.SetColor(0.0, 0.0, 0.0);
painter.DrawText(3.0, w / 2 - 60.0, strWaterMark);
painter.DrawText(3.0, w / 2 - 30.0, strWaterMarkCS);
if (bLink)
{
painter.DrawText(dx, dy, PdfString(_T("淘宝链接")));
painter.SetColor(1.0, 1.0, 1.0);
painter.DrawText(dx, dy, URL);
}
painter.FinishPage();
}
painter.DrawText(3.0, w / 2 - 60.0, strWaterMark);
printf("writing document back\n");
doc.SetWriteMode(ePdfWriteMode_Compact);
doc.SetPdfVersion(ePdfVersion_1_7);
doc.WriteUpdate(pszOutFilename);
}
这个要从podofo的运行原理说起。
podofo中使用了xobject对象。
可以将xobj对象理解为一个图片,我们drawText其实是在xobj对象上画了一个bmp图片,再将xobj添加到pdf文章中。采用这种方法的话,文章存储空间肯定会变大的。
因此,不仅是drawText,podofo在drawImage时也会将pdf文档的存储空间变大很多。如果对pdf的文档存储空间不较敏感的话,只从最后形成的pdf文档的效果来看,这种方法并没有什么不好的。
悲伤的是,podofo似乎并不支持非xobj对象的方法绘制文字 和图像。
如果答主对pdf加完水印的存储空间很敏感的话,最好还是扎扎实实了解下pdf的格式协议,和podofo的源码,然后修改源码。
2020年5月7日 更新
PoDoFo中有一个选项,是选择嵌入字体,这是默认选项。如果不想文件变得这么大,可以修改这个选项,这样pdf的文件大小会变小。缺点是在linux中,会显示异常,因为没有相应的字体库
你图片多大? 不会10M吧
把图片压缩一下吧
这个问题我刚刚也遇到了,因为你嵌入了全量的字体。后来我发现了一个方法可以解决 创建字体的时候直接使用CreateFontSubset就可以只嵌入使用的字体了。