Xin nhờ các pro giúp đở về đếm trang pdf rồi viết ra exel (1 người xem)

  • Thread starter Thread starter hvhvpdk
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

hvhvpdk

Thành viên mới
Tham gia
28/11/13
Bài viết
41
Được thích
3
Hiện tại em có một số lượng nhiều file pdf. Vấn đề ở chổ giờ muốn đếm số lượng trang của mỗi file (gồm cả file tên tiếng Việt) rồi nghi dữ liệu ra file exel tương tự như file mẫu em có tải lên. Tất cả các file đều nằm trong 1 folder duy nhất, số trang = số trang A3*2 + số trang A4. Do số lượng quá nhiều nên mong các pro giúp đỡ ạ.
 

File đính kèm

Lần chỉnh sửa cuối:
Hiện tại em có một số lượng nhiều file pdf. Vấn đề ở chổ giờ muốn đếm số lượng trang của mỗi file (gồm cả file tên tiếng Việt) rồi nghi dữ liệu ra file exel tương tự như file mẫu em có tải lên. Do số lượng quá nhiều nên mong các pro giúp đỡ ạ.
Chẳng hiểu bạn muốn làm gì? Nhưng cũng góp ý cho bạn như sau:
Bạn nên nêu rõ thực trạng các Folder chứa File PDF.
1/ Tất File PDF chỉ nằm trong Folder duy nhất.
2/ Folder cha chứa các Folder con (ví dụ: 1 Folder tỉnh chứa 11 Folder huyện), mỗi Folder huyện chứa tất cả File PDF riêng huyện đó.
3/ Folder cha chứa các Folder con và Folder con chứa các Folder cháu (Folder tỉnh chứa huyện, mỗi Folder huyện chứa Folder các xã.
 
Lần chỉnh sửa cuối:
Upvote 0
Hiện tại em có một số lượng nhiều file pdf. Vấn đề ở chổ giờ muốn đếm số lượng trang của mỗi file (gồm cả file tên tiếng Việt) rồi nghi dữ liệu ra file exel tương tự như file mẫu em có tải lên. Do số lượng quá nhiều nên mong các pro giúp đỡ ạ.
Không biết phân biệt A3, A4 như thế nào, bạn chạy code này thử xem:
PHP:
Sub countpagepdf()
Dim strpdf As String, i As Long, spath As String, arr, result
arr = Range("A2:b" & [A100000].End(xlUp).Row)
ReDim result(1 To UBound(arr), 1 To 1)
With CreateObject("VBscript.RegExp")
    For i = 1 To UBound(arr)
        .Pattern = "/Count (\d+).*/Kids\[[^\]]+\]"
        Open arr(i, 1) & arr(i, 2) For Binary As #1
        strpdf = Space(LOF(1)): Get #1, , strpdf: Close #1
        If .test(strpdf) Then result(i, 1) = .Execute(strpdf)(0).submatches(0)
    Next i
    [d2].Resize(UBound(result), 1) = result
End With
End Sub
 
Upvote 0
Hiện tại em có một số lượng nhiều file pdf. Vấn đề ở chổ giờ muốn đếm số lượng trang của mỗi file (gồm cả file tên tiếng Việt) rồi nghi dữ liệu ra file exel tương tự như file mẫu em có tải lên. Do số lượng quá nhiều nên mong các pro giúp đỡ ạ.
thấy có code này cũng dùng được:
Mã:
Function PDFPages(ByVal PDF_File As String) As Long
  Dim FileNum As Long
  Dim strRetVal As String
  With CreateObject("VBscript.RegExp")
    .Global = True
    .Pattern = "/Type\s*/Page[^s]"
    FileNum = FreeFile
    Open PDF_File For Binary As #FileNum
      strRetVal = Space(LOF(FileNum))
      Get #FileNum, , strRetVal
    Close #FileNum
    PDFPages = .Execute(strRetVal).Count
  End With
End Function
gõ vào D2 công thức: =PDFPages(A2&B2) rồi kéo fill xuống
 
Upvote 0
Mình thử code ở hai bải trên (#3, #4) thì có file pdf thì trả về đúng số trang, có file pdf thì không trả về gì (code #3) / trả về 0 (code #4).

Không biết các code trên có phân biệt thuộc tính gì của file pdf cần lấy thông tin số trang không?

Đây là file pdf trả về không đúng số trang.
https://esphomelib.com/_static/esphomelib.pdf
 
Upvote 0
Mình thử code ở hai bải trên (#3, #4) thì có file pdf thì trả về đúng số trang, có file pdf thì không trả về gì (code #3) / trả về 0 (code #4).

Không biết các code trên có phân biệt thuộc tính gì của file pdf cần lấy thông tin số trang không?

Đây là file pdf trả về không đúng số trang.
https://esphomelib.com/_static/esphomelib.pdf
Code hên xui bạn, sau khi gửi mới thấy, mấy file tiếng việt nhằm khi lấy cũng không được, chủ yếu là tìm trong chuỗi trả về không có thì chịu, hi vọng giúp được phần nào cho bạn chủ topic.
 
Upvote 0
Code hên xui bạn, sau khi gửi mới thấy, mấy file tiếng việt nhằm khi lấy cũng không được, chủ yếu là tìm trong chuỗi trả về không có thì chịu, hi vọng giúp được phần nào cho bạn chủ topic.
Xử lý đường dẫn là tiếng Việt có dấu thì có thể dùng FileSystemObject.
Theo hướng 'Opening a Resource for Binary Editing', hôm qua mình tìm thấy có nhiều bài nhưng chạy thử thì bị tình trạng như trên...
Chắc đợi anh nào đó vào xử cái này. :)
 
Upvote 0
.
Bài đã được tự động gộp:

Chẳng hiểu bạn muốn làm gì? Nhưng cũng góp ý cho bạn như sau:
Bạn nên nêu rõ thực trạng các Folder chứa File PDF.
1/ Tất File PDF chỉ nằm trong Folder duy nhất.
2/ Folder cha chứa các Folder con (ví dụ: 1 Folder tỉnh chứa 11 Folder huyện), mỗi Folder huyện chứa tất cả File PDF riêng huyện đó.
3/ Folder cha chứa các Folder con và Folder con chứa các Folder cháu (Folder tỉnh chứa huyện, mỗi Folder huyện chứa Folder các xã.
Tất cả các file nằm trong 1 folder duy nhất ạ. Xin cảm ơn pro
Bài đã được tự động gộp:

thấy có code này cũng dùng được:
Mã:
Function PDFPages(ByVal PDF_File As String) As Long
  Dim FileNum As Long
  Dim strRetVal As String
  With CreateObject("VBscript.RegExp")
    .Global = True
    .Pattern = "/Type\s*/Page[^s]"
    FileNum = FreeFile
    Open PDF_File For Binary As #FileNum
      strRetVal = Space(LOF(FileNum))
      Get #FileNum, , strRetVal
    Close #FileNum
    PDFPages = .Execute(strRetVal).Count
  End With
End Function
gõ vào D2 công thức: =PDFPages(A2&B2) rồi kéo fill xuống
Code này không phân biệt được A3, A4 ạ. Vì tổng số trang = số trang A3x2 + số trang A4. Xin cảm ơn pro
 
Lần chỉnh sửa cuối:
Upvote 0
Hiện tại em có một số lượng nhiều file pdf. Vấn đề ở chổ giờ muốn đếm số lượng trang của mỗi file (gồm cả file tên tiếng Việt) rồi nghi dữ liệu ra file exel tương tự như file mẫu em có tải lên. Tất cả các file đều nằm trong 1 folder duy nhất, tổng số trang = số trang A3*2 + số trang A4. Do số lượng quá nhiều nên mong các pro giúp đỡ ạ. Em đang cần gấp.
 

File đính kèm

Upvote 0
Mã:
Sub Test()
    Dim MyPath As String, MyFile As String
    Dim i As Long
    MyPath = "C:\Users\acct.gaproject\Desktop\"
    MyFile = Dir(MyPath & Application.PathSeparator & "*.pdf", vbDirectory)
    Range("A:B").ClearContents
    Range("A1") = "File Name": Range("B1") = "Pages"
    Range("A1:B1").Font.Bold = True
    i = 1
    Do While MyFile <> ""
        i = i + 1
        Cells(i, 1) = MyFile
        Cells(i, 2) = GetPageNum(MyPath & Application.PathSeparator & MyFile)
        MyFile = Dir
    Loop
    Columns("A:B").AutoFit
    MsgBox "Total of " & i - 1 & " PDF files have been found" & vbCrLf _
           & " File names and corresponding count of pages have been written on " _
           & ActiveSheet.Name, vbInformation, "Report..."
End Sub
'
Function GetPageNum(PDF_File As String)
    'Haluk 19/10/2008
    Dim FileNum As Long
    Dim strRetVal As String
    Dim RegExp
    Set RegExp = CreateObject("VBscript.RegExp")
    RegExp.Global = True
    RegExp.Pattern = "/Type\s*/Page[^s]"
    FileNum = FreeFile
    Open PDF_File For Binary As #FileNum
        strRetVal = Space(LOF(FileNum))
        Get #FileNum, , strRetVal
    Close #FileNum
    GetPageNum = RegExp.Execute(strRetVal).Count
End Function

Code mình tìm trên mạng và test trên máy thấy OK rồi đó bạn.
 
Upvote 0
Mã:
Sub Test()
    Dim MyPath As String, MyFile As String
    Dim i As Long
    MyPath = "C:\Users\acct.gaproject\Desktop\"
    MyFile = Dir(MyPath & Application.PathSeparator & "*.pdf", vbDirectory)
    Range("A:B").ClearContents
    Range("A1") = "File Name": Range("B1") = "Pages"
    Range("A1:B1").Font.Bold = True
    i = 1
    Do While MyFile <> ""
        i = i + 1
        Cells(i, 1) = MyFile
        Cells(i, 2) = GetPageNum(MyPath & Application.PathSeparator & MyFile)
        MyFile = Dir
    Loop
    Columns("A:B").AutoFit
    MsgBox "Total of " & i - 1 & " PDF files have been found" & vbCrLf _
           & " File names and corresponding count of pages have been written on " _
           & ActiveSheet.Name, vbInformation, "Report..."
End Sub
'
Function GetPageNum(PDF_File As String)
    'Haluk 19/10/2008
    Dim FileNum As Long
    Dim strRetVal As String
    Dim RegExp
    Set RegExp = CreateObject("VBscript.RegExp")
    RegExp.Global = True
    RegExp.Pattern = "/Type\s*/Page[^s]"
    FileNum = FreeFile
    Open PDF_File For Binary As #FileNum
        strRetVal = Space(LOF(FileNum))
        Get #FileNum, , strRetVal
    Close #FileNum
    GetPageNum = RegExp.Execute(strRetVal).Count
End Function

Code mình tìm trên mạng và test trên máy thấy OK rồi đó bạn.
Code này không phân biệt được A3, A4 ạ. Vĩ dụ như file dưới thì em tính là 6 trang. Xin cám ơn pro
 

File đính kèm

Upvote 0
Khi cài đặt Acrobat pro sẽ có object quản lý file pdf, xác định trang in là A3 hay A4, chủ thớt nên tìm và cài đặt. Sử dụng open binary có lẽ không ra kết quả chính xác được.
 
Upvote 0
Khi cài đặt Acrobat pro sẽ có object quản lý file pdf, xác định trang in là A3 hay A4, chủ thớt nên tìm và cài đặt. Sử dụng open binary có lẽ không ra kết quả chính xác được.
Vâng. Xin cám ơn pro.
Khi cài đặt Acrobat pro sẽ có object quản lý file pdf, xác định trang in là A3 hay A4, chủ thớt nên tìm và cài đặt. Sử dụng open binary có lẽ không ra kết quả chính xác được.
Xin cám ơn pro.
Trong Acrobat pro có thư viện quản lý file pdf. Có thể lấy kích thước từng trang GetSize() (Gets a page's width and height). Và cũng có hướng đi là nếu width > height thì là trang A3, còn lại là A4. Em đã cài thử, nhưng thực sự không biết làm thế nào.
 
Upvote 0
Bạn khai báo 1 đối tượng AcroPDDoc, khởi tạo nó bằng lệnh New. Mở file bằng phương thức Open, tổng số trang dùng method GetNumPages, duyệt qua từng trang để lấy kích thước trang theo dpi rồi chia cho 72 được kích thước theo inch. Kích thước trang A3 là 11.69 x 16.54 inches, A4 là 8.27 x11.69.
Bạn tham khảo thêm link này
Get PDF page size
Kết hợp với code duyệt tất cả file ở trên chắc là được. Mình không viết cụ thể code được do mình dùng win 7 và 10 64 bit nên báo lỗi ngay khi dùng lệnh New để khởi tạo đối tượng. Bạn thử viết code khởi tạo đối tượng trên win 32 bit xem được không.
 
Upvote 0
Bạn khai báo 1 đối tượng AcroPDDoc, khởi tạo nó bằng lệnh New. Mở file bằng phương thức Open, tổng số trang dùng method GetNumPages, duyệt qua từng trang để lấy kích thước trang theo dpi rồi chia cho 72 được kích thước theo inch. Kích thước trang A3 là 11.69 x 16.54 inches, A4 là 8.27 x11.69.
Bạn tham khảo thêm link này
Get PDF page size
Kết hợp với code duyệt tất cả file ở trên chắc là được. Mình không viết cụ thể code được do mình dùng win 7 và 10 64 bit nên báo lỗi ngay khi dùng lệnh New để khởi tạo đối tượng. Bạn thử viết code khởi tạo đối tượng trên win 32 bit xem được không.
Xin cám ơn pro. Em là dân nghiệp dư, nên cũng chỉ viết đượng code để đếm số trang thôi chứ không đọc được từng trang một.
Sub Demtrang()

Dim i, j, st As Integer

Dim k As String

j = Range("A1", Range("A1").End(xlDown)).Count

Dim arc As Object

Set arc = New Acrobat.AcroPDDoc

For i = 2 To j Step 1

k = Cells(i, 1)

arc.Open (k)

st = arc.GetNumPages

Cells(i, 2) = st

arc.Close

Next i

End Sub
Em định dùng code này nhưng không biết cách nào.
Set PDFPage = Arc.AcquirePage(0).GetSize()
p1 = PDFPage.y / 72
p2 = PDFPage.x / 72
Và nếu p1 > p2 thì đếm nó là A3, còn lại là A4 (Vì trong mấy file pdf này em có crop trước rồi)

Mong pro giúp, em thấy trên win 64 vẩn chạy bình thường ạ. Xin chúc pro sức khỏe
 
Upvote 0
Bạn thử code này, copy file cùng folder với các file pdf cần đếm số trang. Trong VBA vào Tools - References chọn Adobe Acrobat library và Microsoft scripting runtime rồi chạy sub Main. Các kích thước x=595, y=842 ứng với A4 còn A3 gấp đôi A4 nên mình so sánh x+y với 1500 (giả định tất cả các trang của bạn đều là A3 hoặc A4). Mình chạy được trên máy win xp 32 bit, không biết 64 bit có chạy không.
Acrobat pro full
Mã:
Option Explicit
Public PDFDoc As AcroPDDoc, PDFPage As Object, A3&, A4&

Sub Main()
    Dim fso As FileSystemObject, fld As Folder, fil As File, s$, i&, Arr()
    Set fso = New FileSystemObject
    Set PDFDoc = New AcroPDDoc
    Set fld = fso.GetFolder(ThisWorkbook.Path)
    ReDim Arr(1 To 1000, 1 To 3)
    For Each fil In fld.Files
        s = fil.Name
        If Right(s, 4) = ".pdf" Then
            CountPagesPDF (ThisWorkbook.Path & "\" & s)
            i = i + 1
            Arr(i, 1) = s
            Arr(i, 2) = A3
            Arr(i, 3) = A4
        End If
    Next
    Range("A2:C" & Cells.Rows.Count).Clear
    Range("A2:C" & (i + 1)) = Arr
    Set PDFPage = Nothing
    Set PDFDoc = Nothing
    Set fso = Nothing
End Sub

Sub CountPagesPDF(FullFileName$)
    Dim i&, n&, x, y
    A3 = 0
    A4 = 0
    PDFDoc.Open (FullFileName)
    n = PDFDoc.GetNumPages
    For i = 0 To n - 1
        Set PDFPage = PDFDoc.AcquirePage(i)
        x = PDFPage.GetSize().x
        y = PDFPage.GetSize().y
        If x + y > 1500 Then A3 = A3 + 1 Else A4 = A4 + 1
    Next
    PDFDoc.Close
End Sub
 

File đính kèm

Upvote 0
Bạn thử code này, copy file cùng folder với các file pdf cần đếm số trang. Trong VBA vào Tools - References chọn Adobe Acrobat library và Microsoft scripting runtime rồi chạy sub Main. Các kích thước x=595, y=842 ứng với A4 còn A3 gấp đôi A4 nên mình so sánh x+y với 1500 (giả định tất cả các trang của bạn đều là A3 hoặc A4). Mình chạy được trên máy win xp 32 bit, không biết 64 bit có chạy không.
Acrobat pro full
Mã:
Option Explicit
Public PDFDoc As AcroPDDoc, PDFPage As Object, A3&, A4&

Sub Main()
    Dim fso As FileSystemObject, fld As Folder, fil As File, s$, i&, Arr()
    Set fso = New FileSystemObject
    Set PDFDoc = New AcroPDDoc
    Set fld = fso.GetFolder(ThisWorkbook.Path)
    ReDim Arr(1 To 1000, 1 To 3)
    For Each fil In fld.Files
        s = fil.Name
        If Right(s, 4) = ".pdf" Then
            CountPagesPDF (ThisWorkbook.Path & "\" & s)
            i = i + 1
            Arr(i, 1) = s
            Arr(i, 2) = A3
            Arr(i, 3) = A4
        End If
    Next
    Range("A2:C" & Cells.Rows.Count).Clear
    Range("A2:C" & (i + 1)) = Arr
    Set PDFPage = Nothing
    Set PDFDoc = Nothing
    Set fso = Nothing
End Sub

Sub CountPagesPDF(FullFileName$)
    Dim i&, n&, x, y
    A3 = 0
    A4 = 0
    PDFDoc.Open (FullFileName)
    n = PDFDoc.GetNumPages
    For i = 0 To n - 1
        Set PDFPage = PDFDoc.AcquirePage(i)
        x = PDFPage.GetSize().x
        y = PDFPage.GetSize().y
        If x + y > 1500 Then A3 = A3 + 1 Else A4 = A4 + 1
    Next
    PDFDoc.Close
End Sub
Xin cám ơn pro. Em đã làm được. Chúc pro sức khỏe
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom