Ανανέωση ιστοσελίδας

Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια!

Απάντηση στο θέμα

 

Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #1  
Παλιά 05-07-26, 17:05
Όνομα: Πάκος
Έκδοση λογισμικού Office: Ms-Office 2016
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 17-12-2011
Περιοχή: Θεσσαλονικη
Μηνύματα: 173
Exclamation τοις πταιει;

εχω κανει μια βαση για ενα φιλο που την λειτουργει αρκετα χρονια, επειδη στην υπηρεσια του, κανανε καποιες αλλαγες προσθετοντας μια νεα γραμματοσειρα την ((inter), ενω η εκθεση εχει πεδια με εμπλουτισμενο κειμενο και ειναι ορατες οι μορφοποιησεις, κατα την εκτυπωση η σελιδα εκτυπωνεται σε απλη μορφη, δηλαδη οχι εντονα κ.λ.π.

Το ιδιο γινεται και στο word, τα εντονα τα εκτυπωνει απλα.

Στην access υπαρχει τροπος να διορθωθει με καποιο κωδικα η φταιει ο εκτυπωτης.

Αυτο συμβαινει μονο με την συγκεκριμενη γραμματοσειρα.
Απάντηση με παράθεση
  #2  
Παλιά 06-07-26, 02:30
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.037
Προεπιλογή

Μπορεί να είναι και θέμα licensing ή font deployment, όχι όμως απαραίτητα με την έννοια ότι η Inter ως γραμματοσειρά δεν έχει άδεια. Η Inter κανονικά είναι open-source γραμματοσειρά. Όμως σε εταιρικά περιβάλλοντα μπορεί να υπάρχουν font management συστήματα ή license/configuration αρχεία, όπου δηλώνονται συγκεκριμένα font variants.

Το είχα αντιμετωπίσει και εγώ σε εταιρικό περιβάλλον. Η Inter ήταν η επίσημη γραμματοσειρά βάσει style guide, αλλά σε exports προς PDF δεν λειτουργούσαν σωστά όλα τα variants, π.χ. Regular ή Bold. Στο Office φαινόταν σωστά, αλλά στο PDF ή όταν άνοιγε το PDF μέσα από browser, η γραμματοσειρά δεν αποδιδόταν σωστά ή γινόταν αντικατάσταση.

Άρα το ότι φαίνεται σωστά στην οθόνη δεν αποδεικνύει ότι θα εκτυπωθεί ή θα ενσωματωθεί σωστά στο PDF. Η οθόνη, το PDF export, ο browser και ο printer driver είναι διαφορετικά στάδια και μπορεί το καθένα να χειρίζεται διαφορετικά τη γραμματοσειρά.

Γι’ αυτό θα έψαχνα πρώτα αν υπάρχουν εγκατεστημένες πολλές εκδόσεις της Inter, αν χρησιμοποιείται variable font αντί για static fonts, και αν υπάρχουν πραγματικά στο σύστημα τα σωστά variants, δηλαδή Inter Regular, Inter Bold κλπ. Αν το ίδιο πρόβλημα εμφανίζεται και στο Word, τότε δεν είναι πρόβλημα της Access και δύσκολα λύνεται με VBA.

Προσωπικά δεν θα πρότεινα τη χρήση της Inter σε τέτοιες εκθέσεις. Πέρα από το πιθανό τεχνικό θέμα στην εκτύπωση, τη θεωρώ δύσκολη στην ανάγνωση, ειδικά σε reports με πολλά κείμενα και περιορισμένο ύψος γραμμών. Αν υπάρχει δυνατότητα, θα ήταν προτιμότερο να χρησιμοποιηθεί μια πιο ευανάγνωστη γραμματοσειρά, όπως Arial, Segoe UI, Calibri ή Aptos.

Φιλικά

Τάσος
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών
Απάντηση με παράθεση
  #3  
Παλιά 06-07-26, 07:00
Όνομα: Πάκος
Έκδοση λογισμικού Office: Ms-Office 2016
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 17-12-2011
Περιοχή: Θεσσαλονικη
Μηνύματα: 173
Προεπιλογή συνεχεια

Τασο ευχαριστω για την απαντηση,
δυστυχως την συγκεκριμενη στιγμη η inter ειναι επισημη γραμματοσειρα της υπηρεσιας.
Οταν αλαξει προφανως ο διευθυνωντας συμβουλος, θα αλαξει και η γραμματοσειρα
Απάντηση με παράθεση
  #4  
Παλιά 06-07-26, 08:26
Το avatar του χρήστη Tasos
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.037
Προεπιλογή

Καλημέρα,
Παρακάτω είναι ένα ενδεικτικό παράδειγμα εξαγωγής Access Report σε PDF.

Στο παράδειγμα ενεργοποιώ προσωρινά την επιλογή PDF/A. Δεν το κάνω επειδή είναι υποχρεωτικό για κάθε export, αλλά επειδή εδώ θέλουμε να ελέγξουμε αν το πρόβλημα με τη γραμματοσειρά σχετίζεται με το font embedding.

Το PDF/A είναι μορφή PDF για αρχειοθέτηση και προσπαθεί να δημιουργήσει ένα πιο αυτοτελές PDF, το οποίο να μπορεί να εμφανιστεί σωστά και σε άλλο υπολογιστή. Για αυτό συνήθως γίνεται πιο αυστηρή ενσωμάτωση των γραμματοσειρών μέσα στο PDF.

Άρα, αν το report φαίνεται σωστά στην οθόνη, αλλά στο PDF/A ή στην εκτύπωση συνεχίζει να χάνει τα Bold ή άλλα variants της Inter, τότε το πρόβλημα δεν φαίνεται να είναι στην Access ή στον συγκεκριμένο κώδικα. Πιθανότερα είναι θέμα της γραμματοσειράς, των εγκατεστημένων font variants, του font embedding, του PDF rendering ή του printer driver.

Με απλά λόγια: το PDF/A εδώ χρησιμοποιείται σαν διαγνωστική δοκιμή για να δούμε αν η Inter ενσωματώνεται σωστά στο PDF.

Κώδικας:
Option Compare Database
Option Explicit

Private Sub cmdEksagogiSePDF_Click()

    Const ONOMA_REPORT As String = "rptBEU"
    Const REG_PDF_A As String = "HKCU\Software\Microsoft\Office\16.0\Common\FixedFormat\LastISO19005-1"

    Dim diadromiTelikouPDF As String
    Dim diadromiProsorinouPDF As String
    Dim onomaProsorinouPDF As String
    Dim vasikoOnomaArxeiou As String
    Dim imerominiaOra As String

    Dim paliaTimiRegistry As Variant
    Dim ypirxePaliaTimiRegistry As Boolean

    Dim shellWindows As Object
    Dim systimaArxeion As Object

    Dim whereReport As String
    Dim openArgsReport As String

    On Error GoTo DiaxeirisiLathous

    Set shellWindows = CreateObject("WScript.Shell")
    Set systimaArxeion = CreateObject("Scripting.FileSystemObject")

    ' ------------------------------------------------------------
    ' Ελληνικό όνομα αρχείου για το PDF.
    ' Εδώ βάζουμε ένα ενδεικτικό όνομα για τη δοκιμή.
    ' ------------------------------------------------------------
    vasikoOnomaArxeiou = "Δοκιμή_γραμματοσειράς_Inter"

    If Len(Trim$(vasikoOnomaArxeiou)) > 0 Then
        vasikoOnomaArxeiou = KathariseOnomaArxeiou(vasikoOnomaArxeiou)
    Else
        vasikoOnomaArxeiou = "Αναφορά"
    End If

    ' ------------------------------------------------------------
    ' Αν θέλουμε φίλτρο στο report, το βάζουμε εδώ.
    '
    ' Παράδειγμα για αριθμητικό MainID:
    ' whereReport = "MainID=" & Me!MainID
    '
    ' Για απλό παράδειγμα χωρίς φίλτρο:
    ' ------------------------------------------------------------
    whereReport = vbNullString

    ' ------------------------------------------------------------
    ' Αν το report χρησιμοποιεί OpenArgs, τα βάζουμε εδώ.
    ' Αν δεν χρειάζονται, μπορεί να μείνει κενό.
    ' ------------------------------------------------------------
    openArgsReport = "hidden;0;()"

    ' ------------------------------------------------------------
    ' Κρατάμε την παλιά ρύθμιση PDF/A από το Registry,
    ' ώστε να την επαναφέρουμε μετά το export.
    ' ------------------------------------------------------------
    On Error Resume Next
    paliaTimiRegistry = shellWindows.RegRead(REG_PDF_A)
    ypirxePaliaTimiRegistry = (Err.Number = 0)
    Err.Clear
    On Error GoTo DiaxeirisiLathous

    ' ------------------------------------------------------------
    ' Ενεργοποιούμε προσωρινά το PDF/A.
    '
    ' Δεν είναι απαραίτητο για κάθε export.
    ' Εδώ το χρησιμοποιούμε σαν διαγνωστική δοκιμή
    ' για το πρόβλημα της γραμματοσειράς.
    '
    ' Το PDF/A προσπαθεί να δημιουργήσει πιο αυτοτελές PDF,
    ' όπου οι γραμματοσειρές πρέπει να ενσωματώνονται σωστά.
    '
    ' Αν ακόμα και με PDF/A χάνονται τα Bold ή άλλα variants
    ' της Inter, τότε το πρόβλημα πιθανότατα δεν είναι στην Access,
    ' αλλά στη γραμματοσειρά, στο font embedding, στο PDF rendering
    ' ή στον printer driver.
    ' ------------------------------------------------------------
    shellWindows.RegWrite REG_PDF_A, 1, "REG_DWORD"

    ' ------------------------------------------------------------
    ' Άνοιγμα του report σε Preview, αλλά κρυφό.
    ' Το ανοίγουμε πρώτα, ώστε το OutputTo να εξάγει
    ' ακριβώς αυτό το report.
    ' ------------------------------------------------------------
    DoCmd.OpenReport ONOMA_REPORT, acViewPreview, , whereReport, acHidden, openArgsReport

    ' ------------------------------------------------------------
    ' Δημιουργία μοναδικού ελληνικού ονόματος PDF
    ' με ημερομηνία και ώρα.
    ' ------------------------------------------------------------
    imerominiaOra = Format(Now, "yyyy-mm-dd_hh-nn-ss")

    onomaProsorinouPDF = vasikoOnomaArxeiou & _
                         "_Παράδειγμα_εκτύπωσης_PDF_" & _
                         imerominiaOra & ".pdf"

    ' ------------------------------------------------------------
    ' Επιλογή τελικής διαδρομής αποθήκευσης από τον χρήστη.
    ' ------------------------------------------------------------
    diadromiTelikouPDF = EpilogiDiadromisPDF(onomaProsorinouPDF)

    If Len(diadromiTelikouPDF) > 0 Then

        ' --------------------------------------------------------
        ' Δημιουργία προσωρινής διαδρομής PDF στον Temp φάκελο.
        ' 2 = TemporaryFolder
        ' --------------------------------------------------------
        diadromiProsorinouPDF = systimaArxeion.BuildPath( _
                                systimaArxeion.GetSpecialFolder(2), _
                                onomaProsorinouPDF)

        ' --------------------------------------------------------
        ' Αν υπάρχει ήδη προσωρινό αρχείο με το ίδιο όνομα,
        ' το διαγράφουμε.
        ' --------------------------------------------------------
        If systimaArxeion.FileExists(diadromiProsorinouPDF) Then
            systimaArxeion.DeleteFile diadromiProsorinouPDF, True
        End If

        ' --------------------------------------------------------
        ' Εξαγωγή του report σε προσωρινό PDF.
        ' --------------------------------------------------------
        DoCmd.OutputTo acOutputReport, ONOMA_REPORT, acFormatPDF, diadromiProsorinouPDF, False

        ' --------------------------------------------------------
        ' Αν υπάρχει ήδη τελικό PDF με το ίδιο όνομα,
        ' το αντικαθιστούμε.
        ' --------------------------------------------------------
        If systimaArxeion.FileExists(diadromiTelikouPDF) Then
            systimaArxeion.DeleteFile diadromiTelikouPDF, True
        End If

        ' --------------------------------------------------------
        ' Αντιγραφή του προσωρινού PDF στην τελική θέση.
        ' --------------------------------------------------------
        systimaArxeion.CopyFile diadromiProsorinouPDF, diadromiTelikouPDF, True

        ' --------------------------------------------------------
        ' Άνοιγμα του τελικού PDF.
        ' --------------------------------------------------------
        Application.FollowHyperlink diadromiTelikouPDF

    End If

Katharisma:
    On Error Resume Next

    ' ------------------------------------------------------------
    ' Κλείσιμο του report χωρίς αποθήκευση αλλαγών.
    ' ------------------------------------------------------------
    DoCmd.Close acReport, ONOMA_REPORT, acSaveNo

    ' ------------------------------------------------------------
    ' Διαγραφή προσωρινού PDF.
    ' ------------------------------------------------------------
    If Len(diadromiProsorinouPDF) > 0 Then
        If Not systimaArxeion Is Nothing Then
            If systimaArxeion.FileExists(diadromiProsorinouPDF) Then
                systimaArxeion.DeleteFile diadromiProsorinouPDF, True
            End If
        End If
    End If

    ' ------------------------------------------------------------
    ' Επαναφορά της παλιάς ρύθμισης PDF/A στο Registry.
    ' Αν πριν υπήρχε τιμή, την επαναφέρουμε.
    ' Αν δεν υπήρχε, διαγράφουμε τη δική μας προσωρινή τιμή.
    ' ------------------------------------------------------------
    If Not shellWindows Is Nothing Then
        If ypirxePaliaTimiRegistry Then
            shellWindows.RegWrite REG_PDF_A, paliaTimiRegistry, "REG_DWORD"
        Else
            shellWindows.RegDelete REG_PDF_A
        End If
    End If

    Set systimaArxeion = Nothing
    Set shellWindows = Nothing

    Exit Sub

DiaxeirisiLathous:
    MsgBox "Η εξαγωγή σε PDF απέτυχε:" & vbCrLf & _
           Err.Number & " - " & Err.Description, _
           vbExclamation, "Εξαγωγή PDF"

    Resume Katharisma

End Sub


Private Function EpilogiDiadromisPDF(ByVal proepilegmenoOnomaArxeiou As String) As String

    Const msoFileDialogSaveAs As Long = 2

    Dim dialogosApothikefsis As Object
    Dim epilegmeniDiadromi As String
    Dim fakelosDesktop As String

    On Error GoTo DiaxeirisiLathous

    fakelosDesktop = Environ$("USERPROFILE") & "\Desktop\"

    Set dialogosApothikefsis = Application.FileDialog(msoFileDialogSaveAs)

    With dialogosApothikefsis

        .Title = "Αποθήκευση παραδείγματος PDF"
        .InitialFileName = fakelosDesktop & proepilegmenoOnomaArxeiou

        If .Show = -1 Then

            epilegmeniDiadromi = .SelectedItems(1)

            ' Αν ο χρήστης δεν έβαλε κατάληξη .pdf,
            ' την προσθέτουμε αυτόματα.
            If LCase$(Right$(epilegmeniDiadromi, 4)) <> ".pdf" Then
                epilegmeniDiadromi = epilegmeniDiadromi & ".pdf"
            End If

            EpilogiDiadromisPDF = epilegmeniDiadromi

        Else

            ' Ο χρήστης πάτησε Cancel.
            EpilogiDiadromisPDF = vbNullString

        End If

    End With

    Set dialogosApothikefsis = Nothing
    Exit Function

DiaxeirisiLathous:
    EpilogiDiadromisPDF = vbNullString
    Set dialogosApothikefsis = Nothing

End Function


Private Function KathariseOnomaArxeiou(ByVal onomaArxeiou As String) As String

    Dim miEpitreptoiXaraktires As Variant
    Dim xaraktiras As Variant

    onomaArxeiou = Trim$(onomaArxeiou)

    ' Χαρακτήρες που δεν επιτρέπονται σε ονόματα αρχείων Windows.
    miEpitreptoiXaraktires = Array("\", "/", ":", "*", "?", """", "<", ">", "|")

    ' Αντικατάσταση μη επιτρεπτών χαρακτήρων με κάτω παύλα.
    For Each xaraktiras In miEpitreptoiXaraktires
        onomaArxeiou = Replace(onomaArxeiou, xaraktiras, "_")
    Next xaraktiras

    ' Αντικατάσταση αλλαγών γραμμής και tab.
    onomaArxeiou = Replace(onomaArxeiou, vbCrLf, "_")
    onomaArxeiou = Replace(onomaArxeiou, vbCr, "_")
    onomaArxeiou = Replace(onomaArxeiou, vbLf, "_")
    onomaArxeiou = Replace(onomaArxeiou, vbTab, "_")

    ' Αφαίρεση διπλών κάτω παυλών.
    Do While InStr(onomaArxeiou, "__") > 0
        onomaArxeiou = Replace(onomaArxeiou, "__", "_")
    Loop

    ' Αφαίρεση τελικής τελείας ή κενού,
    ' γιατί τα Windows δεν τα θέλουν στο τέλος ονόματος αρχείου.
    Do While Len(onomaArxeiou) > 0 And _
             (Right$(onomaArxeiou, 1) = "." Or Right$(onomaArxeiou, 1) = " ")
        onomaArxeiou = Left$(onomaArxeiou, Len(onomaArxeiou) - 1)
    Loop

    ' Αν μετά τον καθαρισμό έμεινε κενό,
    ' βάζουμε γενικό όνομα.
    If Len(onomaArxeiou) = 0 Then
        onomaArxeiou = "Αναφορά"
    End If

    ' Περιορισμός μήκους ονόματος.
    If Len(onomaArxeiou) > 120 Then
        onomaArxeiou = Left$(onomaArxeiou, 120)
    End If

    KathariseOnomaArxeiou = onomaArxeiou

End Function
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών
Απάντηση με παράθεση
Απάντηση στο θέμα


Δικαιώματα - Επιλογές
Δε μπορείτε να δημοσιεύσετε νέα μηνύματα
Δε μπορείτε να δημοσιεύσετε απαντήσεις
Δεν μπορείτε να επισυνάψετε αρχεία
Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας

Ο κώδικας ΒΒ είναι σε λειτουργία
Τα Smilies είναι σε λειτουργία
Ο κώδικας [IMG] είναι σε λειτουργία
Ο κώδικας HTML είναι εκτός λειτουργίας
Trackbacks are εκτός λειτουργίας
Pingbacks are εκτός λειτουργίας
Refbacks are εκτός λειτουργίας


Παρόμοια Θέματα

Θέμα Δημιουργός Forum Απαντήσεις Τελευταίο Μήνυμα
[Συναρτήσεις] Ποια συνάρτηση πρέπει να χρησιμοποιήσω για σύγκριση επι τοις % ανα έτος ? tolis_montana Excel - Ερωτήσεις / Απαντήσεις 7 18-01-17 00:04


Η ώρα είναι 22:44.