2011-11-17 60 views
2

这里是我的代码:如何使用TStreamWriter和TStreamReader读取和写入PDF文件?

procedure TForm1.Button2Click(Sender: TObject); 
var 
    Reader: TStreamReader; 
    Writer: TStreamWriter; 
begin 
    Reader := TStreamReader.Create('D:\Downloads\cover.pdf', TEncoding.UTF8, False); 
    try 
    Writer := TStreamWriter.Create('D:\Downloads\coverb.pdf', False, TEncoding.UTF8); 
    try 
     Writer.Write(Reader.ReadToEnd()); 
    finally 
     Writer.Free; 
     ShowMessage('Berhasil'); 
    end; 
    finally 
    Reader.Free(); 
    end; 
end; 

使用上面的代码,Reader.ReadToEnd(),我没有字符串,coverb.pdf是空的。

我正在使用Delphi XE。

+0

实际上,我想要得到下一个进程的pdf内容。不只是复制原始pdf。 –

+1

我想我们已经回答了这个问题。你在评论中添加的内容是一个全新的问题! –

回答

2

如果该文件不是空的,但ReadToEnd()返回一个空字符串,则用于将文件字节解码为Unicode的TEncoding对象遇到转换错误。 RTL不会在字符串转换错误上引发异常。如果您只想制作一份完整的文件副本,请使用CopyFile()或使用TFileStreamTStream.CopyFrom()方法。

3

PDF文件通常是压缩的二进制文件,因此无法读取为UTF8。这样做会导致编解码器错误。请记住,并非所有字节序列都是有效的UTF8序列。

它看起来像你只需要调用CopyFile而不是你复杂的基于流的代码,但也许这只是一个减少样本。

0

您可以使用Embarcadero的ReadAllText功能。像这样:

Uses IOUtils; 

TFile.ReadAllText(FileName); 

它会正确检测ANSI,Unicode和二进制文件。