如何使用TStreamWriter和TStreamReader读写PDF文件?

时间:2011-11-17 03:23:02

标签: delphi pdf delphi-xe

这是我的代码:

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。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

Uses IOUtils;

TFile.ReadAllText(FileName);

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