渲染前使用 ABCPdf 调整页面大小(pdf 中的大图像)

Resize page with ABCPdf before rendering (huge images in the pdf)

当我尝试将 pdf 文件转换为单独的图像文件作为旧浏览器的后备时,我遇到了 ABCPdf 问题。

我有一些工作代码可以完美地呈现页面并将呈现的大小调整为所需的大小。现在,当 pdf 页面很大 w7681px x h10978px 时,我的问题就出现了。它几乎杀死了我的开发机器,部署机器甚至无法咀嚼文件。

我通常只是将页面 1 对 1 呈现为 pdf 页面,然后使用其他算法调整此图像的大小。这效率不高,因为 ABCPdf 需要大量功率来输出此图像。

我有以下代码:

    private byte[] GeneratePng(Doc pdfDoc, int dpi)
    {
        var useDpi = dpi;
        pdfDoc.Rendering.DotsPerInch = useDpi;
        pdfDoc.Rendering.SaveQuality = 100;
        pdfDoc.Rect.String = pdfDoc.CropBox.String;
        pdfDoc.Rendering.ResizeImages = true;

        int attemptCount = 0;

        for (;;)
        {
            try
            {
                return pdfDoc.Rendering.GetData("defineFileTypeDummyString.png");
            }
            catch
            {
                if (++attemptCount == 3) throw;
            }
        }
    }

我尝试了以下解决方案:

调整页面大小

pdfDoc.SetInfo(pdfDoc.Page, "/MediaBox:Rect", "0 0 200 300");

调整页面大小并输出。这似乎根本没有进行任何更改。

在渲染之前调整图像大小:

foreach (IndirectObject io in pdfDoc.ObjectSoup) {
  if (io is PixMap) {
    PixMap pm = (PixMap)io;
    pm.Realize(); // eliminate indexed color images
    pm.Resize(pm.Width / 4, pm.Height / 4);
  }
}

也没有做任何事情,仍然导致加载时间很长。

运行渲染前的缩小尺寸操作:

  using (ReduceSizeOperation op = new ReduceSizeOperation(pdfDoc))
    op.Compact(true);

也没有做任何事情。就直接去渲染了,搞了半天

有人可以帮我吗?也许给我指出一些 ABCPdf 大小调整算法或其他东西。

好的,所以我与 ABCPdf 的客户支持进行了交谈,他们给了我以下信息。

doc1.Read(originalPDF);

// Specify size of output page.  (This example scales the page, maintaining the aspect ratio,
// but you could set the MediaBox Height and Width to any desired value.)
doc2.MediaBox.Height = doc1.MediaBox.Height / 8;
doc2.MediaBox.Width = doc1.MediaBox.Width / 8;
doc2.Rect.SetRect(doc2.MediaBox);
doc2.Page = doc2.AddPage();

// Create the output image
doc2.AddImageDoc(doc1, 1, null);
doc2.Rendering.Save(savePath);

它应该与单页 PDF 一起使用,所以如果你有一个充满大图片的 pdf,那么你应该把它切碎。你可以按照我的其他 Q/A: Chop PDFs into single pages

他们在上面的代码中使用的渲染算法是 ABCPdf 自动检测到的,你不能自己控制它(他们告诉我我不想)。所以我相信他们的代码。至少我做了一个测试,质量看起来与 InterpolationMode.HighQualityBicubic 非常相似,只是在缩放时有所不同。所以我也不会太在意它。

最后,与渲染和调整大小相比,上面的代码使我的速度提高了大约 10 倍。所以如果你经常做这个操作,真的很值得。