Как читать и записывать PDF-файл, используя TStreamWriter и TStreamReader? - PullRequest
2 голосов
/ 17 ноября 2011

Вот мой код:

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 ]

3 голосов
/ 17 ноября 2011

PDF-файлы, как правило, представляют собой сжатые двоичные файлы и поэтому не могут быть прочитаны как UTF8. Это приведет к ошибкам кодека. Помните, что не все последовательности байтов являются действительными последовательностями UTF8.

Похоже, вам просто нужно вызвать CopyFile вместо вашего сложного потокового кода, но, возможно, это всего лишь сокращенный пример.

2 голосов
/ 17 ноября 2011

Если файл не пустой, но ReadToEnd() возвращает пустую строку, то объект TEncoding, используемый для декодирования байтов файла в Unicode, сталкивается с ошибками преобразования.RTL не вызывает исключение при ошибках преобразования строк.Если все, что вам нужно сделать, это сделать точную копию файла, используйте CopyFile() или TFileStream и метод TStream.CopyFrom().

0 голосов
/ 27 февраля 2014

Вы можете использовать функцию ReadAllText Embarcadero.Например:

Uses IOUtils;

TFile.ReadAllText(FileName);

Он будет правильно определять ANSI, Unicode и двоичные файлы.

...