【问题标题】:PDF Disable Anti-alias on LinesPDF 在行上禁用抗锯齿
【发布时间】:2011-01-26 15:35:07
【问题描述】:

我正在使用 FPDF 创建动态生成的 PDF。

我的 PDF 在网格中需要许多完全水平/垂直的线,并且在渲染时它们是抗锯齿的,并且看起来非常模糊且客户无法接受。我需要删除文档中这些(或所有)行的抗锯齿。

我知道这是可能的,因为它在 adobe pdf 规范本身中正确显示 http://www.adobe.com/devnet/acrobat/pdfs/PDF32000_2008.pdf(警告:大文件) 请参阅第 2 页中的方框了解其外观。

如何复制此页面上显示的框?

-- 编辑--

%PDF-1.6
3 0 obj
<</Type /Page
/Parent 1 0 R
/Resources 2 0 R
/Contents 4 0 R>>
endobj
4 0 obj
<</Length 44>>
stream
2 J
1.00 w
20.00 821.89 m 200.00 821.89 l S

endstream
endobj
1 0 obj
<</Type /Pages
/Kids [3 0 R ]
/Count 1
/MediaBox [0 0 595.28 841.89]
>>
endobj
2 0 obj
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font <<
>>
/XObject <<
>>
>>
endobj
5 0 obj
<<
/Producer (FPDF 1.6)
/CreationDate (D:20100311190240)
>>
endobj
6 0 obj
<<
/Type /Catalog
/Pages 1 0 R
/OpenAction [3 0 R /FitH null]
/PageLayout /OneColumn
>>
endobj
xref
0 7
0000000000 65535 f 
0000000179 00000 n 
0000000266 00000 n 
0000000009 00000 n 
0000000087 00000 n 
0000000360 00000 n 
0000000435 00000 n 
trailer
<<
/Size 7
/Root 6 0 R
/Info 5 0 R
>>
startxref
538
%%EOF

这是一个非常简单的 PDF 文件,它绘制了一条线来显示我遇到的问题。我发现诀窍是添加这个:

/Type /ExtGState
/SA false

但我还不能让它工作。 SA 在上述 PDF 规范的 10.6.5 中定义

【问题讨论】:

  • 我在第 2 页或第 ii 页上都没有看到任何网格。在第二页,有一个简单的矩形框,你指的是这个吗?如果是这样,那与多行网格不太一样,也不会以相同的方式绘制,无论是在 pdf 规范中还是使用 fpdf (我会使用 Rect 方法来绘制基本矩形)。
  • Anthony:是的,这就是我所指的。我不能只画一个简单的网格。我需要绘制的网格非常复杂,我需要使用单独的线条来绘制。我试图说明的是,显示的内容没有抗锯齿。
  • 另外,根据我的回答,我查看了 pdf 规范中的抗锯齿功能,并且默认情况下唯一明确的开/关变量 (AntiAlias) 设置为 false。我检查了 FPDF 代码,那里没有提到抗锯齿,所以他们没有打开它。这意味着线条绘制功能(通常在 pdf 中)总是在没有关闭选项的情况下进行抗锯齿处理,或者他们将其称为其他东西,或者抗锯齿是由您正在做的事情触发的。如果您可以提供更具体的示例和输出示例,那将非常有帮助。
  • 它没有抗锯齿,因为矩形默认没有抗锯齿。既不或线条。我认为重叠可能会产生抗锯齿的外观或触发 pdf 阅读器添加它。你能提供一个示例输出的链接吗?
  • 我刚刚使用 fpdf 创建了一个井字游戏,但没有看到任何模糊性。同样,一个样本会很有帮助。

标签: pdf pdf-generation fpdf


【解决方案1】:

我没有确切的答案,但我知道这不仅仅是评论......

既然您已经熟悉 PDF 规范,那么您应该尝试以下方法:

弄清楚 fpdf 是如何绘制这些线条的。它输出的 pdf 文件可能是压缩的,因此您应该下载 pdftk 以解压缩它。您可以使用以下命令执行此操作:

 pdftk fpdf_output.pdf output fdf_readable.pdf uncompress

在文本编辑器中打开 pdf,查看线条的绘制方式是否与您正在查看的 PDF 规范中的示例相同。

如果不是,请查看 fpdf 用于绘制线条的方法是否具有抗锯齿选项(我的意思是在 PDF 规范中)。如果 fpdf 以相同的方式绘制它(或者如果他们的方式有选项),请尝试更改您的输出文档(在文本编辑器中)以关闭抗锯齿功能。如果在文本编辑器中编辑后无法打开文档,您可以运行:

 pdftk fdf_readable.pdf output fdf_fixed.pdf

它应该修复任何损坏的引用或字节数。

然后打开调整后的 pdf,看看它是否像你想要的那样。

这里有个坏消息:上面完成的唯一一件事是通过 fpdf 在后台使用的方法验证抗锯齿是否可行。如果可能,希望该功能已经存在,或者您可以提出功能请求,或者如果您非常有信心,您可以尝试扩展 fpdf 以包含某种antialias("true|false") 方法。如果他们用来绘制线条的方法与规范不同,并且没有关闭抗锯齿的选项,那么最好的选择可能是找到一个替代的 pdf 生成器,比如tcpdf,然后看看是否他们提供该功能。

更新

好的,我想首先指出我仍然没有看到模糊性。所以我不知道这是否真的解决了你的问题。但是我确实在您的示例中添加了自动笔画调整规则,并且 PDF 仍然打开。

为了不再发布整个 PDF,您可以通过以下方式更新示例代码:

.........
/Font <<
>>
/XObject <<
>>

//Start my edit right below this point in your example, so at line 31, add:

/ExtGState << /GS1 10 0 R
>>
>>
endobj
10 0 obj
<<
/Type /ExtGState
/SA true
/TR 11 0 R
>>
endobj
31 0 obj
<< /FunctionType 0
/Domain [0.0 1.0]
/Range [0.0 1.0]
/Size 2
/BitsPerSample 8
/Length 7
/Filter /ASCIIHexDecode
>>
stream
01 00 >
endstream
endobj
// Your code picks back up with:

5 0 obj
<<
/Producer (FPDF 1.6)

基本上我所做的只是添加了一个对主资源字典的字典对象引用,然后创建了实际的字典对象,并将笔画调整规则设置为 true。我还加入了规范示例所具有的传递函数,因为我不确定这是否会有所作为。很容易取出来。

【讨论】:

  • 我几乎可以肯定这里不需要 TR。我已经尝试了两种方法,但似乎没有什么不同,而且我能够找到一个没有它的工作示例。我已经尝试了与您以各种可以想象的方式所建议的完全相同的方法,但它只是不起作用。我在这里遗漏了一些微妙的东西,我会弄清楚的,但我感觉它超出了这个问题的范围。我将这个傻瓜标记为完成。感谢您在此 Anthony 上的时间/帮助。
  • 嗨,特拉维斯,这有点晚了,但你能解决问题吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2013-03-03
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
相关资源
最近更新 更多