1

我正在使用 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 中定义

4

1 回答 1

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。我还加入了规范示例所具有的传递函数,因为我不确定这是否会有所作为。它可以很容易地取出。

于 2010-03-12T01:09:40.687 回答