Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Экспорт pdf файла


Автор: Jonnik 31.1.2011, 00:10
Здравствуйте. Подскажите насчет следующего:
У меня есть множество файлов в pdf формате. Из этих файлов надо вытащить текст и рисунки, а затем это необходимо поместить в любую бд. Почитав форум наткнулся на использование компонента TAcroPDF, но я не нашел примера его использования. Может у кого то есть пример как можно вытащить текст и рисунки с использованием этого компонента или может кто то может предложить другой вариант?
Заранее спасибо.

Автор: bagos 2.2.2011, 03:33
вот методы:
Код

  TOLEBOOL        __fastcall LoadFile(BSTR fileName/*[in]*/); 
  void            __fastcall setShowToolbar(VARIANT_BOOL On/*[in]*/); 
  void            __fastcall gotoFirstPage(void); 
  void            __fastcall gotoLastPage(void); 
  void            __fastcall gotoNextPage(void); 
  void            __fastcall gotoPreviousPage(void); 
  void            __fastcall setCurrentPage(long n/*[in]*/); 
  void            __fastcall goForwardStack(void); 
  void            __fastcall goBackwardStack(void); 
  void            __fastcall setPageMode(BSTR pageMode/*[in]*/); 
  void            __fastcall setLayoutMode(BSTR layoutMode/*[in]*/); 
  void            __fastcall setNamedDest(BSTR namedDest/*[in]*/); 
  void            __fastcall Print(void); 
  void            __fastcall printWithDialog(void); 
  void            __fastcall setZoom(float percent/*[in]*/); 
  void            __fastcall setZoomScroll(float percent/*[in]*/, float left/*[in]*/, 
                                           float top/*[in]*/); 
  void            __fastcall setView(BSTR viewMode/*[in]*/); 
  void            __fastcall setViewScroll(BSTR viewMode/*[in]*/, float offset/*[in]*/); 
  void            __fastcall setViewRect(float left/*[in]*/, float top/*[in]*/, float width/*[in]*/, 
                                         float height/*[in]*/); 
  void            __fastcall printPages(long from/*[in]*/, long to/*[in]*/); 
  void            __fastcall printPagesFit(long from/*[in]*/, long to/*[in]*/, 
                                           VARIANT_BOOL shrinkToFit/*[in]*/); 
  void            __fastcall printAll(void); 
  void            __fastcall printAllFit(VARIANT_BOOL shrinkToFit/*[in]*/); 
  void            __fastcall setShowScrollbars(VARIANT_BOOL On/*[in]*/); 
  TVariant        __fastcall GetVersions(void); 
  void            __fastcall setCurrentHightlight(long a/*[in]*/, long b/*[in]*/, long c/*[in]*/, 
                                                  long d/*[in]*/); 
  void            __fastcall setCurrentHighlight(long a/*[in]*/, long b/*[in]*/, long c/*[in]*/, 
                                                 long d/*[in]*/); 



Автор: Данкинг 2.2.2011, 11:55
bagos, эти методы я видел в свойствах AcroPDF. Но как ими вытащить текст из .pdf? Просто у меня как раз вчера тоже был такой вопрос.

Автор: bagos 2.2.2011, 12:11
Данкинг, вы уверены что этот компонент впринципе позволяет выдирать текст и картинки?

Добавлено через 5 минут и 16 секунд
нашел в инете, может поможет
Код

var
  FH: Integer;
  PR: Integer;
  SL: TStringList;
  Data: string;
  Font: string;
  Color: string;
  Size: string;
  X1, Y1, X2, Y2, X3, Y3, X4, Y4: string;
  Text: string;
  X: Integer;
  IL: Integer;
  TextBlockLeft: Double;
  TextBlockTop: Double;
  PageNum: Integer;
  ImageData: string;
  ImageLeft, ImageTop, ImageWidth, ImageHeight: Double;

// Open the file in direct access mode and store the file handle
FH := QP.DAOpenFile('Xpod1228090001.pdf', '');

// Loop through all the pages
for PageNum := 1 to QP.DAGetPageCount(FH) do
begin
  // Start a new document
  QP.NewDocument;

  // Specify that images should be compressed
  QP.CompressImages(1);

  // Get a page reference to the current page
  PR := QP.DAFindPage(FH, PageNum);

  // Create a string list to hold the text data
  SL := TStringList.Create;
  try

    // Extract the text from the current page
    SL.Text := QP.DAExtractPageText(FH, PR, 4);

    // Add each block of text to the new documen
    for X := 0 to SL.Count - 1 do
    begin
      Data := SL[X];

      Font := Copy(Data, 1, Pos(',', Data) - 1);
      Delete(Data, 1, Length(Font) + 1);
      Color := Copy(Data, 1, Pos(',', Data) - 1);
      Delete(Data, 1, Length(Color) + 1);
      Size := Copy(Data, 1, Pos(',', Data) - 1);
      Delete(Data, 1, Length(Size) + 1);

      X1 := Copy(Data, 1, Pos(',', Data) - 1);
      Delete(Data, 1, Length(X1) + 1);
      Y1 := Copy(Data, 1, Pos(',', Data) - 1);
      Delete(Data, 1, Length(Y1) + 1);
      X2 := Copy(Data, 1, Pos(',', Data) - 1);
      Delete(Data, 1, Length(X2) + 1);
      Y2 := Copy(Data, 1, Pos(',', Data) - 1);
      Delete(Data, 1, Length(Y2) + 1);
      X3 := Copy(Data, 1, Pos(',', Data) - 1);
      Delete(Data, 1, Length(X3) + 1);
      Y3 := Copy(Data, 1, Pos(',', Data) - 1);
      Delete(Data, 1, Length(Y3) + 1);
      X4 := Copy(Data, 1, Pos(',', Data) - 1);
      Delete(Data, 1, Length(X4) + 1);
      Y4 := Copy(Data, 1, Pos(',', Data) - 1);
      Delete(Data, 1, Length(Y4) + 1);

      Text := Copy(Data, 2, Length(Data) - 2);

      // Replace the utf-8 encoded TM symbol with the
      // PDF WinAnsi character code
      if Pos(#226#132#162, Text) > 0 then
        Text := StringReplace(Text, #226#132#162, #153,
          [rfReplaceAll]);

      // Set the text size
      QP.SetTextSize(StrToFloat(Size));

      // Draw the text, shift up by the font's "descent" value
      QP.DrawText(StrToFloat(X1),
        StrToFloat(Y1) - QP.GetTextDescent,
        Text);
    end;
  finally
    SL.Free;
  end;

  // Find all the images on the page
  IL := QP.DAGetPageImageList(FH, PR);

  // Loop through all the images
  for X := 1 to QP.DAGetImageListCount(FH, IL) do
  begin

    // Read the image data
    ImageData := QP.DAGetImageDataToString(FH, IL, X);

    // Add the image data to the new document
    QP.AddImageFromString(ImageData, 0);

    // Determine the location and size of the image on the page
    ImageLeft := QP.DAGetImageDblProperty(FH, IL, X, 501);
    ImageTop := QP.DAGetImageDblProperty(FH, IL, X, 502);
    ImageWidth := QP.DAGetImageDblProperty(FH, IL, X, 503) -
      QP.DAGetImageDblProperty(FH, IL, X, 501);
    ImageHeight := QP.DAGetImageDblProperty(FH, IL, X, 502) -
      QP.DAGetImageDblProperty(FH, IL, X, 508);

    // Draw the image onto the new document's page
    QP.DrawImage(ImageLeft, ImageTop, ImageWidth, ImageHeight);

  end;  // End image loop

  // Compress the page description commands
  QP.CompressContent;

  // Save the file
  QP.SaveToFile('XPod-' + IntToStr(PageNum) + '.pdf');

  // Remove the document
  QP.RemoveDocument(QP.SelectedDocument);

end;  // End page loop


Добавлено через 7 минут и 23 секунды
компонент Quick PDF Library

Добавлено через 9 минут и 50 секунд
и если есть возможность то рекомендую использовать OCR Transym, только там ограничение, нельзя распознавать русский текст :(

Автор: Данкинг 2.2.2011, 16:03
Цитата(bagos @  2.2.2011,  12:11 Найти цитируемый пост)
Данкинг, вы уверены что этот компонент впринципе позволяет выдирать текст и картинки?

Нет, я потому и спросил. smile 
Цитата(bagos @  2.2.2011,  12:11 Найти цитируемый пост)
компонент Quick PDF Library

Поищу, спасибо. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)