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

Delphi 如何使用TStreamWriter和TStreamReader读写PDF文件?,delphi,pdf,delphi-xe,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:\Downlo

这是我的密码:

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。

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

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


看起来您只需要调用CopyFile而不是复杂的基于流的代码,但这可能只是一个简化的示例。

您可以使用Embarcadero的ReadAllText函数。像这样:

Uses IOUtils;

TFile.ReadAllText(FileName);

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

事实上,我想在下一个过程中更改pdf的内容。我想我们已经回答了这个问题。你在评论中添加的内容是一个全新的问题!