当前位置: 首页 > 知识库问答 >
问题:

飞碟:为输出PDF设置自定义DPI

梁丘扬
2023-03-14

我正在使用飞碟的HTML到PDF转换。我需要生产一个输出PDF与600dpi的字母大小。我怎样才能做到这一点呢?

共有2个答案

司徒隐水
2023-03-14

有四个不同的因素在起作用,它们都是相互关联的:

您希望页面度量是正确的,这样当您要求飞碟生成一个“字母”大小的页面时,生成的PDF将在Acrobat中显示为8.5“x 11”大小。您可以通过在CSS中指定page-size属性直接在FS中配置页面大小,正如obourgain在另一个答案中所指出的:@page{size:letter;}

您希望最终输出适合在某些打印机上以特定的XXX dpi进行打印。这是很好的,但请记住PDF(大部分)是一种矢量格式。我没有检查规范,但据我所知,PDF文件/页面没有“具有”分辨率,因为它们是基于矢量的。话虽这么说,放在页面里面的东西有一个有效的分辨率,所以我们需要你想要的XXX dpi数字来计算下面的数字。

在飞碟(和Java)的世界里,一个点总是恒定的1/72英寸。句号。所以我们可以通过取所需的分辨率除以点的大小来计算每点的点数值。例如,如果您想要300 dpi输出:

  • 点数/点=300 dpi/72 ppi=300点/英寸/72点/英寸=300/72点/点=4.1666点/点

这不是一个神奇的数字,这个值与每点数的点数直接相关,也与您试图输入FlyingSaper的图形图像的预期分辨率直接相关。更具体地说,给定一个尺寸为xxy像素的图形图像,您需要决定您希望在PDF中呈现多大的图像。如果您使用的图像是为屏幕(web)使用准备的,那么您可能是以标准的96像素/英寸(因此96x96px的图像在PDF输出中将呈现为1英寸见方)开始的。

因此,我们可以很容易地计算每像素点,如下所示,同样假设我们需要300 dpi输出:

  • 每像素点数=每英寸点数(点)/每英寸像素(像素)
  • 每像素点数=300点/英寸/96像素/英寸=3.125点/像素

如果你采取这种方法,你的图像将是正确的大小,但他们不会是300 dpi打印质量,你正在寻找。那是因为你的图像没有足够高的分辨率开始。稍后再谈。

如果您只是按照其他答案中的建议直接调用sharedcontext#setdpi,很可能会得到错误的结果。这是因为在不改变分辨率(每英寸点数)的情况下改变每点点数是没有逻辑意义的。ITextRenderer构造函数setdpi(72*dotsPerPoint)进行固定调用,当它去创建新页面时,它还使用构造函数设置的dotsPerPoint值以点为单位计算正确的页面宽度。如果您通过调用setdpi在其眼皮底下更改了分辨率,那么最终将出现错误的页面大小。

正确的方法是使用我们上面计算的值创建一个新的ITextRenderer对象。如果我们想要300 dpi的输出,而我们有96 ppi的图像提供给它,我们可以调用:

ITextRenderer renderer = new ITextRenderer(4.1666f, 3);

注意,每像素点参数只接受整数,因此我们将3.125舍入到上面最接近的整数。然而...这两个数字之间的比值似乎很重要,所以要使最后一个参数成为整数,我们可以将这两个数字乘以8(产生整数的最低整数乘法器),得到33.3333和25。这也是我对飞碟来源中魔法“20”数字的来源的猜测。

此时,您的输出PDF看起来应该与您开始时差不多(假设您以前使用的是Flying Sapuer的默认96 ppi配置)。但现在我们知道了我们需要调优的参数,以使一切正常工作。

因此,我们已经验证了上述参数的工作目的,但我们的图像仍然是一个低的96 ppi。如果我们想以高分辨率打印这些东西,你所需要做的就是将图像交换为300 ppi版本,更改构造函数参数,然后就完成了,对吧?

也许吧。让我们来研究一下这些数字:

您预期的输出分辨率(300 dpi)没有改变,因此每点的点数仍然是4.1666。但是输入图像现在是300 ppi,所以每像素点=300点/英寸/300像素/英寸=1点/像素。所以现在您将像这样调用构造函数:

ITextRenderer renderer = new ITextRenderer(4.1666f, 1);

一旦你这样做,你的新的300像素x 300像素图像将结束为1“正方形在PDF上,这正是您想要的打印质量。

飞碟使用每像素点的测量来转换许多东西,而不仅仅是图像。特别是,如果您在样式表中指定了任何使用像素的内容,那么每像素点的度量也会对它们的大小产生影响。

如果您有font-size:10px;这样的样式表规则,那么增加提供给构造函数的每像素点数会使文本变小,这可能也不是您想要的。毕竟,你应该能够增加图像的分辨率,在您的PDF中,同时留下您的文本在相同的大小和位置。

答案是将样式表中的所有内容转换为使用点。(或英寸。至少不是像素!)如果你开始使用默认的飞碟设置(意味着像素是96 ppi),你只需要将你所有的“px”测量值转换成点。由于72点=1英寸,您需要将“px”更改为“pt”,并将该值乘以72/96。

例如,上面的font-size:10px;将变为font-size:7.5pt;。如果您希望与之前的内容保持一致,那么CSS中提到“px”(以及任何内联样式)的所有内容都必须用相同的转换方式更改为“pt”。

一旦您做了这个更改,您的文本和其他布局将保持一致,并且如果您决定以后需要600 dpi的输出,您可以只调整您的图像并更改构造函数参数,但布局的其余部分仍将保持不变。搞定了!

南宫博简
2023-03-14

您可以在HTML文档中使用CSS页面大小属性设置字母大小:

   @page {
      size: letter;
    }

可以使用以下ITExtrenderer构造函数更改文档的dpi:

public ITextRenderer(float dotsPerPoint, int dotsPerPixel)

我不明白这些值到底代表什么,但是默认值是dotsperpoint=20f*4f/3fdotsperpixel=20,它将输出一个96dpi的文档。

要获得600dpi,可以使用dotsperpoint=500f/3fdotsperpixel=20

查看ITextRenderer的代码,最终的dpi由公式给出:dpi=dotsPerPoint*72/dotsperpixel

 类似资料:
  • 我有一个用飞碟生成的工作PDF。然而,当我现在想添加自定义字体时,生成的PDF会损坏。浏览器没有下载文件,而是显示各种奇怪的符号。 通过在类路径上添加ttf字体文件并调用来添加自定义字体: 并在CSS中指定字体:

  • 这是一个例外。。 Java语言lang.ClassCastException:org。XHTMLender。提供BlockBox无法转换为组织。XHTMLender。牛顿表。桌子盒

  • 我有一个jsp文件,我喜欢使用飞碟将其转换为PDF。以下是jsp文件: 以下是我用于将html解析为pdf的servlet代码: } } 我有个例外 有人能帮我吗?有没有可能从这种html页面创建pdf

  • 我使用的罐子来自maven repo 我正在测试的代码来自以前的堆栈解决方案 我担心它可能过时了,因为图书馆被贬值了。测试以下代码时: 这一行我有以下错误:

  • 除此之外,是否有一种方法可以更改输出文件名? 这是到目前为止的代码:

  • 我正在使用飞碟生成pdf文件。我想要第一页,第二页是横向模式,其余的是纵向模式。所以,我这样做: 但是它会自动在第一个pdf文件中创建2个空白页?如何修复它?