Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5]      все
 Re: Открыть PDF из MemoryStream  [new]
Volzok
Member

Откуда:
Сообщений: 6
Квейд,

Cпасибо, думал, что достаточно AutoScroll:=true;
А Вы не пробовали сохранять страницу в Bitmap?
Что-то не пойму, что делаю не так, сохраняются файлы нулевого размера.
пробую и через RenderPageBitmap и RenderPageDevice.
  for i:=0 to PdfView.Pdf.PageCount-1 do
    begin
      Btmp:=TBitmap.Create;
      PdfView.Pdf.PageNumber:=i;
      PdfView.Pdf.LoadPage(i);
    //  PdfView.Pdf.RenderPageBitmap(Btmp.Canvas, PdfView.Pdf.Page ,0, 0,PdfView.Width, PdfView.Height, ro0, []);
      PdfView.Pdf.RenderPageDevice(GetDC(Btmp.Canvas.Handle), PdfView.Pdf.Page ,0, 0,PdfView.Width, PdfView.Height, ro0, []);
      Btmp.SaveToFile('c:\'+inttostr(i)+'.bmp');
      Btmp.Free;
    end;
28 фев 19, 10:12    [21821424]     Ответить | Цитировать Сообщить модератору
 Re: Открыть PDF из MemoryStream  [new]
Volzok
Member

Откуда:
Сообщений: 6
Volzok, Вроде разобрался, сделал так, все заработало

    
for i:=0 to PdfView.Pdf.PageCount-1 do
       begin
          Btmp:=TBitmap.Create;
          PdfView.Pdf.LoadPage(i);
          Paint;
          PdfView.SetSize;
          Btmp.Height:=PdfView.Height;
          Btmp.Width:=PdfView.Width;
          PdfView.Pdf.RenderPageDevice(Btmp.Canvas.Handle, PdfView.Pdf.Page ,0, 0,PdfView.Width, PdfView.Height, ro0, []);
          Btmp.SaveToFile('c:\bmp\'+inttostr(i)+'.bmp');
          Btmp.Free;
      end;
28 фев 19, 10:57    [21821480]     Ответить | Цитировать Сообщить модератору
 Re: Открыть PDF из MemoryStream  [new]
Volzok
Member

Откуда:
Сообщений: 6
andreymx
Гаджимурадов Рустам
https://github.com/ahausladen/PdfiumLib не подходит?
не хватает знаний для портирования на Д7


Нашел данную бибилиотеку портированную на Delphi7, вроде все работает. Если ещё требуется прикладываю.
Активирую так. все работает, полосы прокрутки при необходимости появляются, при передачи фокуса scrollbox крутит вертикальный скроллб с нажатым Шифт - вертикальный, с Контролом - меняется масштаб
  PdfView := TPdfControl.Create(nil);
  PdfView.SmoothScroll:=true;
  PdfView.Parent := ScrollBox;
  PdfView.Align:=alClient;
  ScrollBox.DoubleBuffered := false;
  PdfView.ScaleMode:=smZoom;

А вы не пробовали сами создавать PDF c помощью pdfium.dll?
У меня страницы создаются заданного размера, а вот наполнение страниц сделать не удается (текст, картинки bmp/jpg).
Вроде есть функция loadjpgfile, но не пойму как использовать.

К сообщению приложен файл (PDFium D7.7z - 38Kb) cкачать
6 мар 19, 15:58    [21826455]     Ответить | Цитировать Сообщить модератору
 Re: Открыть PDF из MemoryStream  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5208
Volzok,

я создавал PDF из битмапа так (использовался модуль vcl24NSPDFViewer)

function CreateSinglePageFromBitmap(const APDFFileName: string; APageWidth: Integer; ABitmap: TBitmap): Boolean;
type
  TPDFDocumentSaveOption = (dsoIncremental = 1, dsoNoIncremental = 2, dsoRemoveSecurity = 3);
const
  DEF_MAGICMULTIPLIER = 100.0 / 35.3;    // GRV possibly A4 format
var
  PDFBitmap: TPDFBitmap;
  PDFPageObject: TPDFPageObject;
  PDFDocument: TPDFDocument;
  PDFPage: TPDFPage;
  DocumentEngine: TPDFDocumentEngine;
  FirstScan: Pointer;
  FileStream: TFileStream;
  FileWrite: TPDFFileWriteEx;
  Bitmap: TBitmap;
  Delta: Double;
  LocalWidth: Double;
  LocalHeight: Double;

  procedure FlipVertical(ASource, ADest: TBitmap);   // GRV function needs to be checked
  var
    SourceRect, DestRect: TRect;
  begin
    ADest.PixelFormat := ASource.PixelFormat;
    ADest.SetSize(ASource.Width, ASource.Height);
    DestRect := Bounds(0, 0, ASource.Width, ASource.Height);
    SourceRect := Bounds(0, ASource.Height, ASource.Width, 0);
    ADest.Canvas.CopyRect(DestRect, ASource.Canvas, SourceRect)
  end;

begin
  Result := False;
  if (APageWidth > 0) and (ABitmap.PixelFormat = pf32bit) then
  begin
    DocumentEngine := TPDFDocumentEngine.Create;
    Bitmap := TBitmap.Create;
    FileStream := TFileStream.Create(APDFFileName, fmCreate or fmShareDenyWrite);
    with DocumentEngine do
      try
        if not Initialized or not CreateDocument then
          Exit;
        Delta := ABitmap.Width / ABitmap.Height;
        LocalWidth := APageWidth * DEF_MAGICMULTIPLIER;
        LocalHeight := LocalWidth / Delta;
        FlipVertical(ABitmap, Bitmap);
        PDFDocument := Document;
        with Functions do
        begin
          PDFPage := PageNew(PDFDocument, 0, LocalWidth, LocalHeight);
          PDFPageObject := NewImageObject(PDFDocument);
          FirstScan := Bitmap.ScanLine[Bitmap.Height - 1];
          PDFBitmap := BitmapCreateEx(Bitmap.Width, Bitmap.Height, 3, FirstScan, Bitmap.Width * 4);             // GRV possibly 4 is pf32bit
          ImageObjSetBitmap(@PDFPage, 1, PDFPageObject, PDFBitmap);
          if ImageObjSetMatrix(PDFPageObject, 1, 0, 0, 1, 0, 0) <> 0 then
          begin
            PageObjTransform(PDFPageObject, LocalWidth, 0, 0, LocalHeight, 0, 0);
            PageInsertObject(PDFPage, PDFPageObject);
            PageGenerateContent(PDFPage);
            with FileWrite do
            begin
              Inner.Version := 1;
              Inner.WriteBlock := @WriteBlockToStream;
              Stream := FileStream
            end;
            Result := SaveAsCopy(PDFDocument, @FileWrite, Ord(dsoRemoveSecurity)) <> 0
          end
        end
      finally
        FreeAndNil(DocumentEngine);
        FreeAndNil(Bitmap);
        FreeAndNil(FileStream)
      end
  end
end;
6 мар 19, 17:18    [21826583]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5]      все
Все форумы / Delphi Ответить