podofo这个库加了水印之后保存的PDF文件大小会从100k到10M呢

您好,为什么用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就可以只嵌入使用的字体了。